FPSプレイヤーのカメラから、アニメーション付きのカメラに切り替えて、アニメーションが終わったらプレイヤーのカメラに戻してみました。
まずシーンにあるプレイヤーを一旦非アクティブにして、カメラを新規作成しました。
カメラが選択されている状態で、AnimationウィンドウのCreateボタンを押します。
アニメーションクリップに名前を付けて保存し、キーフレームを追加していきます。
シークバーを動かして録画ボタンを押し、カメラの位置や回転を録画ボタンを再度押すと、そのタイミングでその位置や回転になるようなアニメーションを付けられます。
このときに、カメラを選択してCtrl + Shift + Fを押すと、シーンビューと同じ画面が見えるようにカメラが移動するので、Animationウィンドウのシークバーを動かして録画ボタンを押し、シーンビューで視点を移動して、Ctrl + Shift + Fを押して再度録画ボタンを押し、またシークバーを動かしてと繰り返すことで簡単にアニメーションが作れます。
アニメーションができたら、アニメーションの終わりあたりにシークバーを動かして、+のついたシグナルのマークをクリックします。ここでアニメーションの終了メソッドを呼びたいので、そのためのスクリプトをこのカメラに付けました。
プレイヤーのAudioListenerコンポーネントもここでオフにするか、アニメ付きカメラの方に付けないようにします。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class AnimatedCamera : MonoBehaviour
{
public Camera PlayerCamera { get; set; }
void EndAnimation()
{
// カメラを削除
Destroy(gameObject);
// プレイヤーのカメラをオン
PlayerCamera.enabled = true;
// プレイヤーの操作を解放
DisplayMenuOperation.GetInstance().ReleasePlayer();
}
}
アニメーションが終了したらこのカメラを破壊してプレイヤーのカメラをオンにし、プレイヤーが操作可能にします。
プレイヤーの操作のロック/ロック解除は、メニューとカーソルを表示してプレイヤーの移動回転を止めるで作ったスクリプトを使っています。ロック/ロック解除の部分を別のメソッドに分けて、プレイヤーの操作はロックするけどカーソルのロックは解除しないメソッドを追加しています。
public void LockPlayer()
{
playerScript.LockPosition(true); // プレイヤーの位置を固定
cameraScript.LockRotation(true); // 回転を固定
cameraScript.LockCursor(false); // カーソルロックを解除
}
public void ReleasePlayer()
{
playerScript.LockPosition(false); // プレイヤーの移動を自由にする
cameraScript.LockRotation(false); // 回転を自由にする
cameraScript.LockCursor(true); // カーソルをロック
}
public void LockPlayerLockCursor()
{
playerScript.LockPosition(true); // プレイヤーの位置を固定
cameraScript.LockRotation(true); // 回転を固定
}
そして、他のクラスでこのカメラの作成やプレイヤーのロックなどをします。
[SerializeField] AnimatedCamera animaterdCameraPrefab;
// Update is called once per frame
void Update()
{
if(Input.GetKeyDown(KeyCode.R))
{
// プレイヤーのカメラをオフ
Camera playerCamera = Camera.main;
playerCamera.enabled = false;
// プレイヤーの操作をロック
DisplayMenuOperation.GetInstance().LockPlayerLockCursor();
// アニメ付きカメラを生成
AnimatedCamera ac = Instantiate(animaterdCameraPrefab.gameObject).GetComponent<AnimatedCamera>();
// プレイヤーのカメラを記憶させる
ac.PlayerCamera = playerCamera;
}
これで、プレイヤーのカメラの切り替えができました。
しかし、切り替わる時に瞬時にカメラの位置や回転が変わるので、指定の位置に一旦移動回転してから切り替えるなどの工夫が必要かもしれません。