敌人没有遵循路径
Enemy is not following path
我正在使用 Unity 4.6.2f。我正在使用 Physics2D、UnityScript 和 A* 寻路 (http://arongranberg.com/astar/) 免费版本 3.6。我的问题是用我的 EnemyAI 脚本移动敌人,它在 Gizmo 中正确显示路径,但我的敌人没有跟随它。看起来他总是试图到达路径中的第0点,它只是在空中飞舞和摇晃。
EnemyAI 脚本 - 我认为问题可能出在最后 4 行代码中:
import Pathfinding;
@script RequireComponent(Seeker)
@script RequireComponent(Rigidbody2D)
var seeker : Seeker;
var rb : Rigidbody2D;
var path : Path;
var target : Transform;
var updateRate : float = 2f;
var currentWaypoint : int = 0;
var nextWaypointDistance : float;
var pathIsEnded :boolean;
var speed : float = 300f;
var fMode : ForceMode2D;
function Start () {
rb = GetComponent.<Rigidbody2D>();
seeker = GetComponent.<Seeker>();
if (target == null)Debug.LogError("!!!NO PLAYER FOUND!!!");
//Start the path
seeker.StartPath(transform.position, target.position,OnPathComplete);
StartCoroutine(UpdatePath());
}
//function for finding new way when target moves
function UpdatePath() :IEnumerator {
if (target == null) {
//TODO: Insert a player search here.
return;
}
seeker.StartPath (transform.position, target.position, OnPathComplete);
yield WaitForSeconds( 1f/updateRate );
StartCoroutine(UpdatePath());
}
function OnPathComplete (p:Path) {
Debug.Log ("We got a path. Did it have an error? " + p.error);
if (!p.error) {
path = p;
currentWaypoint = 0;
}
}
function FixedUpdate(){
if (target == null) {
//TODO: Insert a player search here.
return;
}
//TODO: Always look at player?
if (path == null)
return;
if (currentWaypoint >= path.vectorPath.Count) {
if (pathIsEnded)
return;
Debug.Log ("End of path reached.");
pathIsEnded = true;
return;
}
pathIsEnded = false;
//Direction to the next waypoint
var dir: Vector3 = (path.vectorPath[currentWaypoint] - transform.position).normalized;
dir *= speed * Time.fixedDeltaTime;
//Move the AI
rb.AddForce (dir, fMode);
Debug.Log(dir);
var dist:float = Vector3.Distance (transform.position, path.vectorPath[currentWaypoint]);
if (dist < nextWaypointDistance) {
currentWaypoint++;
return;
}
}
确实,问题似乎出在最后 4 行。以下是一些可能出错的地方:
- 当您使用 2D 坐标时,您正在使用 Vector3 计算 AI 和目标航路点的距离。确保两个项目在相同的 Z 坐标下工作或仅使用 X 和 Y 坐标计算距离。
- NextWaypointDistance 未设置。如果该值为随机数且为负数,则玩家永远不会"reach"节点
始终检查您的变量是否已初始化,并且在处理 2D 时,不要只忽略 Z 坐标,它有它的用途,它也可能会扰乱您的距离计算。
我正在使用 Unity 4.6.2f。我正在使用 Physics2D、UnityScript 和 A* 寻路 (http://arongranberg.com/astar/) 免费版本 3.6。我的问题是用我的 EnemyAI 脚本移动敌人,它在 Gizmo 中正确显示路径,但我的敌人没有跟随它。看起来他总是试图到达路径中的第0点,它只是在空中飞舞和摇晃。
EnemyAI 脚本 - 我认为问题可能出在最后 4 行代码中:
import Pathfinding;
@script RequireComponent(Seeker)
@script RequireComponent(Rigidbody2D)
var seeker : Seeker;
var rb : Rigidbody2D;
var path : Path;
var target : Transform;
var updateRate : float = 2f;
var currentWaypoint : int = 0;
var nextWaypointDistance : float;
var pathIsEnded :boolean;
var speed : float = 300f;
var fMode : ForceMode2D;
function Start () {
rb = GetComponent.<Rigidbody2D>();
seeker = GetComponent.<Seeker>();
if (target == null)Debug.LogError("!!!NO PLAYER FOUND!!!");
//Start the path
seeker.StartPath(transform.position, target.position,OnPathComplete);
StartCoroutine(UpdatePath());
}
//function for finding new way when target moves
function UpdatePath() :IEnumerator {
if (target == null) {
//TODO: Insert a player search here.
return;
}
seeker.StartPath (transform.position, target.position, OnPathComplete);
yield WaitForSeconds( 1f/updateRate );
StartCoroutine(UpdatePath());
}
function OnPathComplete (p:Path) {
Debug.Log ("We got a path. Did it have an error? " + p.error);
if (!p.error) {
path = p;
currentWaypoint = 0;
}
}
function FixedUpdate(){
if (target == null) {
//TODO: Insert a player search here.
return;
}
//TODO: Always look at player?
if (path == null)
return;
if (currentWaypoint >= path.vectorPath.Count) {
if (pathIsEnded)
return;
Debug.Log ("End of path reached.");
pathIsEnded = true;
return;
}
pathIsEnded = false;
//Direction to the next waypoint
var dir: Vector3 = (path.vectorPath[currentWaypoint] - transform.position).normalized;
dir *= speed * Time.fixedDeltaTime;
//Move the AI
rb.AddForce (dir, fMode);
Debug.Log(dir);
var dist:float = Vector3.Distance (transform.position, path.vectorPath[currentWaypoint]);
if (dist < nextWaypointDistance) {
currentWaypoint++;
return;
}
}
确实,问题似乎出在最后 4 行。以下是一些可能出错的地方:
- 当您使用 2D 坐标时,您正在使用 Vector3 计算 AI 和目标航路点的距离。确保两个项目在相同的 Z 坐标下工作或仅使用 X 和 Y 坐标计算距离。
- NextWaypointDistance 未设置。如果该值为随机数且为负数,则玩家永远不会"reach"节点
始终检查您的变量是否已初始化,并且在处理 2D 时,不要只忽略 Z 坐标,它有它的用途,它也可能会扰乱您的距离计算。