Редактор свойств в Unity

14.08.2013 at 16:40

Несколько способов добавления полей объекта в визуальный редактор.

1. Сделать поля публичными

Создаем класс

public class Weapon : MonoBehaviour {
  public int NormalAmmoDamage;
  public int NormalAmmoRange;
  public int SpecialAmmoDamage;
  public int SpecialAmmoRange;
}

В редакторе он будет выглядеть так:

В редакторе видны публичные поля, подписи к ним берутся из имен полей.

2. Выделение отдельных классов

Этот способ помогает тогда, когда хочется сгруппировать поля. Выделяем их в отдельные классы:

public class Weapon : MonoBehaviour {
  public NormalAmmo NormalAmmo = new NormalAmmo();
  public SpecialAmmo SpecialAmmo = new SpecialAmmo();
}

[System.Serializable]
public class NormalAmmo
{
  public int Damage;
  public int Range;
}

[System.Serializable]
public class SpecialAmmo
{
  public int Damage;
  public int Range;
}

Классы для группировки нужно пометить как сериализуемые.
В редакторе это будет выглядеть так:

3. Кастомный редактор.

Когда требуется более сложное отображение полей в редакторе, приходится писать свой редактор. Создаем папку Assets/Editor, в ней создаем скрипт WeaponEditor.cs с таким содержимым:

using UnityEditor;

[CustomEditor(typeof(Weapon))]
public class WeaponEditor : Editor
{
  public override void OnInspectorGUI()
  {    
    Weapon weapon = (Weapon)target;
    EditorGUILayout.LabelField("Normal Ammo");
    weapon.NormalAmmoDamage = EditorGUILayout.IntSlider("  Damage", 
      weapon.NormalAmmoDamage, 1, 10);
    weapon.NormalAmmoRange = EditorGUILayout.IntSlider("  Range", 
      weapon.NormalAmmoRange, 1, 10);

    EditorGUILayout.LabelField("Special Ammo");
    weapon.SpecialAmmoDamage = EditorGUILayout.IntSlider("  Damage", 
      weapon.SpecialAmmoDamage, 1, 10);
    weapon.SpecialAmmoRange = EditorGUILayout.IntSlider("  Range", 
      weapon.SpecialAmmoRange, 1, 10);    
  }
}

Здесь создаются 2 надписи и 4 слайдера для целочисленных полей. После создания редактора пришлось перезапустить юнити.
Результат выглядит так: