Skip to content
Радорама
Menu
  • SkillForce2
  • Другие игры
  • Unity
  • Блог
  • Творчество
  • Контакты
  • Поддержать
Menu

Расширяем инспектор

Posted on 12.03.202114.03.2021 by radoar

Мне не нравится, как сейчас в инспекторе редактора 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.

30

SkillForce2

  • Главная
  • >> Поддержка <<
  • Об игре
  • Форум
  • Скриншоты
  • Видео
  • Играть

Войти

Регистрация

©2021 Радорама | Built using WordPress and Responsive Blogily theme by Superb