玩家未移动到所有航路点。

时间:2018-11-23 05:22:07

标签: c# visual-studio unity3d

敌方角色未移至第三个航路点。移至航路点2后,它将停止并播放空闲动画。角色上有一个NavMeshAgent,当他到达航路点时,似乎未触发到达目的地事件。如果有人遇到过这样的情况,我将不胜感激。几个小时以来,我一直在试图找出问题所在,并且开始认为这可能不是任何脚本。

这是航点控制器

using UnityEngine;
using UnityEngine.AI; 

public class WaypointController : MonoBehaviour {

    Waypoints[] waypoints;
    public Transform target; 
    //NavMeshPath path; 
    int currentWaypointIndex = -1;
    //private NavMeshAgent agent;
    //EnemyCharacter enemy; 

    public event System.Action<Waypoints> OnWaypointChanged;

    // Use this for initialization
    void Awake () {

        waypoints = GetWaypoints();

    }

    public void SetNextWaypoint() {

        if (currentWaypointIndex != waypoints.Length)
            currentWaypointIndex++;

        if (currentWaypointIndex == waypoints.Length)
            currentWaypointIndex = 0;

        if (OnWaypointChanged != null)
            OnWaypointChanged(waypoints[currentWaypointIndex]);
        //Debug.Log("OnWaypointChanged == null: " + (OnWaypointChanged == null));
        //Debug.Log("OnWaypointChanged != null: " + (OnWaypointChanged != null));

    }
    Waypoints[] GetWaypoints()
    {
        return GetComponentsInChildren<Waypoints>();

    }
    private void OnDrawGizmos()
    {
        Gizmos.color = Color.red;

        Vector3 previousWaypoint = Vector3.zero;
        foreach (var waypoint in GetWaypoints())
        { 
            Vector3 waypointPosition = waypoint.transform.position; 
            Gizmos.DrawWireSphere(waypointPosition, .2f);
            if (previousWaypoint != Vector3.zero)
                Gizmos.DrawLine(previousWaypoint, waypointPosition);
            previousWaypoint = waypointPosition;
        }
    }
}

这是EnemyPatrolPoints脚本

using UnityEngine;

[RequireComponent(typeof(AI_PathFinder))]
public class EnemyPatrolPoints : MonoBehaviour {

    [SerializeField]
    WaypointController waypointController;

    [SerializeField]
    float waitTimeMin;

    [SerializeField]
    float waitTimeMax;

    AI_PathFinder pathfinder;

    private void Start()
    {
        waypointController.SetNextWaypoint(); 
    }

    private void Awake()
    {
        pathfinder = GetComponent<AI_PathFinder>();
        pathfinder.OnDestinationReached += Pathfinder_OnDestinationReached;
        waypointController.OnWaypointChanged += WaypointController_OnWaypointChanged;
    }
    private void WaypointController_OnWaypointChanged(Waypoints waypoint)
    {
        pathfinder.SetTarget(waypoint.transform.position);
        print("waypoint changed"); 
    }
    private void Pathfinder_OnDestinationReached()
    {
        SealForce_GameManager.Instance.Timer.Add(waypointController.SetNextWaypoint, Random.Range(waitTimeMin, waitTimeMax));
        print("destination reached"); 
    }   
}

这是AI Pathfinder脚本`

using UnityEngine;
using UnityEngine.AI;

[RequireComponent(typeof(NavMeshAgent))]
public class AI_PathFinder : MonoBehaviour
{

    [HideInInspector]
    public NavMeshAgent agent;
    public EnemyPatrolPoints enemyPatrolPoints;

    [SerializeField] float distanceRemainingThreshold;

    bool m_destinationReached;
    bool destinationReached
    {
        get
        { return m_destinationReached; }

        set
        {
            m_destinationReached = value;

            if (m_destinationReached)
            {
                if (OnDestinationReached != null)
                    OnDestinationReached();
            }
        }
    }

    public event System.Action OnDestinationReached;

    void Start()
    {
        agent = GetComponent<NavMeshAgent>();
        //enemyPatrolPoints = GetComponent<EnemyPatrolPoints>();
    }
    public void SetTarget(Vector3 target)
    {
        agent.SetDestination(target);
    }

    void Update()
    {
        if (destinationReached)
            return;

        if (agent.remainingDistance < distanceRemainingThreshold)
            destinationReached = true;


    }
}

1 个答案:

答案 0 :(得分:2)

线条

if (agent.remainingDistance < distanceRemainingThreshold)
    destinationReached = true;
由于{p>,destinationReached一直是true时,永远不会到达

if (destinationReached)
    return;

您要在到达第一个航路点后将其设置为true,然后再将其重置为false,以便以后始终跳过Update

您应该添加它,例如

public void SetTarget(Vector3 target)
{
    agent.SetDestination(target);
    destinationReached = false;
}
相关问题