Unityでゲーム、アプリ開発

Unityで初めてゲームやアプリを作る人のための支援ブログです。

Unity 敵キャラが範囲内に入ってきたら追いかけるようにしよう 3Dゲーム作り③

今日も憂鬱で心配な日々が続きます。
どうも、ゆうき病んです。

あ、間違えましたゆうきやんです。
最近曜日を間違えてゴミ出しに行きました。

ゆうきやんです。

どうでもいい話は置いといて本題に入っていきましょう!


敵キャラが範囲内に入ってきたら追いかけるようにしよう!

f:id:Phoenix9056:20200229224458j:plain

今回は前回のパートの続きになります。
初めての方は必要な部分だけ見てくれると幸いです。
※前回のパートの記事は下記になります。
www.unityprogram.info

気分を上げていくために
背景と音をつけてみましょう!
別に必要ないよって人は次に進んでください。
※背景の付け方は下記記事を参考にしてください。
www.unityprogram.info

BGMの付け方は下記記事を参考にしてください。
www.unityprogram.info


f:id:Phoenix9056:20200403085957j:plain

次に、敵キャラクターとして今回は
ゾンビを使っていくので、エディタ上部にある、
Window⇨Asset StoreからZombie
インポートしてください。
※一応下記リンクを貼っておきます。
assetstore.unity.com


f:id:Phoenix9056:20200403095502j:plain

エディタ画面に戻って、上部にある①のWindow⇨AI⇨Navigationをクリックします。
次に、②のBakeをクリックして③のBakeをクリックでNavigation
適応される範囲を反映させます。
※フィールドの範囲が大きいと反映まで時間がかかります。

Bake Agent Sizeの設定Agent Radius⇨エージェントの半径。
Agent Height⇨エージェントの高さ。
Max Slope⇨エージェントが登れる坂道の最大角度。
Step Height⇨階段など、エージェントが超えられる段差の最大値。


f:id:Phoenix9056:20200403093058j:plain

インポートした①のZombieの▶︎をクリックして
②のPrefabsをクリックします。
③のZombie1を④のScene内にドラッグ&ドロップしてください。

Inspector内にあるAnimator内の⑤のControllerの◉を
選択してNoneをクリックしてください。
既存のContorollerZombie内にある色々なアニメーションを
繰り返すだけなので消しておきましょう。

ZombieInspectorの一番下にあるAdd Componentをクリックして
Box ColliderNav Mash Agentを追加して、
Nav Mesh AgentSpeedにしましょう。

次に⑥にあるスクリプトを作っていきます。
Add Component⇨New Scriptから作成するか、
Project内の好きな所で右クリック⇨Create⇨C# Scriptから作成して
Zombie1にドラッグ&ドロップ(アタッチ)してください。

スクリプトの名前をMoveEnemyにします。
次のコードをコピー&ペーストするか同じように記述してください。



using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//UnityEngineでAIコードを使えるようにするよ。
using UnityEngine.AI;

//このスクリプトをアタッチすると自動的にNavMeshAgentを追加するよ!
[RequireComponent(typeof(NavMeshAgent))]

public class EnemyMove : MonoBehaviour
{
    //NavMeshAgent型を変数a_agentで宣言します。
    private NavMeshAgent a_agent;
    
    void Start()
    {
        //GetComponentでNavMeshAgentを取得して変数a_agentで参照します。
        a_agent = GetComponent<NavMeshAgent>();
    }

    //CollisionEnemyスクリプトのOnTrrigerStayにセットし、衝突判定を受け取るメソッド。
    public void OnDetectObject(Collider collider)
    {
        //検知したオブジェクトにPlayerタグがついていた時の処理。
        if (collider.CompareTag("Player"))
        {
            //Playerのコライダーの位置を取得して追いかけます。
            a_agent.destination = collider.transform.position;
        }
    }
    
}


f:id:Phoenix9056:20200403203008j:plain

Hierarchy内にあるQuery-Chanをクリックして
Inspector内にあるTagをクリックして
Playerに変更しましょう。

敵キャラクターが追いかけるObjectの認識が
出来るようになります。


f:id:Phoenix9056:20200403203841j:plain

次に、Hierarchy内にあるZombie1の①の余白部分で
右クリック⇨Create Empty⇨GameObjectZombie1子Objectにして作成します。
名前をEnemyCollisionにしましょう。

EnemyCollisionのInspectorの一番下にあるAdd Componentをクリックして、
②にあるSphere Colliderを追加してください。
次に、③のRadiusの値を4に設定してColliderの範囲を大きくします。

②にあるスクリプトをまた同じような手順で作ってください。
名前をEnemyCollisionにします。
次のコードをコピー&ペーストするか同じ記述にしてください。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//UnityEngineでEventsのコードを使えるようにするよ。
using UnityEngine.Events;

//スクリプトを追加した時に自動でColliderを追加するよ!
[RequireComponent(typeof(Collider))]

public class EnemyCollision : MonoBehaviour
{
    //SerializeFieldでUnityEventをInspectorから使えるようにします。
    //UnityEvent型の変数onTriggerStayを宣言します。
    //それを新しくnew UnityEvent()と宣言するよ!
    [SerializeField] private UnityEvent onTriggerStay = new UnityEvent();

    private void OnTriggerStay(Collider other)
    {
        //onTriggerStayで指定された処理を実行します。
        onTriggerStay.Invoke();
    }

    //InspectorでOnTriggerStay()を実際に表示させて使えるようにします。
    [SerializeField]
    public class TriggerEvent : UnityEvent<Collider>
    {
    }
}

そうしたら④の部分にHierarchy内にある⑤のZombie1をドラッグ&ドロップします。
※すみません、⑤を何故だか2つ作ってしまったので左上の⑤でお願いします泣

次に右下の⑤をクリックしてEnemyMove⇨OnDetectObject(Collider)を選択します。
最後に、⑥の所にHierarchy内にあるQuery-Chanをドラッグ&ドロップしてください。

これで完成です!再生してみましょう!

f:id:Phoenix9056:20200403212845g:plain

範囲内に入ると敵キャラが追いかけてきましたね!

次回は敵キャラにもアニメーションをつけて
攻撃してくるようにします。

ご視聴ありがとうございました!!


※3Dゲーム作り編は下記カテゴリを参照してください。
www.unityprogram.info

※Unity学習していきたい方は下記カテゴリを参考にしてください。
www.unityprogram.info

※初心者編は下記カテゴリから。
www.unityprogram.info

※オススメのアセットは下記カテゴリから見てください!
www.unityprogram.info