Есть несколько вариантов. Если вы хотите один и тот же метод использовать в редакторе и рантайме, то можно сделать свой инспектор с кнопкой. Например, вы хотите вызвать метод 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();
}
}
}
В результате получите такую кнопку:
Если метод нужен только в редакторе, то можете сделать менюшку с помощью
MenuItem. Скрипт тоже кладёте в папку Editor.
using UnityEditor;
using UnityEngine;
public static class TestUtility
{
[MenuItem("Tools/Method")]
public static void Method()
{
Debug.Log("Method");
}
}
Получите такую менюшку:
Если жаждете приключений, то можете ещё попробовать
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();
}
}