はかせのラボ

私の頭の中を書いていく雑記ブログです

Unity FPSゲームやバイオで見るようなカメラとラジコン操作

あいさつ

どうも、はかせです。

今日は趣味のDirectX12ではなく
誘われたプロジェクトの作業してました。

今回はその中で実装してみた
簡単にできるFPSとかバイオで見る感じのラジコン操作を
紹介します。

どういうやつ

こんなやつ
www.youtube.com

マウスグリグリで視点移動ができて
十字キーorWASDで操作キャラ視点での
上下左右に移動できる感じです。

カメラ移動

今回はFPSカメラということでマウスの動きに応じて
カメラを回転させます。

using UnityEngine;

public class MouseCamera : MonoBehaviour
{
    public Transform YAxis;
    public Transform XAxis;

    public float XSpeed = 1.0f;
    public float YSpeed = 1.0f;

    private void Start()
    {
        //マウスカーソル消したければこのコメントアウトを外す
        //Cursor.lockState = CursorLockMode.Locked;
        //Cursor.visible = false;
    }

    // Update is called once per frame
    void Update()
    {
        float xRotation= Input.GetAxis("Mouse X") * XSpeed;
        float yRotation= Input.GetAxis("Mouse Y") * YSpeed;
        YAxis.transform.Rotate(0, -xRotation, 0);
        XAxis.transform.Rotate(yRotation, 0, 0);
    }
}

Input.GetAxisでマウスの移動量が取得できるので
そこに速度を掛け合わせて各軸での回転を計算します。

あとは計算した値を使ってtransform.Rotate関数で
回転させるだけですね。

X軸Y軸をそれぞれ別のTransformにしている理由は
同じTransformでX軸Y軸を回転させるとZ軸までズレてしまうからです。

これは3次元回転の性質上仕方のないことみたいです。

なのでそれぞれ別のTransformを回転させて
このズレが起きないよう誤魔化しています。

ラジコン操作

操作するキャラの視点で操作する方法ですね。
バイオなんかの動きがイメージしやすいと思います。

using UnityEngine;

public class Move : MonoBehaviour
{
    public float XSpeed = 1.0f;
    public float YSpeed = 1.0f;

    // Update is called once per frame
    void Update()
    {
        var pos = transform.position;
        pos += transform.right * Input.GetAxis("Horizontal") * XSpeed;
        pos += transform.forward * Input.GetAxis("Vertical") * YSpeed;
        transform.position = pos;
    }
}

ラジコン操作は操作するキャラクターの視点での操作になります。
なので移動量を計算しその移動量を
キャラクターから見たベクトルに変換してやる必要があります。

キャラクターの前はtransform.forward
キャラクターの右はtransform.right
それぞれ正規化されたベクトルを得られます。

あとはそのベクトルに計算した移動量をかけてやれば
その方向にそれだけ移動するベクトルができます。

最後に計算した前移動のベクトルと左右移動のベクトルを
原点に足してやればラジコン移動の完成です。

あとがき

今回はFPSゲームやバイオで見るようなカメラとラジコン操作を
Unityの機能を使ってなるべく簡単に実装してみました。

一応それっぽい動きとかはUnityの
Standard Assetsにあるっちゃあるんですが、
のべたに使うとZ軸ズレとか起こるんで
あくまで参考程度にするのがいいと個人的には思っています。

今回の記事が良ければスターやコメント等よろしくお願いします。
それでは今回はこの辺でノシ