UnityでFPSをつくる その8-1 [ 敵の移動 ]

2020年7月21日

今回は敵の移動を実装していきます。

新規にスクリプト「EnemyMove」を作成し、以下のコードをコピペしてください。

Enemyオブジェクトにアタッチして実行すると、Playerの方を向きながら反時計回りで壁づたいに移動し続けます。

No.287

8行目でスクリプトがアタッチされた自身(Enemy)以外のオブジェクトを取得する為の変数を宣言しています。

No.288
No.289

10行目はEnemyから出たレイに他のオブジェクトが当たった際、そのオブジェクトの情報を取得する為の変数を宣言しています。

No.290
No.291

12行目は移動の目標地点や、EnemyとWallの間隔を設定する為に必要な変数を宣言しています。

No.292

14行目はEnemyの速度を2種類使う為の変数、そしてオブジェクトの大きさを半分にする為の変数を宣言しています。

No.293

・・・今、書いていて気づきましたが、半分の大きさにする為に変数を宣言するより、もっと良い書き方がありました。
const int HALFSIZE = 2;」
変数を宣言する際に「const」を付けて同時に初期化を行うことで、その変数の値を書き換えることができなくなります
これは「定数」というもので、途中で値が変わる可能性が無いことが明白な場合に使われます。
定数名は慣例として大文字で宣言されます。
今回の例で言えば、「半分の大きさにする=2で割る」という定義が変更されることはないので、constを付けて定数として明示することで書き換えによるエラーを防ぐことができます。

No.294

変数halfSizeを定数HALFSIZEに置換します。
上図のように一文を追加してください。
次にhalfSizeの位置でクリックして、「Ctrl + F」を押して検索と置換ダイアログボックスを表示させます。

No.295

赤丸の位置をクリックして入力ボックスにHALFSIZEをコピペして入力します。

No.296

赤丸の位置をクリックすると「halfSize → HALFSIZE」に全て置換されます。

No.297

エラーが出たので修正していきます。
14行目のHALFSIZE、39行目と40行目を削除します。

No.298
No.299

これにより変数halfSizeを定数HALFSIZEに置換できました。

コードの説明を続けます。
17行目でEnemyの四方から出たレイの接触判定をする為の変数を宣言しています。

No.300
No.301

22~27行目でPlayerとWallオブジェクトを取得しています。
PlayerはScene上に1つしか存在しないので、タグで取得しています。
Wallは同名タグで複数ある為、タグではなくオブジェクト名を指定して取得しています。

No.302

注意点として、「GameObject.Find」はHierarchyにある全てのオブジェクトを検索して見つけ出そうとするので、時間のかかる重たい処理になります。
使用する場合はStart内で一回だけ呼び出す等して、処理負荷を軽減しましょう。

29、31行目でオブジェクトから1辺の長さを取得しています。

No.303

Unityの3DモデルはMesh(メッシュ)と呼ばれる三角形や四角形の平面の集合で表されています。
MeshRendererコンポーネントのチェックを外すと、レンダリング(データの整形結果を表示する工程)前のMeshを見ることができます。

No.304
No.305

このMeshを基に、MeshRendererがレンダリングを行ってCubeやPlaneが表示されるという流れになります。
そして、表示されたオブジェクトをMeshRendererのboundsと呼ばれる直方体で囲った際の値から幅や高さを取得するという処理を行っています。
以下の画像はboundsに色を付けて可視化したものです。

No.306
No.307

boundsで注意する点は、ワールド空間のXYZ軸に対して平行の直方体であるということです。
つまり、回転情報を持たない為、対象のオブジェクトが回転した場合に幅・高さ・奥行が一致しない場合があります。

No.308

一致する場合としては今回のWallのように、90°単位毎に回転させた場合です。

No.309
No.310
No.311

X軸の回転が0° or 180°でZ軸と平行、90° or 270°でY軸と平行になるのでboundsとオブジェクトの幅・高さ・奥行が一致します。

33行目は、29行目で取得したEnemyの幅をEnemyのレイの長さとして使っていきます。

No.312

35行目はEnemyがWallに沿って周回する際、どれだけ離すかを決める値です。

No.313

今回はEnemyオブジェクトの原点からEnemy1.5個分の距離を取るので、係数を1.5としました。

No.314

37、8行目でEnemyの初速と壁伝い時の移動速度を設定しています。
ゲームがスタートして最初に壁に向かう時に速くして、壁伝いの移動時は少し遅くしています。

No.315

長くなってきたので続きは次回にしたいと思います。おつかれさまでした!

FPS

Posted by kenji