UnityでFPSをつくる その5-1 [ 壁の衝突判定 ]

2020年5月27日

今回は壁の衝突判定を実装します。
実行して壁まで進んでみましょう。

No.195

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

No.196

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

No.197

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

No.198

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

No.199

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

No.200

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

No.201

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

No.202
No.203

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

No.204

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

No.205
No.206

範囲内に収まって、黒く塗りつぶされていた部分が描画されるようになりました。

次に、Player の移動で不具合がありました。
前後左右の移動に比べて、斜めの移動が速くなっています。

No.207

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

No.208

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

No.209

前後左右

No.210

斜め

No.211

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

No.212

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

追加した部分を見ていきます。

No.213

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

No.214

関数内で宣言された変数(ローカル変数)はその関数内でのみ、関数の外で宣言された変数(フィールド変数)はそのクラス内でのみ使用する事ができます。

90行目で、24行目に宣言した Vector3型変数にX方向とZ方向の移動量を決める為、キーの押し具合を反映した変数の値を割り当てています。

No.215

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

No.216

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

if~else文無しの場合(カクカクした動きになる※アナログスティック入力で実行)

No.217

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

No.218

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

No.219

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

前後左右

No.220

斜め

No.221

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

No.222

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

FPS

Posted by kenji