FPSみたいにマウスでぐりぐり見渡せるようにする


1人称視点のゲームって自分がゲームの世界入ったみたいでいいよなあ…

Unityでゲーム内でいろいろ見渡せるようにできないかな、と思ってたらデフォルトのアセットに入ってたんですね。(First Parson Controllerってやつ)

なんだか出来合いのもので出来た!っていうのも、なんだかくだらないプライドといいますか、悔しい感じがしたので自分でスクリプトを書いてカメラをぐりぐり回せるようにしたいと思います。

用意するもの

  • Cameraオブジェクト
  • Enptyオブジェクト(Transformだけが入ってるやつ)
  • スクリプトエディタ(Visual Studioとか)と根気
  • Input Manager(Unityのボタン設定をするもの。今回は確認するため)

環境を整える

最初にEnptyオブジェクトを作成してその中にCameraを入れる。

ヒエラルキーで見てCameraが子オブジェクトになるように。

この親子関係は意識すると便利ですが、逆に意識しないと苦労する羽目になるので注意(当たり判定とか座標軸の向きとか)

そしてスクリプトを作成してCameraにアタッチします。

public class look : MonoBehaviour {

 public Transform verRot;
 public Transform horRot;
 
 // Use this for initialization
 void Start () {
 
 verRot = transform.parent;
 horRot = GetComponent<Transform>();
 }
 
 // Update is called once per frame
 void Update () {
 float X_Rotation = Input.GetAxis("Mouse X");
 float Y_Rotation = Input.GetAxis("Mouse Y");
 verRot.transform.Rotate(0, -X_Rotation, 0);
 horRot.transform.Rotate(Y_Rotation, 0, 0);
 }
}

Transform型のverRotにCameraの親オブジェクト、
holRotにCameraオブジェクト自身のTransformを格納します。
簡単に言えば格納すると再生中に値をいじることができます。

transform.parentでスクリプトがアタッチされているオブジェクトの親オブジェクトを呼び出すことができます。

なんで回転軸を親子関係で分けたのかというと、Z軸の回転によるずれを防ぐためです。ずれが起きたときの例は、いろいろ見渡した後に向き直ると水平線が傾いていた…みたいな場合でしょうか。

Input.GetAxis(“Mouse X”)はマウスのX軸方向(画面から見て)の移動値を返します。GetKeyと違って、キーの文字ではなくInputManagerに登録された文字列を入力します。

Edit > Project Settings > Inputで見ることができます。

マウスホイールの入力やコントローラのスティック入力なども扱うことができます。

設定を変更することで新しく入力の定義をすることもできます。

 

transform.Rotate(*, *, *)でオブジェクトを指定角度で回転させます。

update関数の中に書くと毎フレームでマウスの移動を検知するので連続的にリアルタイムで回転して動いてくれます。

ただし、()内は3次元ベクトルの値なので、いっぺんにX軸とY軸の値を入れてしまうとZ軸回転が生じてしまうようです。

 

前もって親子オブジェクトにしておいたCameraは親と子で軸回転の分担をしているため、X軸とY軸の回転のみを適用させられます。

ではこれで動かしてみましょう。

動いてくれています。

といった感じでした。


コメント

  1. 親と子で軸回転の分担するアイデアで上手くいきました。
    ありがとうございます!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です