Как я могу зациклить объекты и проверить, являются ли некоторые из них детьми или родителями? - PullRequest
0 голосов
/ 11 октября 2019
private void OnGUI()
    {
        prefab = (GameObject)EditorGUILayout.ObjectField("Prefab", prefab, typeof(GameObject), false);

        if (GUILayout.Button("Replace"))
        {
            var selection = Selection.gameObjects;

            for (var i = selection.Length - 1; i >= 0; --i)
            {
                var selected = selection[i];
                var prefabType = PrefabUtility.GetPrefabType(prefab);
                GameObject newObject;

                if (prefabType == PrefabType.Prefab)
                {
                    newObject = (GameObject)PrefabUtility.InstantiatePrefab(prefab);
                }
                else
                {
                    newObject = Instantiate(prefab);
                    newObject.name = prefab.name;
                }

                if (newObject == null)
                {
                    Debug.LogError("Error instantiating prefab");
                    break;
                }

                Undo.RegisterCreatedObjectUndo(newObject, "Replace With Prefabs");
                newObject.transform.parent = selected.transform.parent;
                newObject.transform.localPosition = selected.transform.localPosition;
                newObject.transform.localRotation = selected.transform.localRotation;
                newObject.transform.localScale = selected.transform.localScale;
                newObject.transform.SetSiblingIndex(selected.transform.GetSiblingIndex());
            }
        }

        GUI.enabled = false;
        EditorGUILayout.LabelField("Selection count: " + Selection.objects.Length);
    }

У меня есть, например, 30 gameobjects с тем же именем. Я хочу проверить первое gameobject против других, затем в следующий раз второе gameobject против других минус первое и т. Д.

В конце я хочу знать, что такое gameobjectsпотомок другого gameobjects в массиве выбора.

Например: GameObject[0] является потомком GameObject[7], а GameObject[22] является потомком GameObject[1], как этот.

Ответы [ 2 ]

1 голос
/ 11 октября 2019
private void CheckParents(List<GameObject> objects) {
    for (int i = 0; i < objects.Count; i++) {
        for (int b = i; b < objects.Count; b++) {
            if (objects[i] == objects[b].transform.parent) {
                // i is b's parent
            }
        }
    }
}
0 голосов
/ 11 октября 2019

Я думаю, я бы использовал словарь родителей для этого, вот пример кода, который я написал. Обратите внимание, что я на самом деле не пробовал код, поэтому может потребоваться некоторая настройка, например, добавление соответствующих объектов в список и тому подобное.

Вот как я заполнил бы словарь:

List<GameObject> GameObjectList = new List<GameObject>();
GameObjectDictionary ParentDictionary = new GameObjectDictionary();

public void GetChildren(){

    foreach(GameObject parent in GameObjectList){
        foreach(Transform child in parent.transform){
            ParentDictionary.Add(parent, child.gameObject)
        }
    }
}

И GameObjectDictionary должен выглядеть примерно так:

public class GameObjectDictionary
{

    private Dictionary<GameObject, List<GameObject>> internalDictionary = new Dictionary<GameObject, List<GameObject>>();

    public void Add(GameObject key, GameObject value)
    {
        if (this.internalDictionary.ContainsKey(key))
        {
            List<GameObject> list = this.internalDictionary[key];
            list.Add(value);

        }
        else
        {
            List<GameObject> list = new List<GameObject>();
            list.Add(value);
            this.internalDictionary.Add(key, list);
        }
    }

    GetValue(GameObject key){
        return(internalDictionary[key]);
    }

}

Обратите внимание, что здесь есть O(n'2) временная сложность.

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