チャムコード

チャーさんのUnityゲームラボです。Unityでゲーム制作する時に使うコードやノウハウをメインに発信しています。Unityでゲーム制作したいと思っているなら読んでください。

敵Aiの作り方

Unityで敵にプレイヤーを攻撃させる方法

投稿日:2023年10月11日 更新日:

うも、チャーさんです。

 

あなたはUnityで敵が攻撃してくるようにしたいですか?

この記事ではUnityで敵に攻撃させる方法を書いてるので、

この記事を読めば敵に攻撃させることができます。

 

ですが、読まなければ攻撃させる方法探しに苦労して、

時間が溶けて頭痛がするでしょうし、

作りたい機能を作れずストレスが溜まるでしょう。

 

なのでそうなりたくなければ、このまま記事を読み進めて

ください。

 

動画はこちら

 

 

Unityで敵に攻撃させる方法

 

ということで本題に入っていきます。

 

Unityで敵に攻撃させる方法ですが、

 

  1. 敵オブジェクトにSphereコライダーをつけて攻撃範囲を作る。
  2. そしてInstantiate、LookAt、Translateメソッドを使って攻撃できるようにする

 

大まかにこの2つをやれば実現可能です。

ということで順番に詳しく説明していきます。

 

 

まず、

 

敵オブジェクトにSphereコライダーをつけて攻撃範囲を作る。

 

ですが、Unityで敵に攻撃させるには、攻撃範囲を

作る必要があります。

 

そうでなければ、プレイヤーが敵にエンカウントしなくても

どこにいても、ゲーム開始直後から早々に延々と敵が攻撃してきます。

 

するとゲーム的には困ります。

なので、敵に攻撃範囲を設定する必要があります。

(どこからでも攻撃してくる設定にするなら、その時は別です)

 

 

で、敵に攻撃範囲を設定するのは簡単でして、

大まかにはSphereコライダーと

OntriggerStayメソッドを使えばできます。

 

詳しいやり方は以下の記事、敵の索敵機能をつけると全く

同じやり方で作れるので、

 

以下の記事を読んで、記事の手順を最後までやってください。

そしてそれができたら本記事に戻ってきてください。

 

Unityで敵に索敵機能を持たせる方法(簡単なやり方)

 

 

 

で上記の記事の手順をやっていただいたら、

攻撃範囲の設定は終わりです。

 

一応補足しておきますが、上記記事で出てくる索敵範囲が

今回の記事では攻撃範囲になります。

 

 

また上記記事では、

}

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 Transform player;
public GameObject canonball;
private int count = 0;
    // Start is called before the first frame update
    void Start()
    {
        
    }
 
    void OnTriggerStay(Collider col){
   
    if(col.gameObject.name == “player”){
    transform.LookAt(player);
   
    count++;
    // Debug.Log(count);
    if(count % 10 ==0 ){
    Instantiate(canonball,transform.position,Quaternion.identity);
 
    }
 
    }
   
    }

 

 

ということでコードの補足説明します。

 

まず、public GameObject canonball;

ですが、ここが攻撃用オブジェクトの変数になります。

 

これを設定するとあとでつけるスクリプト部分に

変数と空欄が設置されるので、攻撃用オブジェクトとして

用意したやつをそこの空欄にドラッグアンドドロップしましょう。

 

するとそれが攻撃用オブジェクトとして使われるようになります。

 

 

で、private int count = 0;

の部分ですが、

これは攻撃間隔のコントロール用の数値です。

 

そして、

if(count % 10 ==0 ){
    Instantiate(canonball,transform.position,Quaternion.identity);
 
  }

の部分ですが、

この部分で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で敵に攻撃させる

機能を設定してみてください。

 

でわ最後までお読みいただきありがとうございました。

それでは。

 

チャーさん

 
 
 

-敵Aiの作り方

関連記事

Unityで敵に巡回させるならこの3ステップ(ランダム巡回もできる)

どうも、チャーさんです。 あなたはUnityで敵を巡回させたいですか? この記事ではUnityで敵を巡回させる方法を説明します。   なので、この記事を読めばUnityで敵の巡回をすぐにさせ …

no image

unityで敵を移動させる方法(詳細にわかりやすく説明します)

どうも、チャーさんです。   あなたはunityで敵を移動させたい、そう思っていませんか? コライダーなどでもできるが、他の方法がないかと探してませんか?   この記事ではコライダ …

unity-enemy-spawn

Unityで敵をスポーンさせる簡単な方法[速攻でできる]

どうも、チャーさんです。 この記事では、Unityで敵をスポーンさせる方法について お話しします。   なので、あなたがこの記事を読めば、 すぐにUnityで敵をスポーンさせることができるよ …

Unityで敵を徘徊させたい?ならこうやればいいですよ。

どうも、チャーさんです。   あなたは、Unityで敵に徘徊させたいですか? であればこの記事を読んでください。   読めば、Unityで敵に徘徊させることができるようになります。 …

unityで敵を消滅させる

Unityで敵を消滅させる方法(敵を攻撃した時に消滅させるとかも)

  どうも、チャーさんです。   あなたはUnityで敵を消滅させたいですか? 例えばプレイヤーが敵を攻撃したら消滅させたり、 そんな風にしたいならばこの記事を読んでください。 & …

no image

unityで敵に近づくと追いかけてくるコードとコードの解説記事

どうも、チャーさんです。   あなたはunityで敵に近づくと、 プレイヤーを追いかけてくるという機能を つけたいと思っていませんか?   この記事ではそれを実現するコードと方法や …

Unityで敵の上にHPを表示させる方法「すぐにできます」

どうも、チャーさんです。 あなたは、unityで敵にHPを表示させたいですか?   この記事ではunityで敵の上にHPを表示させる方法について お話しします。   なのであなたが …

Unityで敵が攻撃を受けたらHPを減らす機能の作り方

どうも、チャムコードというブログ運営してる、チャーさんです。   あなたはUnityで敵のHPを減らす機能を作りたいですか? 敵がプレイヤーから攻撃を受けたときに、HPを減らす 処理をつけた …

Unityで敵による索敵を距離で行わせる簡単な方法「このメソッド1個使えばいける」

どうも、チャーさんです。 いつもこのブログ、チャムコードに来ていただき ありがとうございます。   あなたは、Unityで敵による索敵を距離で行わせたいですか? プレイヤーと敵オブジェクトと …

Unityで敵に索敵機能を持たせる方法(簡単なやり方)

どうも、チャーさんです。   あなたはUnityで敵に索敵機能をつけたいですか? この記事ではUnityで敵に索敵機能をつける方法を説明します。 なので、   この記事を読めば、あ …

最新記事

チャーさん

Unityに関する記事を書いてます。

 

[簡単な経歴]

 

2018年-プログラムを始めUnityの存在を知りハマる。

2019年-エンジニアとして仕事開始(web系)

2021年-UnityでVR開発等にも手を出し始める。

現在-エンジニアとして活動しながらUnityも続行中。

 

youtubeでは、Unityに関する動画をあげてるので、

あなたのUnityスキルアップにどうぞ。