Автор Тема: [EditorGUI] Как редактировать поля класса через поля в редакторе?  (Прочитано 1956 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Март 20, 2013, 18:50:16 pm
Прочитано 1956 раз

JohnJ

  • Новичок

  • Оффлайн
  • *

  • 5
  • Репутация:
    0
    • Просмотр профиля
Есть класс Init, который призван задать начальные значения сцены. Есть так же класс "ObjectData", который должен хранить информацию о создаваемом объекте. В редакторе нужно сделать возможным для каждого объекта задать начальные данные.
Пример:

public class ObjectData : MonoBehaviour {
public string Name;
public int Cost;
public int Weight;
}

public class Init : MonoBehaviour {
              public GameObject ObjPrefab;
public ObjectData[] Objs;

void createObjects() {
    int i = 0;
    GameObject[] objs = new GameObject[this.Objs.Length];
    foreach (ObjectData p in this.Objs) {
        objs[i] = Instantiate(this.ObjPrefab, new Vector3(i * 2, 0, 0), new Quaternion(0, 0, 0, 0)) as GameObject;
        objs[i].GetComponent<ObjectData>().Name = p.Name;
        i++;
    }
}

// Use this for initialization
void Start () {
    createObjects();
}
}

Вот как я сделал свою форму в редакторе:
using UnityEngine;
using UnityEditor;

[CustomEditor(typeof(Init))]
[CanEditMultipleObjects]

public class ObjectsInspector : Editor {
    private SerializedProperty Objs;
    private SerializedProperty ObjPrefab;

    public void OnEnable() {
        this.Objs = serializedObject.FindProperty("Objs");
        this.ObjPrefab = serializedObject.FindProperty("ObjPrefab");
    }

    public override void OnInspectorGUI() {
        DrawDefaultInspector(); // выводим стандартную часть инспектора для проверки

        serializedObject.Update();

        EditorGUIUtility.LookLikeControls();

        EditorGUILayout.PropertyField(this.ObjPrefab, new GUIContent("ObjPrefab"));
        EditorGUILayout.PropertyField(this.Objs, new GUIContent("Objs"));
        if (this.Objs.isExpanded) {
            this.Objs.arraySize = EditorGUILayout.IntField("Size", this.Objs.arraySize);
            EditorGUILayout.Space();
            Rect r = GUILayoutUtility.GetLastRect();
            // строка заголовков
            EditorGUI.LabelField(new Rect(r.x, r.y, 30, 16), "№", EditorStyles.label);
            EditorGUI.LabelField(new Rect(r.x + 30, r.y, 80, 16), "Name", EditorStyles.label);
            EditorGUI.LabelField(new Rect(r.x + 110, r.y, 50, 16), "Cost", EditorStyles.label);
            EditorGUI.LabelField(new Rect(r.x + 160, r.y, 50, 16), "Weight", EditorStyles.label);
            EditorGUI.LabelField(new Rect(r.x + 210, r.y, 50, 16), "Model", EditorStyles.label);
            EditorGUILayout.Space();
            int i;
            for (i = 0; i < this.Objs.arraySize; i++) {
                EditorGUILayout.LabelField(i.ToString());
  r = GUILayoutUtility.GetLastRect();
    Debug.Log(this.Objs.GetArrayElementAtIndex(i).type); // вот здесь выдаёт тип PPtr<$ObjectData>, а как добраться до свойств этого объекта - пока не ясно. Танцы с бубном не помогли, в справке не нашёл нужной информации.
  EditorGUI.TextField(new Rect(r.x + 30, r.y, 80, 16), this.Objs.GetArrayElementAtIndex(i).stringValue, EditorStyles.textField); // если сделать обычный текствый массив, а не массив объектов ObjectData, то этот метод выводит правильные названия (если задать их предварительно в стандартном виде инспектора)
            }
        }

        serializedObject.ApplyModifiedProperties();
    }
}

Март 21, 2013, 06:22:54 am
Ответ #1

JohnJ

  • Новичок

  • Оффлайн
  • *

  • 5
  • Репутация:
    0
    • Просмотр профиля