UnityでFPSをつくる その4-2 [ カメラの設定 ]

2020年5月27日

No.176

38行目と42行目は、Update と FixedUpdate に書いていた処理を関数としてまとめました。

No.177

44行目と75行目にそれぞれ定義しています。
定義されている箇所を探す際、行数が少ないスクリプトであれば画面スクロールで済みますが、ある程度の規模になってくると目視で探すのが大変になってきます。
その場合は定義へ飛びたい構文をクリックして「F12」キーを押します。

No.178

元の箇所へ戻るには「Ctrl」+「ー」を押してください。

No.179

関数としてまとめた際に、新たに追加した処理を見ていきます。

No.180

51行目と53行目では、キー入力を取得した時と同じように、マウスを動かした際の移動量をfloat型「-1」~「1」の範囲で取得しています。

No.181

66~73行目、キー入力の時に行っていた移動許可を出す処理を、マウスにも実装しています。

No.182

78行目では、if文の条件に、キー入力の有無に加えて、マウス移動の有無を追加しています。
83~84行目は、条件が合っていた場合、次回の判定をする為にキー入力の判定用フラグ(※bool型変数はこう呼ばれたりもします)同様、マウスのフラグも false に戻しておきます。

No.183

88行目、player をキー入力で前後左右に移動させた時は、playerRigidbody.velocity に Vector3型の値を渡して移動させていました。
90行目では、player をマウスの X座標の移動量に応じて回転させる為に Rigidbody の MoveRotation という関数を使っています。

No.184

MoveRotation関数は引数に Quaternion型の値が必要です。

No.185

しかし、前回説明したように Quaternion型は直感的に扱いづらい為、Quaternion.Euler という関数を使うことで、引数に Vector3型でオイラー角の値を渡せば、Quaternion型の値を戻り値として返してくれます。
その戻り値を MoveRotation関数の引数に渡すという流れです。

No.186
No.187

92行目、回転の角度に制限をかける為、Mathf.Clamp関数を使っています。

No.188
No.189

人の首の自然な可動域をイメージして -40°~40°の範囲に設定しました。

No.190

94行目、Mathf.Clamp で調整した後の値 rotationXcamera を Vector3型でカメラのX回転角に設定しています。

No.191

Vector3型で値を渡さなくても、
transformCamera.localEulerAngles.x = rotationXcamera;
で通りそうな気がしますが、これはエラーになってしまいます。

No.192

localEulerAngles の上にカーソルを合わせると、
Vector3 Transform.localEulerAngles{get;set;}
と表示されます。
これはプロパティと呼ばれるもので、外部には変数のように振る舞い、内部では関数のように振る舞います。
プロパティとして定義されたlocalEulerAngles が持つ変数(x ,y ,z)を取得、変更する際には、getset を通じて行います。
先頭に Vector3 と表記されているとおり、このプロパティは Vector3型に定義されている為、get や set でやり取りする値も Vector3型にする必要があります。
transformCamera.localEulerAngles.x = rotationXcamera;
は、Vector3型でなく、ピンポイントに変数x を変更しようとした為にプロパティで弾かれてエラーになっていたんですね。

では、32行目で変数xから値を取得できていたのは何故でしょうか?

No.193

実は、これもプロパティを通じた値のやり取りをしています。
transformCamera.localEulerAngles の部分でプロパティget にアクセスしてVector3型の戻り値(実体のコピー)を取得、x成分の値をrotationXcameraに代入するという流れです。

No.194

一見、localEulerAngles の変数x の値を直に取得してるようで、実際は get関数が呼び出されて、その戻り値から変数x の値を取得しています。
このように、プロパティは外部には変数のように振る舞い、内部では関数のように振る舞う役割をします。

以上で[カメラの設定]の説明を終わります。おつかれさまでした!

FPS

Posted by kenji