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 GameObject[] allObjects;
public void Compare()
{
allObjects = FindObjectsOfType<GameObject>();
foreach (GameObject go in allObjects)
{
Debug.Log(go.name + " >>>>> " + go.scene.name + " >>>>> is active object");
StartCoroutine(Comparing());
}
}
IEnumerator Comparing()
{
yield return new WaitForSeconds(waitTime);
}
}
我们的想法不是阻塞整个编辑器并等待foreach
循环结束,而是让它在第一个项目上循环等待一秒钟,然后继续下一个项目,依此类推。
现在的情况是,它会阻塞编辑器,冻结它,直到循环结束。
到目前为止,我所做的并不是很好:
我为检查器中的一个按钮创建了一个新的编辑器脚本:
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();
}
}
}
然后在比较对象中:
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);
}
}
}
}
但是它只做一个对象,而不是所有的对象。
发布于 2019-10-07 01:57:51
StartCoroutine的行为方式与启动新线程的方式相同,所以当您调用Compare
时,您所做的就是循环访问游戏对象并创建事件对象,而这些对象在主线程中运行时,不会阻止创建它的方法运行,所以最终只有新的事件对象等待指定的时间,而main方法继续循环访问其余的游戏对象并创建更多的事件对象,sins它本身并没有调用任何睡眠函数,相反,您应该这样做:
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;
StartComparing
将启动一个Compare
协程,它将遍历所有对象,因此,首先是对象,然后等待指定的waitTime
,然后是第二个对象,依此类推,直到StopComparing
被调用。
测试了代码,这里是它的一个小的(字面上的)预览,你会看到在改变速度后,它记录对象变慢了:
https://stackoverflow.com/questions/58262532
复制相似问题