UnityでFPSをつくる その5-1 [ 壁の衝突判定 ]
今回は壁の衝突判定を実装します。
実行して壁まで進んでみましょう。

・・・。
中央地点から壁までの距離が遠いですね、ステージに対してプレイヤーが小さ過ぎるのと移動速度が遅いので調整していきます。
まずは、人型に近づけながら Player の目線を高くしていきます。
Player の Position と Scale を以下のように変更してください。

次に Player に胴体を追加します。
Hierarchy に Cube を作成して「PlayerBody」にリネーム、Position と Scale を以下のように変更してください。

Hierarchy で PlayerBody を Player にドラッグ&ドロップして子オブジェクトにします。

頭と胴体が出来上がり、人型っぽくなりました。

Player を選択して PlayerMoveスクリプトの MoveSpeed を「1200」に変更します。

実行して操作感を確かめてみましょう。

個人的には地面の色合いが少しまぶしい気がするので、暗くしたいと思います。
Hierarchy で Ground を選択、Albedo から RGB を「7」にします。


実行中にいくつか不具合が見つかったので解消していきます。
まず、カメラの描画範囲です。
描画されない部分があるので、Far の値を大きくして描画範囲を広げます。

Main Camera を選択して Far を「18000」に変更します。


範囲内に収まって、黒く塗りつぶされていた部分が描画されるようになりました。
次に、Player の移動で不具合がありました。
前後左右の移動に比べて、斜めの移動が速くなっています。

数字で確認してみましょう。
80行目で Vector3 の magnitudeプロパティを使ってベクトルの長さを表示してみます。

実行して前後左右(W, A, S, D or 矢印キー)、斜め(W+D, W+A, A+S, S+D or ←+↑, ↑+→, →+↓, ↓+←)にキーを押し続けてみましょう。

前後左右

斜め

やはり、斜めの時にベクトルが長くなっています。
この現象は正方形をイメージするとわかりやすいです。

2方向へ同時に移動しようとすると、対角線分の移動となり、1方向に移動する時と比べて移動量が大きくなります。
移動量を均等にしたい場合、magnitudeプロパティで取得したベクトルの長さが「1」を超えた場合に、Vector3 の normalizedプロパティで「1」に補正します。
以下のスクリプトをコピペしてください。
追加した部分を見ていきます。

24行目で Vector3型変数を宣言しました。
変数は、宣言をする場所によって使用できる範囲(スコープ)が決まります。

関数内で宣言された変数(ローカル変数)はその関数内でのみ、関数の外で宣言された変数(フィールド変数)はそのクラス内でのみ使用する事ができます。
90行目で、24行目に宣言した Vector3型変数にX方向とZ方向の移動量を決める為、キーの押し具合を反映した変数の値を割り当てています。

95行目~104行目では if~else文を使い、magnitude(ベクトルの長さ)が1以上にならないよう制限をかけています。

98行目だけ残して if~else文の記述を書かなくても、斜め移動が速くなることは避けられますが、その場合は「1」未満の magnitude も normalized によって magnitude「1」として正規化(データ等を一定のルールに基づいて変形する)されるので、キーをちょっと押した際の少しの移動や、アナログスティックをわずかに傾け続けた際のジリジリした挙動が表現できません。
if~else文無しの場合(カクカクした動きになる※アナログスティック入力で実行)

if~else文有りの場合(ジリジリした動きができる※アナログスティック入力で実行)

106行目でDebug.Logを使ってコンソール画面にPlayerオブジェクトの移動量を表示しています。

前後左右と斜めの移動量が一致しているか確認してみましょう。
前後左右

斜め

ちゃんと一致しています。
以降このログは不要なのでダブルスラッシュでコメントアウトしておきましょう。

ここまでが前置きで、ようやくタイトルである[ 壁の衝突判定 ]の説明に移ります(汗
・・・・。
まぁ、でも、ちょっと長くなってきたので、仕切り直しで次回にしたいと思います。
おつかれさまでした!