AI 路径在 OnTriggerEnter 与 UNITY 时发生变化
AI path changing when OnTriggerEnter with UNITY
在这里分享我的AiPathfinding脚本。我希望我的 AI 在游戏开始时走到目的地(目标)。但是,当 AI 碰撞某个对象时(使用 tag="bullet" 查找)然后我想设置新的目的地。虽然代码没有报错,但是玩AI的时候会先到第一个目的地然后停在那里,即使它在途中与某个物体发生碰撞。
有人可以看看吗?
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Pathfinding;
public class AIPathfinding : MonoBehaviour
{
[SerializeField] public Transform target;
[SerializeField] public Transform target2;
[SerializeField] public float speed = 200f;
[SerializeField] public float nextWayPointDistance = 3f;
[SerializeField] Path path;
[SerializeField] int currentWaypoint = 0;
[SerializeField] bool reachedEndOfPath = false;
[SerializeField] Seeker seeker;
[SerializeField] Rigidbody2D rb;
// Start is called before the first frame update
void Start()
{
seeker = GetComponent<Seeker>();
rb = GetComponent<Rigidbody2D>();
InvokeRepeating("UpdatePath", 0f, 0.5f);
}
private void OnTriggerEnter2D(Collider2D collision)
{
if (collision.gameObject.tag == "bullet")
{
UpdatePath(target2);
}
}
public void UpdatePath(Transform target2)
{
if (seeker.IsDone())
{
seeker.StartPath(rb.position, target.position, OnPathComplete);
}
}
void OnPathComplete(Path p)
{
if (!p.error)
{
path = p;
currentWaypoint = 0;
}
}
void Update()
{
if (path == null)
{
return;
}
if (currentWaypoint >= path.vectorPath.Count)
{
reachedEndOfPath = true;
return;
}
else
{
reachedEndOfPath = false;
}
Vector2 direction = ((Vector2)path.vectorPath[currentWaypoint] - rb.position).normalized;
Vector2 force = direction * speed * Time.deltaTime;
rb.AddForce(force);
float distance = Vector2.Distance(rb.position, path.vectorPath[currentWaypoint]);
if (distance < nextWayPointDistance)
{
currentWaypoint++;
}
}
}
我猜你从未停止过 Coroutine InvokeRepeating("UpdatePath", 0f, 0.5f)。因此,当子弹击中时调用 CancelInvoke() 并更改导引头的目标(再次启动 InvokeRepeating(...))。
我假设 NavMeshAgent.SetDestination(Vector3 position) 在函数 seeker.SetTarget() 中被调用。并以某种方式计算和设置路径。
您也可以将更新路径的主体移动到更新函数中或从那里调用它。没关系间隔。或者在您的自定义间隔中调用它。只需计算下一次你想调用它的时间,如果 nextUpdatePathTime(Time.time 加上你的冷却时间)小于 Time.time 然后调用它并计算下一个 nextUpdatePathTime。
在这里分享我的AiPathfinding脚本。我希望我的 AI 在游戏开始时走到目的地(目标)。但是,当 AI 碰撞某个对象时(使用 tag="bullet" 查找)然后我想设置新的目的地。虽然代码没有报错,但是玩AI的时候会先到第一个目的地然后停在那里,即使它在途中与某个物体发生碰撞。
有人可以看看吗?
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Pathfinding;
public class AIPathfinding : MonoBehaviour
{
[SerializeField] public Transform target;
[SerializeField] public Transform target2;
[SerializeField] public float speed = 200f;
[SerializeField] public float nextWayPointDistance = 3f;
[SerializeField] Path path;
[SerializeField] int currentWaypoint = 0;
[SerializeField] bool reachedEndOfPath = false;
[SerializeField] Seeker seeker;
[SerializeField] Rigidbody2D rb;
// Start is called before the first frame update
void Start()
{
seeker = GetComponent<Seeker>();
rb = GetComponent<Rigidbody2D>();
InvokeRepeating("UpdatePath", 0f, 0.5f);
}
private void OnTriggerEnter2D(Collider2D collision)
{
if (collision.gameObject.tag == "bullet")
{
UpdatePath(target2);
}
}
public void UpdatePath(Transform target2)
{
if (seeker.IsDone())
{
seeker.StartPath(rb.position, target.position, OnPathComplete);
}
}
void OnPathComplete(Path p)
{
if (!p.error)
{
path = p;
currentWaypoint = 0;
}
}
void Update()
{
if (path == null)
{
return;
}
if (currentWaypoint >= path.vectorPath.Count)
{
reachedEndOfPath = true;
return;
}
else
{
reachedEndOfPath = false;
}
Vector2 direction = ((Vector2)path.vectorPath[currentWaypoint] - rb.position).normalized;
Vector2 force = direction * speed * Time.deltaTime;
rb.AddForce(force);
float distance = Vector2.Distance(rb.position, path.vectorPath[currentWaypoint]);
if (distance < nextWayPointDistance)
{
currentWaypoint++;
}
}
}
我猜你从未停止过 Coroutine InvokeRepeating("UpdatePath", 0f, 0.5f)。因此,当子弹击中时调用 CancelInvoke() 并更改导引头的目标(再次启动 InvokeRepeating(...))。
我假设 NavMeshAgent.SetDestination(Vector3 position) 在函数 seeker.SetTarget() 中被调用。并以某种方式计算和设置路径。
您也可以将更新路径的主体移动到更新函数中或从那里调用它。没关系间隔。或者在您的自定义间隔中调用它。只需计算下一次你想调用它的时间,如果 nextUpdatePathTime(Time.time 加上你的冷却时间)小于 Time.time 然后调用它并计算下一个 nextUpdatePathTime。