如何让NavMesh Agent停止后继续运动?

问题描述 投票:0回答:1

我是想树敌 巡逻系统,其中每时每刻的守卫 达到停止 10秒,然后 继续 他的动作。我试着把动画从 用isStopped混合树 产自 NavMeshAgent.

EDIT: 我现在的脚本是让特工移动到一个点,然后他停了一段时间,然后只播放步行动画,但他停留在一个地方,我改了几行代码,现在特工在第一次停止后移动,但第二次他停在第二个点,步行动画仍然有效,时间没有减少。

public Transform[] points;
private int destPoint = 0;
public NavMeshAgent agent;
public Animator animator;
public int time;

void Start()
{
    agent = GetComponent<NavMeshAgent>();
    animator = transform.Find("Enemy").GetComponent<Animator>();

    // Disabling auto-braking allows for continuous movement
    // between points (ie, the agent doesn't slow down as it
    // approaches a destination point).
    //agent.autoBraking = false;
}


void GotoNextPoint()
{
    // Returns if no points have been set up
    if (points.Length == 0)
        return;

    // Set the agent to go to the currently selected destination.
    agent.destination = points[destPoint].position;

    // Choose the next point in the array as the destination,
    // cycling to the start if necessary.
    destPoint = (destPoint + 1) % points.Length;
    //agent.speed = 1f;
    //animator.SetFloat("Blend", agent.speed);
}

void Update()
{
    if (agent.remainingDistance == 0f && time == 100000)
    {
        agent.speed = 1f;
        Debug.Log(agent.remainingDistance);
        animator.SetFloat("Blend", 1);
        GotoNextPoint();
    }
    else if (agent.remainingDistance <= 0.5f && agent.remainingDistance != 0f && time == 100000)
    {
        animator.SetFloat("Blend",0);
        agent.enabled = false;
        GotoNextPoint();
    }
    else if(animator.GetFloat("Blend") == 0)
    {
        time--;
    }

    if (time == 99000 && animator.GetFloat("Blend") == 0)
    {
        time = 10000;
        agent.enabled = true;
        agent.isStopped = false;
        animator.SetFloat("Blend", 1);
        agent.autoRepath = true;
        GotoNextPoint();
    }
}

我修改了几行代码,现在特工在第一次停止后移动,但第二次他在第二个点停止,行走动画仍然有效,时间没有减少。

if (time == 99000 && animator.GetFloat("Blend") == 0)
    {
        time = 10000;
        agent.enabled = true;
        agent.isStopped = false;
        animator.SetFloat("Blend", 1);
        //New lines of code
        agent.ResetPath();
        destPoint = (destPoint + 1) % points.Length;
        agent.SetDestination(points[destPoint].position);
    }[enter image description here][1]
c# unity3d navmesh
1个回答
0
投票

首先,我会使用 "SetDestination" 函数,以便设置下一个目的地。

最后你写道。

if (time == 99000 && animator.GetFloat("Blend") == 0)
{
    time = 10000;  *-> needs to be 100000, not 10000*
    agent.enabled = true;
    agent.isStopped = false;
    animator.SetFloat("Blend", 1);
    agent.autoRepath = true;
    GotoNextPoint();
}

你可以使用 "NavMeshAgent.ResetPath" 来重置路径,而不是使用 "autoRepath".

后。"ResetPath",使用 "SetDestination" 内的函数GotoNextPoint()。

还有一件很重要的事情--检查是否有多个点,如果只有一个点,你的守卫就会走在同一个点上。

更多信息,建议查看 Unity NavMeshAgent

© www.soinside.com 2019 - 2024. All rights reserved.