Unity

Unityで3Dシューティングアクションを作ろう③

投稿日:2019年6月4日 更新日:

今回やること

  • 敵キャラの作成
  • 敵の攻撃
  • 敵がプレイヤーに向かってくるようにする
  • 敵のダメージ処理

敵キャラの作成

敵の攻撃

Enemyスクリプトには一番上のusing~の部分にも記入します。

using~の記入内容

using UnityEngine.AI;

using~の説明

using UnityEngine.AI;

この後に敵キャラクターにつけるNavMeshAgentを使用する場合につけます。
NavMeshAgentとは敵キャラクターの動きをつけやすくするもので、つけることによって
障害物やステージ内の行ける場所を自動で判別して避けてくれるようになります。

変数を宣言する部分の記入内容

public GameObject target;
NavMeshAgent agent;
Animator animator;
public GameObject Enemyattack;
public Transform enemy;

変数を宣言する部分の説明

public GameObject target;

敵が追従するターゲットを定義します。
今回はプレイヤーに向かってくるようにするのでプレイヤーが該当します。

NavMeshAgent agent;

NavMeshAgentを使うのでagentという名前をつけて定義しています。
もちろん名前は何でも良いです。

Animator animator;

Animatorも使うので定義しています。
Playerスクリプトの時と同じです。

public GameObject Enemyattack;

敵が攻撃する時のエフェクトを定義しています。

public Transform enemy;

敵の座標を定義しています。後々敵の攻撃エフェクトや敵のやられエフェクトを
敵のいる場所に出現させるためです。

void Startの記入内容

agent = GetComponent<NavMeshAgent>();
animator = GetComponent<Animator>();

void Startの説明

agent = GetComponent();

agentにNavMeshAgentの値を代入します。

animator = GetComponent();

同様にanimatorにAnimatorの値を代入します。

void Updateの記入内容

agent.destination = target.transform.position;

void Updateの説明

agent.destination = target.transform.position;

NavMeshAgentの目的地をtargetの座標に決めています。

衝突判定の内容

void OnTriggerEnter(Collider collision)
    {                
   if (collision.gameObject.tag == "Player")
        {
            StartCoroutine("EnemyAttack");
        }
        }

衝突判定の説明

void OnTriggerEnter(Collider collision)

衝突判定を定義しています。オブジェクトがオブジェクトに衝突した時の処理は全部ここに書きます。
因みに書き方は
void OnTriggerEnter(Collider 変数の名前)
で始めて{}で閉じます。

if (collision.gameObject.tag == “Player”)

衝突したオブジェクトのタグがPlayerなら…です。
今回はプレイヤーの当たり判定に敵の当たり判定が衝突した場合に敵の攻撃が開始します。

StartCoroutine(“EnemyAttack”);

後に記述するEnemyAttackコルーチンを開始します。

コルーチンの内容

IEnumerator EnemyAttack()
    {
        animator.SetBool("Attack", true);
        yield return new WaitForSeconds(0.05f);
        GameObject Enemyattacks = GameObject.Instantiate(Enemyattack) as GameObject;
        Enemyattacks.transform.position = enemy.position;
        animator.SetBool("Attack", false);
        Destroy(Enemyattacks.gameObject, 1);
    }

コルーチンの説明

IEnumerator EnemyAttack()

EnemyAttackコルーチンを定義します。

animator.SetBool(“Attack”, true);

Attack変数をtrueにします。

yield return new WaitForSeconds(0.05f);

0.05秒待ちます。

GameObject Enemyattacks = GameObject.Instantiate(Enemyattack) as GameObject;

Enemyattackを複製して複製されたEnemyattackをEnemyattacksと定義しています。

Enemyattacks.transform.position = enemy.position;

Enemyattacksの生成場所をenemyの場所にしています。

animator.SetBool(“Attack”, false);

Attack変数をfalseにします。

Destroy(Enemyattacks.gameObject, 1);

Enemyattacksを1秒後に消します。

完成形のスクリプト

using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.AI;//※4 public class Enemy : MonoBehaviour { public GameObject target;//※4 NavMeshAgent agent;//※4 Animator animator;//※4 public GameObject Enemyattack;//※4 public Transform enemy;//※4 void Start() { agent = GetComponent<NavMeshAgent>();//※4 animator = GetComponent<Animator>();//※4 } void Update() { agent.destination = target.transform.position;//※4 } void OnTriggerEnter(Collider collision)//※4 { if (collision.gameObject.tag == “Player”)//※4 { StartCoroutine(“EnemyAttack”);//※4 } } IEnumerator EnemyAttack()//※4 { animator.SetBool(“Attack”, true);//※4 yield return new WaitForSeconds(0.05f);//※4 GameObject Enemyattacks = GameObject.Instantiate(Enemyattack) as GameObject;//※4 Enemyattacks.transform.position = enemy.position;//※4 animator.SetBool(“Attack”, false);//※4 Destroy(Enemyattacks.gameObject, 1);//※4 } }

敵がプレイヤーに向かってくるようにする

テストプレイをしてみると…

敵が主人公に向かって近づいてきて攻撃してきます。

敵のダメージ処理

更にEnemyスクリプトに追記していきます。

変数を宣言する部分の追記内容

public GameObject Explosion;

変数を宣言する部分の説明

public GameObject Explosion;

敵を倒した時に出現させる爆発を定義しています。

衝突判定の記入内容

void OnTriggerEnter(Collider collision)
    { 
     if (collision.gameObject.tag == "Ball")
        {
          GameObject Explosions = GameObject.Instantiate(Explosion) as GameObject;
          Explosions.transform.position = enemy.position;
          Destroy(this.gameObject);  
          Destroy(Explosions.gameObject, 1);
        }
    }

衝突判定の説明

void OnTriggerEnter(Collider collision)

衝突判定を定義しています。オブジェクトがオブジェクトに衝突した時の処理は全部ここに書きます。
因みに書き方は
void OnTriggerEnter(Collider 変数の名前)
で始めて{}で閉じます。

if (collision.gameObject.tag == “Ball”)

衝突した際のオブジェクトについているタグがBallだったらという意味です。この場合はプレイヤーが飛ばす弾を指します。

GameObject Explosions = GameObject.Instantiate(Explosion) as GameObject;

Explosionを複製して複製されたExplosionをExplosionsと定義しています。

Explosions.transform.position = enemy.position;

Explosionsの生成場所をenemyの場所にしています。

Destroy(this.gameObject);

このオブジェクトを消しています。
このオブジェクトとはスクリプトを貼り付けているオブジェクトなので敵を指しています。

Destroy(Explosions.gameObject, 1);

Explosionsを1秒後に消します。爆発のエフェクトが出続けると変なので消しています。

完成形のスクリプト

追記内容は※5と表示しています。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;//※4

public class Enemy : MonoBehaviour
{
    public GameObject target;//※4
    NavMeshAgent agent;//※4
    Animator animator;//※4
    public GameObject Enemyattack;//※4
    public Transform enemy;//※4
    public GameObject Explosion;//※5

void Start()
    {
        agent = GetComponent<NavMeshAgent>();//※4
        animator = GetComponent<Animator>();//※4
    }

    void Update()
    {
        agent.destination = target.transform.position;//※4
    }

void OnTriggerEnter(Collider collision)//※4
    {                
     if (collision.gameObject.tag == "Player")//※4
        {
            StartCoroutine("EnemyAttack");//※4
        }
     if (collision.gameObject.tag == "Ball")//※5
        {
          GameObject Explosions = GameObject.Instantiate(Explosion) as GameObject;//※5
          Explosions.transform.position = enemy.position;//※5
          Destroy(this.gameObject);//※5
          Destroy(Explosions.gameObject, 1);//※5
        }        
    }

IEnumerator EnemyAttack()//※4
    {
        animator.SetBool("Attack", true);//※4
        yield return new WaitForSeconds(0.05f);//※4
        GameObject Enemyattacks = GameObject.Instantiate(Enemyattack) as GameObject;//※4
        Enemyattacks.transform.position = enemy.position;//※4
        animator.SetBool("Attack", false);//※4
        Destroy(Enemyattacks.gameObject, 1);//※4
    }
}

テストプレイをしてみると…


プレイヤーが弾を発射し、それが敵に当たったら倒せました♪

続きはこちら

このサイトについて

ここには、自己紹介やサイトの紹介、あるいはクレジットの類を書くと良いでしょう。

検索

このサイトについて

ここには、自己紹介やサイトの紹介、あるいはクレジットの類を書くと良いでしょう。

検索

-Unity

執筆者:


comment

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

関連記事

Unityでシーンを切り替える

現在のシーンの登録 現在のシーンをセーブして、File → Build Settingsをおします Add Open Scenesをおして、×で閉じます 切り替えるシーンの作成 File → New …

no image

保護中: 出待ちちゃん

この投稿はパスワードで保護されているため抜粋文はありません。

UnityのButtonの使い方

ボタンを作る Create → UI → Buttonをおします ボタンの設定 座標を設定します ※0,0,0にすると画面の中央にきます ①通常時の色 ②マウスカーソルが重なった時の色 ③ボタンがおさ …

no image

Unityでオブジェクトに色をつける【Material】

マテリアルの作成 Create → Materialを選択します マテリアルに名前をつける マテリアルに色をつける inspector部分の色のアイコンをクリックすると色を選択出来るようになります オ …

UnityでTilemapを使って2Dステージを作る

Tilemapとは? マップチップを登録してお手軽に2Dマップが作れるツールです Tilemapに使う素材を入れる

ゲタバコ倶楽部へようこそ

  • 300733総閲覧数:
  • 16今日の閲覧数:
  • 231528総訪問者数:
  • 15今日の訪問者数:

住所
Akita,Japan

営業時間
月~日: 10:00 AM – 10:00 PM

このページはゲタバコ先生の日々思うことや活動、プログラミングの習得方法を発信するページです。
仕事のご依頼、メッセージ等、サービス概要をご覧の上で、お気軽にご連絡ください。

getabakosensei@gmail.com