ホラーゲームによくあるライトの実装をします。
まずは懐中電灯の実装ということで、下のURLを参考に行なっていきます。
参考URL:https://gametukurikata.com/light/flashlight
Unityに初めからついているDirection Lightがついているとライトの機能の確認が難しいので、チェックを外して世界を暗闇にします。
また、そのままだと、懐中電灯によるSpot Lightのみが光源となってしまうため、下のURLにあるPoint Lightをプレイヤーの場所に設置します。
ライトの種類参考URL:https://creator.cluster.mu/2020/04/15/unity-light/
ホラーゲームっぽくなってきました。
次に、カメラを今の3人称視点から一人称視点に変更します。
参考URL:https://codegenius.org/open/courses/24/sections/117
とりあえず一人称視点とすることができました。あとはMain Cameraを基準としたプレイヤーの動きの変更とカメラアングルの変更コードを書いていきます。
Vector3 tmp = player.transform.position; // Playerの位置情報を取得
Vector3 cam = new Vector3(tmp.x, tmp.y + 1.2f, tmp.z);
this.transform.position = cam;
ここで、参考URLではプレイヤーとカメラに親子関係を持たせていますが、このゲームでの実装ではカメラとプレイヤーを別々のオブジェクトとして、カメラは単純にプレイヤーの位置を追従するようにします。
Vector3 angle = this.transform.eulerAngles; // 現在のカメラアングル
if (Input.GetKey(KeyCode.D)) { angle.x += Time.deltaTime * _positionStep; }
if (Input.GetKey(KeyCode.A)) { angle.x -= Time.deltaTime * _positionStep; }
if (Input.GetKey(KeyCode.E)) { angle.y += Time.deltaTime * _positionStep; }
if (Input.GetKey(KeyCode.Q)) { angle.y -= Time.deltaTime * _positionStep; }
this.transform.eulerAngles = angle; // カメラアングルの変更
カメラアングルの変更はDAEQで行うようにしました。
また、一人称にするとプレイヤーがチラチラカメラに写ってしまい目障りなので、プレイヤーオブジェクトはカメラに映らないようにします。
参考URL:https://teratail.com/questions/155158
原因不明ですが、SubCameraを使用すると十字キーでプレイヤーを移動した時に床をすり抜けるバグが発生したので、Main Cameraを一人称視点にしました。
また、Main CameraにSpot Lightを親子関係にしたらうまく動作しなかったので、Spot Lightは個別のオブジェクトとしてプレイヤーの位置とカメラの角度を追うようにしました。
private GameObject cameraObject;
private GameObject player;
void Start() {
cameraObject = GameObject.Find("Main Camera");
player = GameObject.FindWithTag("Player");
}
void Update() {
Vector3 tmp = player.transform.position;
Vector3 light = new Vector3(tmp.x, tmp.y + 1.2f, tmp.z);
this.transform.position = light;
this.transform.forward = cameraObject.transform.forward;
}
これで、できたものが以下となります。
割と不具合が多く大変でした。