使用Navmesh& amp;的基本RTS运动协同例程?

时间:2017-09-14 12:05:16

标签: c# unity3d coroutine navmesh

我试图让角色通过点击它来跟踪移动物体(基本RTS移动),并且我听说使用协同例程比使用void Update节省更多的计算能力。但是,我很常见,我需要一些帮助。

  • 此外,我觉得不需要包含点击代码,因为它只是一个简单的点击,然后调用此脚本的功能。

以下是我的问题

  1. 如果我的角色首先使用MoveToPoint(),那么使用FollowTarget()需要玩家点击对象两次以开始关注而不是一次,我似乎无法弄清楚为什么..

  2. 当玩家多次点击同一个对象时,会运行多个UpdatePosition(),如何让它在该对象上运行一次? (我的朋友大力点击一个物体,试图让角色走得更快,但显然没有。现在就像10个常规跑步一样......)

  3. 有一个以上的角色,当另一个角色跟随时,似乎另一个角色的共同例程也停止了。我如何让他们跟随&单独取消关注而不会相互影响?

    void Start () 
    {
        agent = GetComponent<NavMeshAgent>();
    }
    
    IEnumerator UpdatePosition()
    {
        while(true)
        {
            yield return new WaitForSeconds(0.5f);
            if (target != null)
            {
                agent.SetDestination(target.position);
                Debug.Log("Still looping");
            }
            else
            {
                Debug.Log("Not looping!");
            }
        }
        Debug.Log("Finished Co-routine!");
    }
    
    public void MoveToPoint (Vector3 point)
    {
        agent.SetDestination(point);
    }
    
    public void FollowTarget(Interactable newTarget)
    {
        agent.stoppingDistance = newTarget.radius * .8f;
        StartCoroutine(UpdatePosition());
        target = newTarget.transform; 
    }
    
    public void StopFollowingTarget ()
    {
        StopCoroutine(UpdatePosition());
        agent.stoppingDistance = 0f;
        target = null;
    }
    

1 个答案:

答案 0 :(得分:1)

1)你必须点击两次的原因可能是因为在你的协程中你先等待半秒钟才会更新目的地。考虑将yield return new WaitForSeconds(0.5)移动到while循环的末尾。

2)这是因为每次拨打FollowTarget()时都会调用StartCoroutine。您可以通过使用布尔值(例如bool coroutineRunning)并在开始时将其设置为false来避免这种情况。在协程开头将其设置为true,而不是在FollowTarget中调用StartCoroutine,使用类似

的内容
if (!coroutineRunning) 
{
   StartCoroutine(UpdatePosition())`.
}

3)不确定。确保您的脚本独立地为每个代理运行。