Alexeee
@Alexeee
Разработчик игр

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

(Unity 5.3, C#)
Мне нужно:
Я создаю скрипт -> вешаю его на объект -> меняю значения переменных этого скрипта через инспектор (например, кол-во создаваемых объектов) и сразу же объекты создаются в сцене, до запуска самой игры.

Не знаю, возможно ли вообще такое в Unity.
Пока что пользуюсь Awake, через инспектор указывая значения. Но это слишком неудобно, т.к. постоянно требуется запускать игру для проверки.

Искал в Интернете - не нашел. Может, просто плохо искал.
  • Вопрос задан
  • 290 просмотров
Решения вопроса 2
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();
    }
}
Ответ написан
@vargan
Еще один вариант - ContextMenu, например:

[ContextMenu("RunInEditor")]
	void Start () {
	
	}

И в инспекторе в свойствах компонента появится соответствующий пункт
1b089208f7446c52b3a68ca7fa417db2.png
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы