「2種類目の敵」を作ります。
*オブジェクトで自分の好きなように2種類目の敵を作りましょう。
*ここでは「EnemyB」という名前をつけています。
*この敵にも「EnemyShotShell」オブジェクトを「子供として付けて」おいてください。名前は「EnemyShotShell2」に変更しましょう。
今回は「プレーヤーが攻撃範囲内に入ったら感知する機能(サーチ機能)」を作ります。
そして、「サーチ機能でプレーヤーを発見したら砲弾を発射」するようにします。
発想としては、これまで何度も登場してきた「OnTrigger系」のメソッドを使えば実現できます。
(重要ポイント)
*「当たり判定」を行うためには、「それぞれのオブジェクト」に「Collider」(コライダー)のコンポーネント(機能)が付いている必要があります。
1)Box Colliderを付ける。
・「Add Component」を使って、「EnemyShotShell2」オブジェクトに「Box Collider」を加えてください。
・Box Colliderの「Center」と「Size」を調整して、前方に長細い長方形の枠を作りましょう。
・「この枠にプレーヤーが触れたら砲弾を発射する仕組み」となります。
*「Is Trigger」にもチェックを入れておきましょう。
次はスクリプトを作成します。
2)EnemyShotShell2スクリプトの作成
「C# Script」を1つ作成。
・名前は「EnemyShotShell2」に変更してください。
・ダブルクリックして、下記のコードを記載しましょう。
using UnityEngine; using System.Collections; public class EnemyShotShell2 : MonoBehaviour { // 変数を定義する(データを入れるための箱を作る) public GameObject enemyShellPrefab; public float shotSpeed; public AudioClip shotSound; private int timeCount = 0; void Update () { timeCount += 1; } // 「OnTriggerStay」になっているのがポイント! void OnTriggerStay(Collider other){ if(other.gameObject.CompareTag("Player")){ if(timeCount % 20 == 0){ EnemyShot(); AudioSource.PlayClipAtPoint(shotSound, transform.position); } } } void EnemyShot(){ GameObject enemyShell = (GameObject)Instantiate(enemyShellPrefab, transform.position, Quaternion.identity); Rigidbody enemyShellRigidbody = enemyShell.GetComponent<Rigidbody>(); enemyShellRigidbody.AddForce(transform.forward * shotSpeed); Destroy(enemyShell, 1.0f); } }
(重要ポイント)
・「OnTriggerEnter()」メソッドは、Collider同士が「触れた瞬間に」実行するものです。
・「OnTriggerStay()」メソッドは、Collider同士が「触れている間ずっと」実行するものです。
・「%」は「割った余り」という意味です。
・「==」は「左右が等しい」という意味です。
(考えてみよう!)
*では、今回の「timeCount % 20 == 0」はどういう意味でしょうか?
・コードが書けたらチェック。
・「EnemyShotShell2」オブジェクトにドラッグ&ドロップしましょう。
*「Enemy Shell Prefab」等を設定しておきましょう。
・ここまでできたら「再生ボタン」を押してみましょう。
プレーヤーを敵に近づけてください。
敵の攻撃範囲内に入った時「敵の攻撃」が始まったら成功です。
*(注意!)
・Tank(プレーヤー)に「Player」タグが付いているか確認しましょう。
ここまでで2種類の敵が完成しました。
1種類目の敵=>一定時間ごとに砲弾を自動発射
2種類目の敵=>プレーヤーが攻撃範囲内に入ったら砲弾を発射
これらの敵を自分の世界の中に自由に配置しましょう。