2

我正在尝试通过单击使角色跟随移动对象(基本 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;
    }
    
4

1 回答 1

1

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

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

if (!coroutineRunning) 
{
   StartCoroutine(UpdatePosition())`.
}

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

于 2017-09-14T12:53:39.317 回答