首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何在特定时间后遍历每个对象?

如何在特定时间后遍历每个对象?
EN

Stack Overflow用户
提问于 2019-10-07 01:26:29
回答 1查看 121关注 0票数 1
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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循环结束,而是让它在第一个项目上循环等待一秒钟,然后继续下一个项目,依此类推。

现在的情况是,它会阻塞编辑器,冻结它,直到循环结束。

到目前为止,我所做的并不是很好:

我为检查器中的一个按钮创建了一个新的编辑器脚本:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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();
        }
    }
}

然后在比较对象中:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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);
            }
        }
    }
}

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-10-07 01:57:51

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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被调用。

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

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

https://stackoverflow.com/questions/58262532

复制
相关文章
vue - for 遍历对象和遍历对象数组
1. 遍历对象时,参数: 第一个为值,第二个为键名,第三个为索引 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> <!--
IT工作者
2022/02/17
4.2K0
js获取当前时间(特定的时间格式)[通俗易懂]
在一个程序中需要对用户的操作进行记录,记录其操作信息,需要对操作进行归类, 有时候用户的操作是重复性的操作,那对于重复的操作,也是要区分的,方便查找, 可以通过设置类似GUID的唯一值,也可以获取当前的操作时间来区分,因为时间也是唯一的, 在任何时候时间都不会出现重复,当然可以获取就可以设置,所以您也可以人为的去设置/修改操作时间。 但是这样不好。
全栈程序员站长
2022/09/29
15.1K0
js获取当前时间(特定的时间格式)[通俗易懂]
详解对象遍历
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=a"> <title>Document</title> </head> <body> <script type="text/javascript"> /* 1.在JavaScript中对象和数组一样是可以遍历的
贵哥的编程之路
2020/10/28
1K0
对象的遍历
对象的遍历和数组不太一样;可以使用for in遍历 for(x in 对象名){ document.write(x+'=>'+对象名[x]) } x:自定义的变量名,用来输出对象内属性和方法名 in:for in遍历关键词,表示在哪个对象内遍历 对象名[x]:遍历出属性或者方法对应的值 for in遍历对象的实例: <!DOCTYPE html> <html> <head>     <meta charset="UTF-8">     <title>对象遍历</title>     <script ty
十月梦想
2018/08/29
1.1K0
JS对象-遍历数组对象
请把下面数据中的对象打印出来: students = [ {uid: 1, name: ‘小明’, age: 18, gender: ‘男’, hometown: ‘河北省’ }, {uid: 2, name: ‘小红’, age: 19, gender: ‘女’, hometown: ‘河南省’ }, {uid: 3, name: ‘小刚’, age: 17, gender: ‘男’, hometown: ‘山西省’ }, {uid: 4, name: ‘小丽’, age: 18, gender: ‘女’, hometown: ‘山东省’ } ]
且陶陶
2023/04/12
9.4K0
JS对象-遍历数组对象
js遍历对象和遍历数组
遍历一个对象用for in, 遍历一个数组用.length var x; var txt=""; var person={fname:"Bill",lname:"Gates",age:56}; //对象 for (x in person) { txt=txt + person[x]+"<br>"; } var x; var txt=""; cars=["BMW","Volvo","Saab","Ford"]; //数组 for (var x=0;x<cars.length;x++) { txt=t
HaC
2020/12/30
7.4K0
PHP 获取 特定时间范围 类
目录 前序   用途   功能及事项   使用方法   代码及注释 前序:   总体来说,我更应该是一个 android 移动开发者,而不是一个 phper,如果说只做移动端的 APP ,我也不会学
林冠宏-指尖下的幽灵
2018/01/03
2.2K0
vue遍历数组对象foreach_js遍历对象数组
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/179140.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/27
7.6K0
vue遍历数组对象foreach_js遍历对象数组
Js遍历对象总结
Js遍历对象的方法主要有for in、Object.keys()、Object.getOwnPropertyNames()、Reflect.ownKeys()、Object.getOwnPropertySymbols()。
WindRunnerMax
2020/08/27
6.8K0
jQuery遍历List对象
在jQuery中,可以使用each()方法以一种非常直观的方式来模拟break和continue关键字的功能。只需在回调函数中编写一条return语句即可。要停止迭代,只需从回调函数返回false,这与在普通循环语句中使用break语句类似。要跳过当前迭代并继续进行下一轮迭代,只需返回true即可,这与在循环语句中使用continue类似。
别团等shy哥发育
2023/02/25
2.1K0
jQuery遍历List对象
PHP怎么遍历对象?
对于php来说,foreach是非常方便好用的一个语法,几乎对于每一个PHPer它都是日常接触最多的请求之一。那么对象是否能通过foreach来遍历呢?
硬核项目经理
2020/02/28
2.4K0
PHP-遍历对象
1.8 遍历对象 通过foreach遍历对象 <?php class Student { public $name='tom'; protected $sex='男'; private $age
cwl_java
2022/11/30
6740
PHP-遍历对象
对象属性的遍历
爱学习的前端歌谣
2023/10/24
1760
对象属性的遍历
arraylist遍历 并删除_js遍历list对象
//第一种遍历 ArrayList 对象的方法 foreach(object o in al) { Console.Write(o.ToString()+” “); }
全栈程序员站长
2022/11/10
7.5K0
JS对象的遍历方法
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/179080.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/27
9.1K0
js时间对象
//     getDay() 获得日期是周几 (0代表周天,1-6分别代表周1-6)
十月梦想
2018/08/29
11.3K0
如何在 Python 里优雅地读取文件特定行
如果文件非常大,不能读取到内存中,那么你可能会通过for 循环数行数,数到特定行:
青南
2019/09/16
2.3K0
js操作对象循环遍历
创建对象的3种方法 使用构造器创建对象 使用构造器创建对象.png 直接创建对象 直接创建对象.png 使用字面量创建对象 使用字面量创建对象.png 循环 if else if_else判断.p
暖月寒星
2020/03/11
5.1K0
js操作对象循环遍历
点击加载更多

相似问题

如何在oData中遍历每个对象?

31

对每个JSON对象数据进行遍历后操作JSON对象数据

11

在特定时间间隔后,如何在react.js中显示每个数组对象?

27

循环遍历嵌套的JSON对象,如树对象

21

如何在特定时间(如2秒)后终止ruby on rails中的进程?

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文