首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基本的RTS运动使用Navmesh和协同例程?

基本的RTS运动使用Navmesh和协同例程?
EN

Stack Overflow用户
提问于 2017-09-14 12:05:16
回答 1查看 386关注 0票数 2

我试图通过单击移动对象(基本RTS运动)来使字符跟随移动对象,而且我听说使用协同例程比使用void节省了更多的计算能力。不过,我还不太熟悉日常生活,我需要一些帮助。

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

这是我的问题

  1. 如果我的角色首先使用MoveToPoint(),那么使用FollowTarget()将需要玩家点击对象两次才能开始跟踪,而不是一次,我似乎不知道为什么。
  2. 当播放器在同一对象上单击多个时间时,多个UpdatePosition()将运行,如何使它在该对象上运行一次?(我的朋友大力点击一个物体,试图使字符走得更快,而它显然不是。)现在大约有10条共同例行的运行
  3. 有不止一个字符,当另一个字符停止时,似乎另一个角色的共同例程也停止了。我如何让他们跟随&不要单独跟随,而不影响彼此? void () { agent = GetComponent();} IEnumerator UpdatePosition() { while(true) {产生返回新的WaitForSeconds(0.5f);if (目标!= null) { agent.SetDestination(target.position);Debug.Log(“仍然循环”);}WaitForSeconds{Debug.Log(“不循环!”);}Debug.Log(“已完成的协同例程!”);}公共空MoveToPoint (Vector3点){agent.SetDestination(点);}公共空FollowTarget(可插入的newTarget) { agent.stoppingDistance = newTarget.radius * .8f;StartCoroutine(UpdatePosition ();target = newTarget.transform;} public void StopFollowingTarget (){ StopCoroutine(UpdatePosition());agent.stoppingDistance = 0f;target = null;}}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-09-14 12:53:39

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

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

代码语言:javascript
复制
if (!coroutineRunning) 
{
   StartCoroutine(UpdatePosition())`.
}

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46218661

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档