【Unity】Как ссылаться на наборы игровых объектов DontDestroyOnLoad и неактивных?


Введение

В Unity есть всевозможные способы обращения к произвольному игровому объекту.

Например, SerializeFieled, GameObject.Find("name").

Но, если вам нужно сослаться на произвольный игровой объект, который устанавливает DontDestroyOnLoad и неактивен, вы не можете использовать GameObject.Find("name").

Или же есть ситуация, когда невозможно использовать SerializeFieled.

Пример кода

private GameObject _empty;

void Start()
{
    //Create gameobject as DontDestroyOnLoadGameObject
    if (_empty == null)
    {
        _empty = new GameObject(string.Empty);
        DontDestroyOnLoad(_empty);
    }

    var dontDestroyOnLoadGameObjectList = new List<GameObject>();

    //Besause DontDestroyOnLoad is included Scene, it gets from GameObject.scene.
    var dontDestroyOnLoadGameObjectRootList = _empty.scene.GetRootGameObjects().ToList();
    foreach (var root in dontDestroyOnLoadGameObjectRootList)
    {
        dontDestroyOnLoadGameObjectList.AddRange(GetAll(root));
    }

    dontDestroyOnLoadGameObjectList.Any(go => go.TryGetComponent(out MyComponent component));

    //Some kind of processing
}


/// <summary>
/// Return all object of tree.
/// </summary>
private List<GameObject> GetAll(GameObject root)
{
    var allChildren = new List<GameObject>();
    GetChildren(root, ref allChildren);
    return allChildren;
}

/// <summary>
/// Add child to list from parent.
/// </summary>
private void GetChildren(GameObject obj, ref List<GameObject> allChildren)
{
    var children = obj.GetComponentInChildren<Transform>();
    if (children.childCount == 0)
    {
        return;
    }

    foreach (Transform ob in children)
    {
        allChildren.Add(ob.gameObject);
        GetChildren(ob.gameObject, ref allChildren);
    }
}

private void OnDisable()
{
    DestroyImmediate(_empty);
}
Вход в полноэкранный режим Выход из полноэкранного режима

Советы

Поскольку DontDestroyOnLoad входит в состав Scene, он берется из GameObject.scene.

Во-первых, создайте временный gameobject и установите DontDestroyOnLoad.
Во-вторых, переберите все игровые объекты, в которых есть определенный компонент.
Вы можете искать в сцене, где существует временный игровой объект.

Это означает, что вы можете искать геймобъект в DontDestroyOnLoad.

Другие ресурсы

DontDestroyOnLoadのGameObjectを列挙する
全ての子要素を取得する(子要素の子要素の子要素の‥)

Оцените статью
Procodings.ru
Добавить комментарий