Как изменить Сериализованную переменную из скрипта Custom Editor в Unity - PullRequest
0 голосов
/ 09 ноября 2018

У меня есть тестовый скрипт с 1 сериализованной строкой, и я пытаюсь получить к нему доступ и изменить его, набрав что-то в TextField, но я не знаю, как назначить TextField.

Тестовый скрипт:

using UnityEngine;

public class Test : MonoBehaviour
{
    [SerializeField] private string value;

}

Сценарий TestTool:

using UnityEngine;
using UnityEditor;

[CustomEditor(typeof(Test))]
public class TestTool : Editor
{
[ExecuteInEditMode]
public override void OnInspectorGUI()
{

    base.OnInspectorGUI();

    Rect textFieldRect = new Rect(EditorGUILayout.GetControlRect(false, EditorGUIUtility.currentViewWidth));

    EditorGUI.DrawRect(textFieldRect, Color.gray);

    EditorGUI.TextField(textFieldRect, "Type here...");
}
}

enter image description here

enter image description here

Ответы [ 2 ]

0 голосов
/ 09 ноября 2018

Я бы не рекомендовал бы напрямую изменить значение с помощью

Test myTest = (Test)target;
myTest.value = EditorGUI.TextField(textFieldRect, myTest.value);

Вместо этого используйте SerializedProperty

private SerializedProperty _value;

private void OnEnable()
{
    // Link the SerializedProperty to the variable 
    _value = serializedObject.FindProperty("value");
}

public override OnInspectorGUI()
{
    // fetch current values from the target
    serializedObject.Update();

    EditorGUI.PropertyField(textFieldRect, _value);

    // Apply values to the target
    serializedObject.ApplyModifiedValues();
}

Огромным преимуществом этого является то, что Undo / Redo и пометка Scene и class как «dirty» обрабатываются автоматически, и вам не нужно делать это вручную.

Однако, чтобы заставить это работать, переменные всегда должны быть либо public, либо [SerializedField], что уже имеет место в вашем классе.

Вместо rect Я бы на самом деле рекомендовал бы вам использовать EditorGUILayout.PropertyField и устанавливать размеры с помощью GUILayout.ExpandWidth и GUILayout.ExpandHeight или остальные доступны под

опция

GUILayout.Width, GUILayout.Height, GUILayout.MinWidth, GUILayout.MaxWidth, GUILayout.MinHeight, GUILayout.MaxHeight, GUILayout.ExpandWidth, GUILayout.ExpandHeight.

Чтобы не показывать метку, используйте GUIContent.none.

Так что это может выглядеть как

EditorGUILayout.PropertyField(_value, GUIContent.none, GUILayout.ExpandHeight, GUILayout.ExpandWith);
0 голосов
/ 09 ноября 2018

Это:

Test myTest = (Test)target;
myTest.value = EditorGUI.TextField(textFieldRect, myTest.value);

target - это свойство, предоставляемое через суперкласс Editor, и содержит ссылку на любой проверяемый экземпляр объекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...