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。