gpt4 book ai didi

c# - 使用 Navmesh 和协程的基本 RTS 运动?

转载 作者:太空宇宙 更新时间:2023-11-03 12:23:28 27 4
gpt4 key购买 nike

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

  • 另外,我觉得没有必要包含点击代码,因为它是一个简单的点击然后调用此脚本的函数。

这是我的问题

  1. 如果我的角色先使用 MoveToPoint(),然后使用 FollowTarget() 将需要玩家点击对象两次才能开始跟随,而不是一次,我似乎无法弄清楚为什么..

  2. 当玩家多次点击同一个对象时,多个 UpdatePosition() 将运行,如何让它在那个对象上运行一次? (我的 friend 用力点击一个物体,试图让角色走得更快,但显然不会。现在有大约 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) 你必须点击两次的原因可能是因为在你的协同程序中你先等待半秒然后才更新目的地。考虑将 yield return new WaitForSeconds(0.5) 移动到 while 循环的末尾。

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

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

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

关于c# - 使用 Navmesh 和协程的基本 RTS 运动?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46218661/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com