スポンサーリンク
スポンサーリンク
UnityUnityメモ

Unityで プレーヤーが近づくと追いかけてくる敵キャラの作り方

Unity

はじめに

今回はUnityで、プレーヤー(Cube)が敵キャラ(Sphere)の検出範囲に入った時に色を変え、追いかけるようにする方法を説明します。さらに、プレーヤーが範囲外に出ると敵キャラの追跡が停止する仕組みを作ります。

必要な知識

  • Unityの基本的な操作方法
  • C#の基礎知識

ステップ1: Unityプロジェクトの準備

  1. Unity Hubを開き、「New Project」を選択します。
  2. プロジェクトのテンプレートとして「3D」を選択し、プロジェクト名を入力して「Create」をクリックします。

ステップ2: オブジェクトの配置

  1. UnityエディタのHierarchyビューで右クリックし、「3D Object」→「Cube」を選択してプレーヤーオブジェクトを作成します。Rigidbodyコンポーネントを追加して、isGravityのチェックを外しておきます。
  2. 同様にして、「3D Object」→「Sphere」を選択し、敵キャラオブジェクトを作成します。

ステップ3:危険エリアの作成

新しく空のオブジェクト(CautionArea)を作成して、Spherecoliderを追加します。

inspector画面からistriggerにチェックを入れます。CubeとSphereの中間に配置して、「コライダーの編集」でSpherecoliderを拡大します。

ステップ4: プレイヤーの動作スクリプト

  1. 「Cube」オブジェクトを選択し、Inspectorビューで「Add Component」→「New Script」を選択します。スクリプト名を「CubeMove」として「Create and Add」をクリックします。
  2. 作成した「CubeMove」スクリプトをダブルクリックし、コードエディタを開きます。


このCubeMoveスクリプトは、Unityで作成された3Dオブジェクト(この場合は「Cube」と呼ばれるプレーヤーオブジェクト)の動きを制御し、特定のエリア(”CautionArea”と名付けられたトリガーエリア)への進入と退出を検出するためのものです。具体的な機能とコードの解説は以下の通りです。

動きの制御

  • public bool invaded;invaded変数は、プレーヤーが「CautionArea」に侵入しているかどうかを追跡するためのブール型(trueまたはfalse)変数です。
  • private float speed = 3.0f;speed変数は、オブジェクトの移動速度を制御します。この値は秒速3ユニットに設定されています。

Updateメソッド

  • Updateメソッドは、毎フレーム呼び出されるメソッドで、プレーヤーの入力に基づいてオブジェクトを動かします。
  • Input.GetKey(KeyCode.UpArrow)やその他の矢印キーを使用することで、キーボードの矢印キーが押されたときにオブジェクトを特定の方向に動かします。transform.upはオブジェクトの上方向、transform.rightは右方向を示し、これにspeedTime.deltaTime(前フレームからの経過時間)を乗じることでフレームレートに依存しない滑らかな移動を実現します。

トリガーエリアの検出

  • OnTriggerStayOnTriggerExitは、トリガーコライダーを使用して特定のエリアにオブジェクトが存在するかを検出するメソッドです。これらはColliderコンポーネントがアタッチされたオブジェクトがトリガーエリアに入ったり出たりすることを検出するために使われます。
  • OnTriggerStayメソッドは、オブジェクトが「CautionArea」という名前のトリガーエリア内に滞在している間、毎フレーム呼び出されます。このエリア内にいる間、invaded変数がtrueに設定されます。
  • OnTriggerExitメソッドは、オブジェクトが「CautionArea」を離れると呼び出され、invaded変数をfalseに戻します。
using UnityEngine;

public class CubeMove : MonoBehaviour
{
    public bool invaded;
    private float speed = 3.0f;

