どうも、チャーさんです。
あなたはUnityで敵が攻撃してくるようにしたいですか?
この記事ではUnityで敵に攻撃させる方法を書いてるので、
この記事を読めば敵に攻撃させることができます。
ですが、読まなければ攻撃させる方法探しに苦労して、
時間が溶けて頭痛がするでしょうし、
作りたい機能を作れずストレスが溜まるでしょう。
なのでそうなりたくなければ、このまま記事を読み進めて
ください。
動画はこちら
目次
Unityで敵に攻撃させる方法
ということで本題に入っていきます。
Unityで敵に攻撃させる方法ですが、
- 敵オブジェクトにSphereコライダーをつけて攻撃範囲を作る。
- そしてInstantiate、LookAt、Translateメソッドを使って攻撃できるようにする
大まかにこの2つをやれば実現可能です。
ということで順番に詳しく説明していきます。
まず、
敵オブジェクトにSphereコライダーをつけて攻撃範囲を作る。
ですが、Unityで敵に攻撃させるには、攻撃範囲を
作る必要があります。
そうでなければ、プレイヤーが敵にエンカウントしなくても
どこにいても、ゲーム開始直後から早々に延々と敵が攻撃してきます。
するとゲーム的には困ります。
なので、敵に攻撃範囲を設定する必要があります。
(どこからでも攻撃してくる設定にするなら、その時は別です)
で、敵に攻撃範囲を設定するのは簡単でして、
大まかにはSphereコライダーと
OntriggerStayメソッドを使えばできます。
詳しいやり方は以下の記事、敵の索敵機能をつけると全く
同じやり方で作れるので、
以下の記事を読んで、記事の手順を最後までやってください。
そしてそれができたら本記事に戻ってきてください。
で上記の記事の手順をやっていただいたら、
攻撃範囲の設定は終わりです。
一応補足しておきますが、上記記事で出てくる索敵範囲が
今回の記事では攻撃範囲になります。
また上記記事では、
}
void OnTriggerStay(Collider col){
if(col.gameObject.name == “player”){
transform.LookAt(player);
transform.Translate(0,0,0.1f);
}
}
というコードで終わることになりますが
今回は敵オブジェクトをプレイヤーに向かって進行させないので、
transform.Translateの部分の記述は消しておいてください。
で、攻撃範囲が設定できたら、
Instantiate、LookAt、Translateメソッドを使って攻撃できるようにする
次のステップで攻撃用のコードを書いていくという部分に入ります。
で、今回の記事では攻撃の例として敵が弾を発射してくるという
方法で攻撃させます。
そのためには、敵オブジェクトと
敵の攻撃用の弾になるオブジェクトが必要です。
ということで、敵オブジェクト(Cubeでも自前でもなんでもOKです)と
Sphereオブジェクト(攻撃用オブジェクトになるならなんでもOKです)
を用意して、
攻撃用の弾になるオブジェクトだけprefab化させましょう。
prefab化にはHierarchyで+マークでSphereオブジェクトを
つけたらAssetsのとこまでSphereオブジェクトをドラッグアンドドロップ
しましょう。
するとprefab化します。
それができたら、コードを書いていきましょう。
敵オブジェクトのスクリプトに書くコード
まずは敵オブジェクトに貼り付けるコードを設定します。
(索敵の記事の手順をやっていたら、
何行か付け足すだけです。)
ということでコードの補足説明します。
まず、public GameObject canonball;
ですが、ここが攻撃用オブジェクトの変数になります。
これを設定するとあとでつけるスクリプト部分に
変数と空欄が設置されるので、攻撃用オブジェクトとして
用意したやつをそこの空欄にドラッグアンドドロップしましょう。
するとそれが攻撃用オブジェクトとして使われるようになります。
で、private int count = 0;
の部分ですが、
これは攻撃間隔のコントロール用の数値です。
そして、
の部分ですが、
この部分でInstantiateして攻撃用オブジェクトを
出現させます。
Ifの部分は、攻撃間隔コントロール用です。
%10となってるところは、数値を小さくすると、
どんどん攻撃間隔が短くなるようになってます。
で、これで敵オブジェクトに貼り付けるコードは終了です。
攻撃用オブジェクトのスクリプトに書くコード
次は、攻撃用のオブジェクトに貼り付けるコードです。
攻撃用に設定したSphereオブジェクトには、
以下のコードを設定しましょう。
private GameObject player;
// Start is called before the first frame update
void Start()
{
player = GameObject.Find(“player”);
transform.LookAt(player.transform);
}
// Update is called once per frame
void Update()
{
transform.Translate(0,0,1);
Destroy(gameObject,1);
}
で、こちらの説明に入ります。
まず最初の、
private GameObject player;
ですが、攻撃用オブジェクトがプレイヤーを攻撃するには、
プレイヤー用のオブジェクトの座標を取得する必要があります。
なのでこれはそのための変数です。
そして
player = GameObject.Find(“player”);
transform.LookAt(player.transform);
の部分では、プレイヤーオブジェクトを取得し、
tranform.LookAtの引数にplayer.transformとしてやることで
攻撃用のオブジェクトがプレイヤーの方を向きます。
これがなぜ必要かというと、攻撃用のオブジェクトもプレイヤー
の方を向かせないと、プレイヤーに向かって攻撃が飛んでいかない
からです。
またこれをStart関数内に書いてUpdate関数に書かない理由ですが、
このLookAtをUpdate関数内に書くとホーミングになり、
追跡機能を持った攻撃になってしまうためです。
なので、もし攻撃がプレイヤーを追跡したい場合はそうしたらいいのですが、
今回はそうじゃないのでStart関数内に書いてます。
そして、
void Update()
{
transform.Translate(0,0,1);
Destroy(gameObject,1);
}
の部分ですが、
これにより攻撃用オブジェクトがプレイヤー目がけて
飛んでいき攻撃することができます。
transform.Translateがz軸に数値が設定してるのは、
transform.LookAtを使うとz軸がプレイヤーの方を向くからです。
なのでこの2つを組み合わせることで、
攻撃用オブジェクトをプレイヤーに飛ばし、
敵に攻撃させることが可能になります。
そして、最後にDestroyの部分ですが、
攻撃用オブジェクトを出現させたあとそれがずっと
Scene上に残るのは、
Unityのパフォーマンス的に良くないです。
オブジェクトが無数に増えるとUnityがどんどん重くなって
しまうので、
随時、敵オブジェクトのコードでInstantiateして
出現させた攻撃用オブジェクトを削除していくことで、
パフォーマンスを保ちましょう。
とはいえ、攻撃用オブジェクトを画面上に戦場みたいな感じ
残したいのなら、その時はその限りではないかもです。
で、割と長々書いてきましたが、
これらを全部やると、
プレイヤーが敵の攻撃範囲に入った時に攻撃してくる
ゲームっぽい攻撃機能の完成です。
パチパチパチ(拍手です)。
やりましたね。
余談ですがあとは、攻撃用のオブジェクトにも衝突判定や当たり判定を
つけてプレイヤーにダメージ与えたりオブジェクトを吹っ飛ばしたり
するのをつけると、
より面白いでしょう。
まとめ
ということでまとめに入ります。
Unityで敵に攻撃をさせたいなら、
敵に攻撃範囲を設定しましょう。
攻撃範囲のやり方にはSphereコライダをつけ、
IsTriggerをチェックし、OnTriggerStayメソッドを
使いましょう。
敵に攻撃用のコードを設定ですが、
具体的には、敵オブジェクトに攻撃用のオブジェクトを
Instantiateさせ、
その攻撃用のオブジェクトには、LookAtで
プレイヤーの方を向かせTranslateメソッドで
プレイヤー目がけて進ませましょう。
すると攻撃機能の完成です。
是非とも本記事を参考にUnityで敵に攻撃させる
機能を設定してみてください。
でわ最後までお読みいただきありがとうございました。
それでは。
チャーさん