レッスン 4.2 - プレイヤーを追いかける敵

Tutorial

Beginner

+0XP

60 mins

Unity Technologies

レッスン 4.2 - プレイヤーを追いかける敵

概要:

プレイヤーは満足いくまで球体を転がすことができますが...転がすことに目的がありません。このレッスンでは、目的を与えるために、プレイヤーに挑んでくる敵を作成します。まず、敵に好きなテクスチャを与え、プレイヤーを跳ね飛ばす機能を与えます。最後に、敵に島の周りを追いかけさせ、ランダムな位置にスポーンさせます。

プロジェクトの成果物:

テクスチャが付いた球体の敵は、開始時にカスタム関数によって決定された、島の上のランダムな場所に出現します。敵はプレイヤーを島の上で追いかけ回し、極端に近づくとプレイヤーを跳ね飛ばします。

1. 導入

2. 敵と物理マテリアルを追加する

カメラの回転とプレイヤーの動きは非常にいい感じになっています。次は敵を作って、新たに特別な物理設定を与えて、プレイヤーを跳ね飛ばすようにしてみましょう。
  1. 新しく球体を作成し、名前を「Enemy」に変更して位置を変え、その上にテクスチャをドラッグします。
  2. 新しく RigidBody コンポーネントを追加して X、Y、Z 方向のスケールを調整し、テストします。
  3. 新しく作った「Physics Materials」フォルダーで、Create > Physics Material を選択し、「Bouncy」という名前を付けます。
  4. Bounciness を「1」に、Bounce Combine を「Multiply」に変更し、自分のプレイヤーと敵に適用して、テストします

3. プレイヤーを追いかける敵のスクリプトを作成する

敵はプレイヤーを跳ね返す力を持っていますが、プレイヤーが近づいてきた場合しか跳ね飛ばせません。プレイヤーの位置を追いかけるように敵に指示して、島内でプレイヤーを追いかけ回すようにしましょう。
  1. 新しく「Enemy」スクリプトを作成し、Enemy オブジェクトにアタッチします。
  2. Rigidbody enemyRb;GameObject player; および public float speed; と、3 つの新しい変数を宣言します。
  3. enemyRb = GetComponent<Rigidbody>(); および player = GameObject.Find("Player"); と初期化を行います。
  4. Update() で、Enemy から Player に向かう方向で力を加えるように AddForce を呼び出します。

4. lookDirection 変数を作成する

敵がプレイヤーに向かって転がってくるようになりましたが、コードが少し乱雑です。新しいベクトル用の変数を追加してきれいにしてみましょう。
  1. Update() で、新しく Vector3 lookDirection 変数を宣言します。
  2. Vector3 lookDirection = (player.transform.position - transform.position).normalized; として、ベクトルを設定します。
  3. AddForce の呼び出しで lookDirection 変数を実装します。

5. 敵のスポーンマネージャーを作成する

敵が思い通りの動きをしてくれるようになりました。スポーンマネージャーからインスタンス化できるように、敵をプレハブに変えてみましょう。
  1. 新しいプレハブを作成するために Enemy を Prefabs フォルダーにドラッグし、シーンから Enemy を削除します。
  2. 新しく「Spawn Managerオブジェクトを作成し、新しく「SpawnManagerスクリプトをアタッチし、それを開きます。
  3. 新しく public GameObject enemyPrefab; と宣言し、インスペクターでプレハブを割り当てます。
  4. Start() で、あらかじめ決められた場所に新しく enemyPrefab をインスタンス化します。

6. ランダムに出現位置を生成する

敵が開始時に出現するようになりましたが、必ず同じ場所に出現します。おなじみのRandomクラスを使えば、ランダムな位置に敵を出現させることができます。
  1. SpawnManager.cs の Start() で、ランダムに X と Z を生成します。
  2. ランダムな X と Z の位置を持つ Vector3 spawnPos 変数を新しく作成します。
  3. 新しく spawnPos 変数を Instantiate 呼び出しに組み込みます。
  4. ハードコードされた値を spawnRange 変数に置き換えます。
  5. プロジェクトを何回か再起動させ、敵がランダムな位置に出現することを確認します。

7. メソッドに出現位置を返させる

ランダムな出現位置を生成するために使っているコードは完璧に動作しました。スクリプトをきれいにして、後でこのコードを再利用できるよう、カスタム関数に格納しましょう。
  1. 新しい関数 Vector3 GenerateSpawnPosition() { } を作成します。
  2. spawnPosX spawnPosZ 変数をコピーして新しいメソッドに貼り付けます。
  3. GenerateSpawnPosition() 内に return randomPos; を追加します。
  4. Instantiate 呼び出しにあるコードを、GenerateSpawnPosition() に置き換えます。

8. レッスンのまとめ

新しい機能:

  • 島内のランダムな場所に敵が出現する
  • 敵がプレイヤーを追いかけ回す
  • 球体は互いに跳ね返る

新しい概念とスキル:

  • 物理マテリアル
  • 3 次元空間でのベクトルの定義
  • 値の正規化
  • 戻り値を持つメソッド

次のレッスン:

  • 次のレッスンでは、パワーアップを使って敵を撃退する方法を考えてみましょう

Complete this Tutorial