今日のゲーム デザイン業界では、ゲームのプレイアビリティとインタラクティビティにますます注目が集まっており、ゲーム内のキャラクターのパスファインディングは重要な技術的課題の 1 つです。このブログでは、Unity で NavMesh とコードを使用して、キャラクターがエリア内のパスをランダムに見つけることができる機能を実現する方法について詳しく説明します。コードの実装を以下に示し、その後にコメントとコードの詳細な説明を示します。
using UnityEngine;
using UnityEngine.AI;
using System.Collections;
public class RandomMovement : MonoBehaviour {
public float range = 10.0f; //移动范围
private NavMeshAgent agent;
private Vector3 destination; //目的地
void Start () {
agent = GetComponent<NavMeshAgent>();
SetDestination();
}
void SetDestination() {
Vector3 targetPos = Random.insideUnitSphere * range; //生成一个随机目的地
NavMeshHit hit;
NavMesh.SamplePosition(targetPos, out hit, range, 1); //检查可到达性
destination = hit.position; //保存目的地位置
agent.SetDestination(destination); //设置目的地
}
void Update () {
if(agent.remainingDistance < 0.5f) //如果已经到达
{
SetDestination(); //设置下一个目的地
}
}
}
コードの説明:
- まず、Unity と navmesh の UnityEngine ライブラリと UnityEngine.AI ライブラリをそれぞれインポートしました。
- MonoBehaviour クラスを継承する RandomMovement という名前のクラスが定義されています。
- パブリック変数 range は、キャラクターが移動できる範囲を示すために定義されます。
- NavMeshAgent タイプのプライベート変数エージェントが定義されており、経路探索プロセス中にキャラクターの動きを制御するために使用されます。
- Vector3 タイプのプライベート変数 destination が定義され、キャラクターのターゲット位置を示します。
- Start メソッドでは、GetComponent メソッドを通じてキャラクタの NavMeshAgent コンポーネントを取得し、SetDestination メソッドを呼び出してキャラクタの初期ターゲット位置を設定します。
- SetDestination メソッドでは、まず Random.insideUnitSphere メソッドを通じてターゲットの位置を表すランダムな 3 次元ベクトル targetPos を生成します。
- 次に、NavMesh.SamplePosition メソッドを使用して、ターゲットの位置に到達できるかどうかを確認し、確認結果を NavMeshHit 型のヒット変数に保存します。
- ターゲット位置に到達可能な場合は、hit.position (つまり、ターゲット位置) を宛先変数に保存し、agent.SetDestination メソッドを通じてこの位置に移動するようにキャラクターに指示します。
- Update メソッドでは、キャラクターがターゲット位置に到達したかどうかを監視し、到達した場合は SetDestination メソッドを呼び出して新しいターゲット位置を設定します。
アイデアは非常にシンプルで、Unity の NavMesh と組み合わせると、非常にシンプルで実用的なキャラクターのランダム パスファインディング コードを作成でき、ゲームのプレイアビリティを向上させる必要がある一部のゲームに非常に適しています。