    void Update()
    {
        if (Input.GetKey(KeyCode.UpArrow))
        {
            transform.position += transform.up * speed * Time.deltaTime;
        }
        if (Input.GetKey(KeyCode.DownArrow))
        {
            transform.position -= transform.up * speed * Time.deltaTime;
        }
        if (Input.GetKey(KeyCode.RightArrow))
        {
            transform.position += transform.right * speed * Time.deltaTime;
        }
        if (Input.GetKey(KeyCode.LeftArrow))
        {
            transform.position -= transform.right * speed * Time.deltaTime;
        }
    }

    void OnTriggerStay(Collider other)
    {
        if (other.gameObject.name == "CautionArea")
        {
            invaded = true;
        }
    }

    void OnTriggerExit(Collider other)
    {
        if (other.gameObject.name == "CautionArea")
        {
            invaded = false;
        }
    }
}

ステップ5: Enemyの動作スクリプト

新しくC#スクリプトを作成し、名前をSphereChaseに変更します。

SphereChaseスクリプトに以下のC#コードを記述します。

このSphereChaseスクリプトは、特定の条件下で「Sphere」(球体)オブジェクトが「Cube」(立方体)オブジェクトを追いかける動作を実現することです。以下に、スクリプトの主要な部分を解説します。

変数の定義

  • private GameObject target;:追跡する対象のGameObjectを参照するための変数です。この場合、「Cube」オブジェクトが追跡対象になります。
  • private float sphereSpeed = 3.0f;:Sphereの移動速度を定義しています。値は秒速3ユニットと設定されています。

Start メソッド

  • void Start()メソッドは、ゲーム開始時に一度だけ実行されます。ここでは、GameObject.Find("Cube")を使ってシーン内から「Cube」という名前のGameObjectを探し、それを追跡対象(target変数)として設定しています。

Update メソッド

  • void Update()メソッドは、毎フレーム実行されます。ゲームのロジックをここに書くことで、動的な挙動を実現します。
  • if (target.GetComponent<CubeMove>().invaded == true):この条件文は、「Cube」オブジェクトのCubeMoveスクリプトのinvaded変数がtrueかどうかをチェックします。これは、Cubeが特定のエリア(例: “CautionArea”)内にいるかどうかを判断するために使用されます。
  • GetComponent<Renderer>().material.color = Color.red;:条件がtrueの場合、Sphereの色を赤色に変更します。これは、追跡が開始されたことを視覚的に示します。
  • transform.LookAt(target.transform);:Sphereが常にCubeの方向を向くようにします。
  • transform.position += transform.forward * sphereSpeed * Time.deltaTime;:Sphereを前方に移動させ、その速度をsphereSpeed変数で調整します。Time.deltaTimeを使うことで、フレームレートに依存しない滑らかな移動を実現しています。
  • elseブロックでは、Cubeが検出範囲外に出た場合にSphereの色を白に戻します。

このスクリプトは、シンプルな追跡メカニズムを実装するための基礎を提供します。CubeMoveスクリプトと組み合わせることで、プレイヤーが特定のエリアに侵入したときに敵キャラクターが追跡を開始し、エリアを離れると追跡を停止する動作を簡単に作成できます。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class SphereChase : MonoBehaviour
{
    private GameObject target;
    private float sphereSpeed = 3.0f;

    void Start()
    {
        target = GameObject.Find("Cube");
    }

    void Update()
    {
        if (target.GetComponent<CubeMove>().invaded == true)
        {
            GetComponent<Renderer>().material.color = Color.red;
            transform.LookAt(target.transform);
            transform.position += transform.forward * sphereSpeed * Time.deltaTime;
        }
        else
        {
            GetComponent<Renderer>().material.color = Color.white;
        }
    }
}

実行してみる

これで設定は完了です。ゲームを再生して、プレーヤーが敵キャラの検出範囲に入ると、敵キャラが色を変えて追いかける様子を確認できます。範囲外に出ると追跡が停止し、元の色に戻ります。

スポンサーリンク
C-BA memo
タイトルとURLをコピーしました