C# 如何在特定时间后在每个对象上循环?

C# 如何在特定时间后在每个对象上循环?,c#,unity3d,C#,Unity3d,然后在比较对象中: using UnityEngine; using System.Collections; using UnityEditor; [CustomEditor(typeof(CompareObjects))] public class CompareObjectsButton : Editor { public override void OnInspectorGUI() { DrawDefaultInspector(); Co

然后在比较对象中:

using UnityEngine;
using System.Collections;
using UnityEditor;

[CustomEditor(typeof(CompareObjects))]
public class CompareObjectsButton : Editor
{
    public override void OnInspectorGUI()
    {
        DrawDefaultInspector();

        CompareObjects myTarget = (CompareObjects)target;

        if (GUILayout.Button("Compare Objects"))
        {
            myTarget.StartComparing();
        }
    }
}
使用系统;
使用系统集合;
使用System.Collections.Generic;
使用System.Linq;
运用系统反思;
使用UnityEditor;
使用UnityEngine;
公共类比较对象:单行为
{
公共浮动等待时间;
专用协程比较器;
私有游戏对象[]所有对象;
公共无效开始比较()
{
if(比较器==null)
{
比较器=启动例程(Compare());
}
}
公开作废停止比较()
{
if(比较器!=null)
{
StopCorroutine(比较器);
比较器=null;
}
}
IEnumerator比较()
{
while(true)
{
allObjects=FindObjectsOfType();
foreach(游戏对象进入AllObject)
{
Debug.Log(go.name+“>>>>>”+go.scene.name+“>>>>>>是活动对象”);
返回新的WaitForSeconds(waitTime);
}
}
}
}

但是它只做一个对象,而不是所有的对象。

启动例程的方式与启动一个新线程的方式相同,因此当你调用
Compare
时,你所做的只是在游戏对象中循环,并创建事件对象,当在主线程中运行时,不要阻止创建它的方法运行,因此最终只有新的事件对象等待指定的时间,而主方法继续循环通过其余的游戏对象并创建更多的事件对象,因为它本身没有调用任何睡眠函数,所以您应该这样做:

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using UnityEditor;
using UnityEngine;

public class CompareObjects : MonoBehaviour
{
    public float waitTime;

    private Coroutine comparer;
    private GameObject[] allObjects;

    public void StartComparing()
    {
        if (comparer == null)
        {
            comparer = StartCoroutine(Compare());
        }
    }

    public void StopComparing()
    {
        if (comparer != null)
        {
            StopCoroutine(comparer);

            comparer = null;
        }
    }

    IEnumerator Compare()
    {
        while (true)
        {
            allObjects = FindObjectsOfType<GameObject>();

            foreach (GameObject go in allObjects)
            {
                Debug.Log(go.name + " >>>>> " + go.scene.name + " >>>>> is active object");

                yield return new WaitForSeconds(waitTime);
            }
        }
    }
}
public void StartComparing()
{
if(比较器==null)
{
比较器=启动例程(Compare());
}
}
公开作废停止比较()
{
if(比较器!=null)
{
StopCorroutine(比较器);
比较器=null;
}
}
IEnumerator比较()
{
while(true)
{
allObjects=FindObjectsOfType();
foreach(游戏对象进入AllObject)
{
Debug.Log(go.name+“>>>>>”+go.scene.name+“>>>>>>是活动对象”);
返回新的WaitForSeconds(waitTime);
}
}
}
专用协程比较器;
私有游戏对象[]所有对象;
公共浮动等待时间;
StartComparing
将启动一个
Compare
的协同程序,该程序将遍历所有对象,因此,第一个对象然后等待指定的
waitTime
然后是第二个对象,依此类推,直到调用
StopComparing
为止

测试代码后,这里是它的一个小预览(字面意思),您将看到在更改记录对象的速度后,它记录对象的速度会变慢:


我试过了,但它只在一个对象上循环并停止。我将用我所做的来编辑我的问题。@DanielLip调用
FindObjectsOfType()
后,你得到了多少对象,你将
waitTime
字段设置为什么,因为它看起来没有被设置为任何值?@DanielLip代码对我来说很好,我可以改变每个物体被比较的速度,它通过所有物体,而不仅仅是一个物体。将生成一个gif并将其放入答案中,以便您查看。
start例程基本上创建了一个新线程
,这在技术上是错误的!协同程序在主线程中运行,更像是一个附加的临时
Update
方法。。它与线程无关!如果它真的是线程,你甚至不能使用
FindObjectOfType
Debug.Log
之类的东西,因为它们只允许在主线程中使用;)@DanielLip AFAIK不,不玩场景是无法让它工作的。你发布的代码应该可以列出所有的游戏对象,不知道为什么你只看到一个。此外,如果您使用此代码获得帧丢弃,可能是因为这一行
allObjects=FindObjectsOfType()不是指纹。FindObjectsOfType函数非常慢(我的意思是非常慢),甚至可以更快地解析层次结构。另外要考虑的是,如果你可以重构你的GOS是父母的孩子,利用层,或标签来比较较少的对象。此外,您可能需要查看作业系统。
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using UnityEditor;
using UnityEngine;

public class CompareObjects : MonoBehaviour
{
    public float waitTime;

    private Coroutine comparer;
    private GameObject[] allObjects;

    public void StartComparing()
    {
        if (comparer == null)
        {
            comparer = StartCoroutine(Compare());
        }
    }

    public void StopComparing()
    {
        if (comparer != null)
        {
            StopCoroutine(comparer);

            comparer = null;
        }
    }

    IEnumerator Compare()
    {
        while (true)
        {
            allObjects = FindObjectsOfType<GameObject>();

            foreach (GameObject go in allObjects)
            {
                Debug.Log(go.name + " >>>>> " + go.scene.name + " >>>>> is active object");

                yield return new WaitForSeconds(waitTime);
            }
        }
    }
}
public void StartComparing()
{
    if (comparer == null)
    {
        comparer = StartCoroutine(Compare());
    }
}

public void StopComparing()
{
    if (comparer != null)
    {
        StopCoroutine(comparer);

        comparer = null;
    }
}

IEnumerator Compare()
{
    while (true)
    {
        allObjects = FindObjectsOfType<GameObject>();

        foreach (GameObject go in allObjects)
        {
            Debug.Log(go.name + " >>>>> " + go.scene.name + " >>>>> is active object");

            yield return new WaitForSeconds(waitTime);
        }
    }
}

private Coroutine comparer;

private GameObject[] allObjects;

public float waitTime;