
レッスン 4.2 - プレイヤーを追いかける敵
Tutorial
Beginner
+0XP
60 mins
Unity Technologies

概要:
プレイヤーは満足いくまで球体を転がすことができますが...転がすことに目的がありません。このレッスンでは、目的を与えるために、プレイヤーに挑んでくる敵を作成します。まず、敵に好きなテクスチャを与え、プレイヤーを跳ね飛ばす機能を与えます。最後に、敵に島の周りを追いかけさせ、ランダムな位置にスポーンさせます。
プロジェクトの成果物:
テクスチャが付いた球体の敵は、開始時にカスタム関数によって決定された、島の上のランダムな場所に出現します。敵はプレイヤーを島の上で追いかけ回し、極端に近づくとプレイヤーを跳ね飛ばします。
1. 導入
2. 敵と物理マテリアルを追加する
カメラの回転とプレイヤーの動きは非常にいい感じになっています。次は敵を作って、新たに特別な物理設定を与えて、プレイヤーを跳ね飛ばすようにしてみましょう。
- 新しく球体を作成し、名前を「Enemy」に変更して位置を変え、その上にテクスチャをドラッグします。
- 新しく RigidBody コンポーネントを追加して X、Y、Z 方向のスケールを調整し、テストします。
- 新しく作った「Physics Materials」フォルダーで、Create > Physics Material を選択し、「Bouncy」という名前を付けます。
- Bounciness を「1」に、Bounce Combine を「Multiply」に変更し、自分のプレイヤーと敵に適用して、テストします。
3. プレイヤーを追いかける敵のスクリプトを作成する
敵はプレイヤーを跳ね返す力を持っていますが、プレイヤーが近づいてきた場合しか跳ね飛ばせません。プレイヤーの位置を追いかけるように敵に指示して、島内でプレイヤーを追いかけ回すようにしましょう。
- 新しく「Enemy」スクリプトを作成し、Enemy オブジェクトにアタッチします。
- Rigidbody enemyRb;、GameObject player; および public float speed; と、3 つの新しい変数を宣言します。
- enemyRb = GetComponent<Rigidbody>(); および player = GameObject.Find("Player"); と初期化を行います。
- Update() で、Enemy から Player に向かう方向で力を加えるように AddForce を呼び出します。
4. lookDirection 変数を作成する
敵がプレイヤーに向かって転がってくるようになりましたが、コードが少し乱雑です。新しいベクトル用の変数を追加してきれいにしてみましょう。
- Update() で、新しく Vector3 lookDirection 変数を宣言します。
- Vector3 lookDirection = (player.transform.position - transform.position).normalized; として、ベクトルを設定します。
- AddForce の呼び出しで lookDirection 変数を実装します。
5. 敵のスポーンマネージャーを作成する
敵が思い通りの動きをしてくれるようになりました。スポーンマネージャーからインスタンス化できるように、敵をプレハブに変えてみましょう。
- 新しいプレハブを作成するために Enemy を Prefabs フォルダーにドラッグし、シーンから Enemy を削除します。
- 新しく「Spawn Manager」オブジェクトを作成し、新しく「SpawnManager」スクリプトをアタッチし、それを開きます。
- 新しく public GameObject enemyPrefab; と宣言し、インスペクターでプレハブを割り当てます。
- Start() で、あらかじめ決められた場所に新しく enemyPrefab をインスタンス化します。
6. ランダムに出現位置を生成する
敵が開始時に出現するようになりましたが、必ず同じ場所に出現します。おなじみのRandomクラスを使えば、ランダムな位置に敵を出現させることができます。
- SpawnManager.cs の Start() で、ランダムに X と Z を生成します。
- ランダムな X と Z の位置を持つ Vector3 spawnPos 変数を新しく作成します。
- 新しく spawnPos 変数を Instantiate 呼び出しに組み込みます。
- ハードコードされた値を spawnRange 変数に置き換えます。
- プロジェクトを何回か再起動させ、敵がランダムな位置に出現することを確認します。
7. メソッドに出現位置を返させる
ランダムな出現位置を生成するために使っているコードは完璧に動作しました。スクリプトをきれいにして、後でこのコードを再利用できるよう、カスタム関数に格納しましょう。
- 新しい関数 Vector3 GenerateSpawnPosition() { } を作成します。
- spawnPosX と spawnPosZ 変数をコピーして新しいメソッドに貼り付けます。
- GenerateSpawnPosition() 内に return randomPos; を追加します。
- Instantiate 呼び出しにあるコードを、GenerateSpawnPosition() に置き換えます。
8. レッスンのまとめ
新しい機能:
- 島内のランダムな場所に敵が出現する
- 敵がプレイヤーを追いかけ回す
- 球体は互いに跳ね返る
新しい概念とスキル:
- 物理マテリアル
- 3 次元空間でのベクトルの定義
- 値の正規化
- 戻り値を持つメソッド
次のレッスン:
- 次のレッスンでは、パワーアップを使って敵を撃退する方法を考えてみましょう