Как я могу решить, добавлять или нет детей также в обновлении в режиме реального времени? - PullRequest
0 голосов
/ 22 марта 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 string results = "";
    public bool addChildren = false;
    public GameObjectstInfo[] objectsInfo;

    private string previousGameObjectsInfo = "";

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

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

        Reset();
    }

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

            if (foundObjects.Length > 0)
            {
                results = "Found Results";
                for (int i = 0; i < foundObjects.Length; i++)
                {
                    objectsInfo[i] = new GameObjectstInfo();
                    objectsInfo[i].parent = foundObjects[i];

                    if (addChildren == true)
                    {
                        foreach (Transform t in foundObjects[i].GetComponentsInChildren<Transform>(true))
                        {
                            objectsInfo[i].childrenCount += 1;
                            objectsInfo[i].children.Add(t);
                        }
                    }
                    else
                    {

                    }
                }
            }
            else
            {
                results = "No Results";
            }
        }
    }

    private void Reset()
    {
        if (gameObjectsInfo == "")
        {
            results = "No Results";
            objectsInfo = new GameObjectstInfo[0];
        }
    }

    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;
    }
}

Это та часть, где я добавляю или не добавляю детей:

if (addChildren == true)
{
    foreach (Transform t in foundObjects[i].GetComponentsInChildren<Transform>(true))
    {
        objectsInfo[i].childrenCount += 1;
        objectsInfo[i].children.Add(t);
    }
}
else
{

}

Но я хочу сделать это и в Обновлении, если флаг addChildren имеет значение true и для него установлено значение false или от false до true, чтобы внести изменения и добавить / удалить дочерние элементы в режиме реального времени.

Теперь мне нужно удалить текст в переменной gameObjectsInfo и снова ввести текст, чтобы внести изменения в дочерние элементы. Но я хочу, чтобы эффект происходил без повторного ввода. Только при изменении состояния флага addChildren.

Если я изменяю состояние addChildren, повторный поиск с детьми или без них.

1 Ответ

1 голос
/ 22 марта 2019

Есть способы, которыми вы можете сделать это, написав свой собственный редактор для класса, чтобы он отвечал на нажатие флажка для этого bool, если вы только устанавливаете значение addChildren через код, вы можете использовать свойство set, функция, или, самый простой способ (если вы не возражаете дождаться следующего кадра после изменения значения) - просто добавить дополнительный логический элемент, отслеживающий предыдущее значение:

private bool _lastAddChildren;
public bool addChildren = false;
...

void Start()
{
    _lastAddChildren = addChildren;
    ...
}

private void Update()
{
    if ((gameObjectsInfo != "" && gameObjectsInfo != previousGameObjectsInfo)
         || (_lastAddChildren != addChildren))
    {
        Search();
    }
    previousGameObjectsInfo = gameObjectsInfo;
    _lastAddChildren = addChildren;

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