Как я могу вызвать метод внутри Update только один раз? - PullRequest
2 голосов
/ 20 марта 2019
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

[ExecuteInEditMode]
public class GameObjectInfo : MonoBehaviour
{
    [System.Serializable]
    public class GameObjectstInfo
    {
        public GameObject parent;
        public int childrenCount;
        public List<Transform> children = new List<Transform>();
    }

    public string gameObjectsInfo = "";
    public GameObjectstInfo[] objectsinfo;

    private bool searching = false;

    // Start is called before the first frame update
    void Start()
    {
        Search();
    }

    private void Update()
    {

    }

    public void Search()
    {
        if (gameObjectsInfo != "")
        {
            var foundObjects = FindGameObjectsWithName(gameObjectsInfo);
            objectsinfo = new GameObjectstInfo[foundObjects.Length];

            for (int i = 0; i < foundObjects.Length; i++)
            {
                objectsinfo[i] = new GameObjectstInfo();
                objectsinfo[i].parent = foundObjects[i];

                foreach (Transform child in foundObjects[i].transform)
                {
                    objectsinfo[i].childrenCount += 1;
                    objectsinfo[i].children.Add(child);
                }
            }
        }
    }

    GameObject[] FindGameObjectsWithName(string nameIt)
    {
        int it = 0;
        GameObject[] objArr;
        bool b = false;
        while (!b)
        {
            if (GameObject.Find(nameIt))
            {
                GameObject.Find(nameIt).name = nameIt + it;
                it++;
            }
            else
            {
                b = true;
            }
        }

        objArr = new GameObject[it];
        while (it > 0)
        {
            it--;
            objArr[it] = GameObject.Find(nameIt + it);
            objArr[it].name = nameIt;
        }

        return objArr;
    }
}

Я хочу сделать это только в том случае, если строка var gameObjectsInfo не является пустой, вызовите Search(); один раз, чтобы выполнить поиск один раз, и если пользователь изменяет строку внутри var gameObjectsInfo, каждый раз производите новый поиск. Но каждый раз один поиск и новый поиск, если строка изменилась.

Основная цель - иметь возможность поиска в режиме реального времени внутри Обновления или с помощью кнопки. Часть кнопки работает нормально, но я хочу иметь возможность поиска также в режиме реального времени внутри обновления.

Сценарий кнопки:

using UnityEngine;
using System.Collections;
using UnityEditor;

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

        GameObjectInfo myScript = (GameObjectInfo)target;
        if (GUILayout.Button("Search"))
        {
            myScript.Search();
        }
    }
}

1 Ответ

5 голосов
/ 20 марта 2019

Я думаю, что одно решение может быть примерно таким: сохранить предыдущее состояние gameObjectsInfo и сравнить с текущим gameObjectsInfo.Если они не эквивалентны, то gameObjectsInfo было изменено.

...

public string previousGameObjectsInfo = "";   // to store the previous state
public string gameObjectsInfo = "";

...

private void Update()
{
    if(gameObjectsInfo != "" && gameObjectsInfo != previousGameObjectsInfo)
    {
        Search();   // or anything else
    }

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