首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >StartCoroutine仅在游戏启动时启动时才对多个对象起作用。

StartCoroutine仅在游戏启动时启动时才对多个对象起作用。
EN

Stack Overflow用户
提问于 2019-12-08 11:59:01
回答 1查看 187关注 0票数 1

我试着对5个对象应用同样的协同线,当协同线从游戏的第一阶段开始时,五个对象就会这样做,但是当我让它们从其他类开始时,只有一个对象启动协同线。

这是使5个对象启动协同线的代码:

代码语言:javascript
复制
public class NpcMoveRandomly : MonoBehaviour
{
    NavMeshAgent navMeshAgent;
    public float timeForNewPath;
    public bool inCoroutine;
    Vector3 target;

    void Start()
    {
        navMeshAgent = GetComponent<NavMeshAgent>();
    }

    void Update()
    {
        if (!inCoroutine)
        {
            StartCoroutine(MoveRandomly());
        }
    }

    Vector3 getNewRandomPosition()
    {
        float x = Random.Range(-5, 5);
        float z = Random.Range(-5, 5);

        Vector3 pos = new Vector3(x, 0 ,z);
        return pos;
    }

    public IEnumerator MoveRandomly()
    {       
        inCoroutine = true;
        yield return new WaitForSeconds(timeForNewPath);
        GetNewPath();
        inCoroutine = false;

    }

    void GetNewPath()
    {
        target = getNewRandomPosition();
        navMeshAgent.SetDestination(target);
    }
}

现在,只有一个对象的代码启动协同线(我将只显示它们之间的区别):

代码语言:javascript
复制
//public bool inCoroutine; I changed the inCourotine to startCoroutine but the rest of the code is basicly the same
public bool startCoroutine;

void Update()
{
    if (startCoroutine)
    {
        StartCoroutine(MoveRandomly());
    }
}

public IEnumerator MoveRandomly()
{
    startCoroutine = false;
    ...
    ...
    startCoroutine = true;

}

在其他班级:

代码语言:javascript
复制
public NpcMoveRandomly npcMoveRandomly;

public void Method()
{
    npcMoveRandomly.startCoroutine = true;
}

因此,当我使协同线以游戏的lauch开始时,因为inCoroutine默认为false,所以它是可以的,但是当我通过其他类使startCoroutine变为真时,coroutine只适用于1个对象。我真的不知道为什么,也不知道该怎么处理。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-10 13:09:23

在场景中创建一个名为NPCManager的游戏对象,并在那里引用所有的npcs。如果它们在开始时已经存在于场景中,只需将它们拖放到编辑器中并放到您的公共数组中:

代码语言:javascript
复制
class NPCManager{
     public NpcMoveRandomly[] npcList;

     public void Method(){
          foreach(NpcMoveRandomly npc in npcList){
              npc.startCoroutine = true;
          }
     }
}

或者将NPCManager修改为单个实例,并在将它们安装到这个数组/列表之后直接添加npc……无论如何,有很多方法可以做到这一点。

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

https://stackoverflow.com/questions/59235157

复制
相关文章

相似问题

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