
[Unity] カメラリセットの実装
今回は、カメラリセット機能についてのメモです。
TPSなどで、常にプレイヤーの向いている方向にカメラが向いてしまうと、相手を捉え続けられてないので、やっぱりカメラリセットは必須かなと。
そこで、実装を考えてみました。
考え方としては、プレイヤーの位置を基準(原点)に、相対的なカメラの位置を算出していきます。手書きでお見苦しいですが、以下の図1のように考えました。

簡単に言うと、
カメラの水平位置は、進行方向の真逆にある。どのくらい遠いかはお好みで
カメラの垂直位置はお好みで
って感じです。(カメラはプレイヤーを見下ろせるように回転済み)
プレイヤーにアタッチするコードの一部を以下に記します。(コーディングのルールは、未学習のためスルーしてます。ゆるして)
public GameObject mainCamera;
public int H_Adjust = 15; // C_{pH}の部分
public int V_Adjust = 5; // C_{pV}の部分
private float c_x, c_y, c_z; // cameraの座標
void Start(){
// 初期位置はプレイヤー基準で設定
c_x = -H_Adjust * transform.forward.x;
c_y = V_Adjust;
c_z = -H_Adjust * transform.forward.z;
}
void FixedUpdate () {
// 移動に合わせてカメラ移動できるように(Update()にすべきかは未検討)
mainCamera.transform.position = new Vector3(
c_x + transform.position.x,
c_y + transform.position.y,
c_z + transform.position.z
);
// 左ctrlでカメラリセット
if (Input.GetKey(KeyCode.LeftControl)){
// 位置リセット
c_x = -H_Adjust * transform.forward.x;
c_y = V_Adjust;
c_z = -H_Adjust * transform.forward.z;
// プレイヤーの向きとカメラの向きを同じに
mainCamera.transform.forward = transform.forward;
}
}
これで、カメラのリセットはできてそうです。
カメラの位置をc_x, c_y, c_zで表記しているのは、分かりやすいかなーと思っただけです。
カメラリセットにより、プレイヤーの操作がしづらくなってしまったので、
次は、カメラの向きと、それに対応したプレイヤーの移動について検討していきます!
(初心者向けの、コピペでコードが動くようになる!とかじゃなく、著者の理解をただまとめているだけなので注意してください。)