Как я могу зациклить объекты каждый объект через определенное время? - PullRequest
1 голос
/ 07 октября 2019
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);
            }
        }
    }
}

Но он выполняет только один объект, а не все объекты.

1 Ответ

2 голосов
/ 07 октября 2019

StartCoroutine действует так же, как и запуск нового потока, поэтому, когда вы вызываете Compare, все, что вы делаете, это зацикливание на игровых объектах и ​​создание объектов событий, которые при работе в основном потоке незапретить запуск метода, который его создал, поэтому в конечном итоге только новый объект события ожидает указанное время, в то время как метод main продолжает циклически перебирать оставшиеся игровые объекты и создает больше объектов события, так как он сам не вызывает никаких спящих функцийвместо этого вы должны сделать что-то вроде этого:

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.

Протестирован код, приведен небольшой (буквально) предварительный просмотр, вы увидите, что после изменения скорости он регистрирует объекты медленнее:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...