技術的な備忘録と次回作のチラ見せ
マウス操作でのカメラ操作を実装しようとして、詰まっていた所が解消されたので備忘録。
前作では「ベクトルとか良く分からん」という状態だったので、マウス関係の操作系はアセットに頼ったのですが、色々と不都合があったので今作では自作することにしました。
こんな感じで、左右クリックしながらマウスを動かすと、画面が上下左右に動き。
左クリックしながらマウスを動かすと画面が回転する。
マウスホイールでズーム。
という操作を実装しようとしていました。
画面回転は一番楽で
//マウス操作でのカメラ回転
public void mouseRotation(InputAction.CallbackContext context)
{
//マウスの入力を取得
mouse = context.ReadValue<Vector2>();
//回転の変化量を計算
float pitch = mouse.y * 2f * Time.deltaTime;
float yaw = mouse.x * 2f * Time.deltaTime;
//カメラの回転に変化量を加算
cameraMove.Rotate(pitch, -yaw, 0f);
}
こんな感じのプログラムで簡単に実装できたのですが、ズームと上下左右移動は難航しました。
今回の仕様上、ズームと言ってもカメラを前方に動かすのと同じなため、最初はネットでよく出回っている下記のようなプログラムを参考にしました。
// カメラの方向から、X-Z平面の単位ベクトルを取得
Vector3 cameraForward = Vector3.Scale(Camera.main.transform.forward, new Vector3(1, 0, 1)).normalized;
// 方向キーの入力値とカメラの向きから、移動方向を決定
Vector3 moveForward = cameraForward * inputVertical + Camera.main.transform.right * inputHorizontal;
横移動は仕様上ここでは必要ないので「+ Camera.main.transform.right * inputHorizontal」の部分は省いて、入力値に補正をかけてカメラを前後に移動させる。というプログラムを組んで実行したところ。
初期位置での前後移動は問題なかったのですが、
このようにカメラを上に回転させてからズームをすると、何故かカメラが顔に近づくのでは無く
こんな感じで下に下がる。
上下左右移動の場合は、初期位置では問題ないがカメラを上に回転させてから、上に移動させようとするとカメラがズームする。等の問題が発生しました。
public void zoom(InputAction.CallbackContext context)
{
//マウスの入力を取得
Vector2 mouse = context.ReadValue<Vector2>();
//カメラの前方をカメラの回転で補正して正規化
Vector3 zoomCam = (cameraMove.localRotation * Vector3.forward).normalized;
//入力値に応じてカメラの移動量を補正
Vector3 newCameraPos = zoomCam * mouse.y * 0.005f * Time.deltaTime;
//カメラの位置にカメラの移動量を加算してズームさせる
cameraMove.localPosition += newCameraPos;
}
最終的に上記のスクリプトで問題は解決できました。Vector3.forwardは普通のFPSのようにプレイヤーが地面に沿って移動する場合はそのまま使って大丈夫のようですが、今回のようにプレイヤーが空を飛ぶような動きをする場合は回転で補正をかけないと上手く前に進んでくれない様です。