はじめに
今回はUnityで、プレーヤー(Cube)が敵キャラ(Sphere)の検出範囲に入った時に色を変え、追いかけるようにする方法を説明します。さらに、プレーヤーが範囲外に出ると敵キャラの追跡が停止する仕組みを作ります。
必要な知識
- Unityの基本的な操作方法
- C#の基礎知識
ステップ1: Unityプロジェクトの準備
- Unity Hubを開き、「New Project」を選択します。
- プロジェクトのテンプレートとして「3D」を選択し、プロジェクト名を入力して「Create」をクリックします。
![](https://cbagames.jp/wp-content/uploads/2024/01/2024-01-27_184016.png)
ステップ2: オブジェクトの配置
- UnityエディタのHierarchyビューで右クリックし、「3D Object」→「Cube」を選択してプレーヤーオブジェクトを作成します。Rigidbodyコンポーネントを追加して、isGravityのチェックを外しておきます。
- 同様にして、「3D Object」→「Sphere」を選択し、敵キャラオブジェクトを作成します。
![](https://cbagames.jp/wp-content/uploads/2024/02/2024-02-17_165839.png)
ステップ3:危険エリアの作成
新しく空のオブジェクト(CautionArea)を作成して、Spherecoliderを追加します。
inspector画面からistriggerにチェックを入れます。CubeとSphereの中間に配置して、「コライダーの編集」でSpherecoliderを拡大します。
![](https://cbagames.jp/wp-content/uploads/2024/02/2024-02-17_171814.png)
ステップ4: プレイヤーの動作スクリプト
- 「Cube」オブジェクトを選択し、Inspectorビューで「Add Component」→「New Script」を選択します。スクリプト名を「CubeMove」として「Create and Add」をクリックします。
- 作成した「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
は右方向を示し、これにspeed
とTime.deltaTime
(前フレームからの経過時間)を乗じることでフレームレートに依存しない滑らかな移動を実現します。
トリガーエリアの検出
OnTriggerStay
とOnTriggerExit
は、トリガーコライダーを使用して特定のエリアにオブジェクトが存在するかを検出するメソッドです。これらは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;
}
}
}
実行してみる
これで設定は完了です。ゲームを再生して、プレーヤーが敵キャラの検出範囲に入ると、敵キャラが色を変えて追いかける様子を確認できます。範囲外に出ると追跡が停止し、元の色に戻ります。