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;