• Как создать объект в сцене из Инспектора?

    BasmanovDaniil
    @BasmanovDaniil
    Геймдизайнер-телепат
    Есть несколько вариантов. Если вы хотите один и тот же метод использовать в редакторе и рантайме, то можно сделать свой инспектор с кнопкой. Например, вы хотите вызвать метод Method в редакторе:
    using UnityEngine;
    
    public class Test : MonoBehaviour
    {
        private void Awake()
        {
            Method();
        }
    
        public void Method()
        {
            Debug.Log("Method");
        }
    }

    Создаёте класс, наследуетесь от UnityEditor.Editor и вешаете атрибут CustomEditor. В папку Editor кладёте скрипт с инспектором:
    using UnityEditor;
    using UnityEngine;
    
    [CustomEditor(typeof (Test))]
    public class TestEditor : Editor
    {
        public override void OnInspectorGUI()
        {
            base.OnInspectorGUI();
    
            if (GUILayout.Button("Method"))
            {
                ((Test) target).Method();
            }
        }
    }

    В результате получите такую кнопку:
    Ziazn
    Если метод нужен только в редакторе, то можете сделать менюшку с помощью MenuItem. Скрипт тоже кладёте в папку Editor.
    using UnityEditor;
    using UnityEngine;
    
    public static class TestUtility
    {
        [MenuItem("Tools/Method")]
        public static void Method()
        {
            Debug.Log("Method");
        }
    }

    Получите такую менюшку:
    HddYD
    Если жаждете приключений, то можете ещё попробовать EditorWindow, но я бы начал с инспектора.

    Для конкретно генерации вам могут пригодиться атрибуты HideInInspector и SerializeField. С их помощью вы сможете в скрипте генератора хранить ссылки на созданные объекты и не терять их при перезагрузке сцены.
    using System.Collections.Generic;
    using UnityEngine;
    
    public class Test : MonoBehaviour
    {
        [HideInInspector, SerializeField]
        private List<GameObject> gameObjects = new List<GameObject>();
    
        private void Awake()
        {
            Generate();
        }
    
        public void Generate()
        {
            for (int i = 0; i < 100; i++)
            {
                var go = GameObject.CreatePrimitive(PrimitiveType.Cube);
                gameObjects.Add(go);
            }
        }
    
        public void Clear()
        {
            foreach (var go in gameObjects)
            {
                if (Application.isPlaying)
                {
                    Destroy(go);
                }
                else
                {
                    DestroyImmediate(go);
                }
            }
            gameObjects.Clear();
        }
    }
    Ответ написан
    1 комментарий