使用 Navmesh 和协程的基本 RTS 运动?
Basic RTS movement using Navmesh & co-routine?
我正在尝试通过单击使角色跟随移动的对象(基本 RTS 移动),而且我听说使用协程比使用 void Update 节省更多的计算能力。但是,我对协同程序很陌生,需要一些帮助。
- 另外,我觉得没有必要包含点击代码,因为它是一个简单的点击然后调用此脚本的函数。
这是我的问题
如果我的角色先使用MoveToPoint()
,然后使用FollowTarget()
将需要玩家点击对象两次才能开始跟随而不是一次,我似乎无法理解为什么..
当玩家多次点击同一个物体时,多次UpdatePosition()
会运行,如何在那个物体上点击一次运行? (我的朋友用力点击一个物体试图让角色走得更快,但显然不会。现在有 10 个协程 运行ning..)
不止一个角色,当另一个角色停止跟随时,似乎另一个角色的套路也停止了。如何让他们单独关注和取消关注而不影响彼此?
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 coroutineRunning
并在开始时将其设置为 false 来避免这种情况。在协程开始时将其设置为 true,而不是在 FollowTarget
中调用 StartCoroutine,而是使用类似
的内容
if (!coroutineRunning)
{
StartCoroutine(UpdatePosition())`.
}
3) 不确定。确保您的脚本 运行 独立用于每个代理。
我正在尝试通过单击使角色跟随移动的对象(基本 RTS 移动),而且我听说使用协程比使用 void Update 节省更多的计算能力。但是,我对协同程序很陌生,需要一些帮助。
- 另外,我觉得没有必要包含点击代码,因为它是一个简单的点击然后调用此脚本的函数。
这是我的问题
如果我的角色先使用
MoveToPoint()
,然后使用FollowTarget()
将需要玩家点击对象两次才能开始跟随而不是一次,我似乎无法理解为什么..当玩家多次点击同一个物体时,多次
UpdatePosition()
会运行,如何在那个物体上点击一次运行? (我的朋友用力点击一个物体试图让角色走得更快,但显然不会。现在有 10 个协程 运行ning..)不止一个角色,当另一个角色停止跟随时,似乎另一个角色的套路也停止了。如何让他们单独关注和取消关注而不影响彼此?
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 coroutineRunning
并在开始时将其设置为 false 来避免这种情况。在协程开始时将其设置为 true,而不是在 FollowTarget
中调用 StartCoroutine,而是使用类似
if (!coroutineRunning)
{
StartCoroutine(UpdatePosition())`.
}
3) 不确定。确保您的脚本 运行 独立用于每个代理。