Мне не нравится, как сейчас в инспекторе редактора Unity реализован выбор объекта. Это когда в скрипте, например,
public GameObject MyPrefab;
и в инспекторе появляется поле, рядом кружочек с точкой, нажав на которые выскакивает окошко со списком объектов. Для программиста сойдёт, но для гейм-дизайнера — это пытка.
К счастью, Unity можно расширять своими скриптами. Например, добавить выпадающий список для поля.
Пример.
Создадим пустой объект, на него повесим простенький скрипт TestClass:
using UnityEngine;
public class TestClass : MonoBehaviour
{
public GameObject myPrefab;
}
В инспекторе появилось то самое поле myPrefab с возможностью выбрать объект.
В папке Editor создадим скрипт-расширение (я пробовал — если создать в другом месте, тоже будет работать, но порядок лучше соблюдать)
using UnityEditor; using UnityEngine; using System.Linq; [CustomEditor(typeof(TestClass))] public class TestEditor : Editor { // папка в Assets/Resources, откуда будем читать private string resFolder = "Prefabs/"; // массив имён объектов (заголовков) private string[] choices; // сейчас выбрано это private int selectIndex; private void OnEnable() { // читаем из папки GameObject[] found = Resources.LoadAll<GameObject>(resFolder); // создаём массив, если в заголовке есть "/", то выпадающий список будет многоуровневым choices = found.Select(x => x.name).ToArray(); /* второй вариант без linq, если нужна изысканная настройка int i = 0; foreach (GameObject go in found) { choices[i] = go.name; i++; }*/ } public override void OnInspectorGUI() { // базовые настройки класса, если закомментировать, не будут показаны в инспекторе DrawDefaultInspector(); // красивая линия EditorGUILayout.LabelField("", GUI.skin.horizontalSlider); // не обязательно GUILayout.Label("Красивый заголовок:"); // список int choiceIndex = EditorGUILayout.Popup("Выбираем:", selectIndex, choices); // если что-то выбрали if (selectIndex != choiceIndex) { // наш класс TestClass myTarget = (TestClass)target; // наше поле myTarget.myPrefab = Resources.Load<GameObject>(resFolder + choices[choiceIndex]); / // сообщаем редактору об изменениях, потом всё нужно будет сохранить EditorUtility.SetDirty(myTarget); selectIndex = choiceIndex; } } }
Теперь, если посмотрим в инспектор, увидим следующую картину:
При выборе из выпадающего списка, поле MyPrefab автоматически заполняется.
Конечно, выбирать можно что угодно, не только GameObject, тут как душа ляжет. Бонусом — это работает в ScriptableObject.