Ger*_*rte 1 c# user-interface editor unity-game-engine
我有一个带有 1 个序列化字符串的测试脚本,我试图通过在 TextField 中输入一些内容来访问和修改它,但我不知道将 TextField 分配给什么。
测试脚本:
using UnityEngine;
public class Test : MonoBehaviour
{
[SerializeField] private string value;
}
Run Code Online (Sandbox Code Playgroud)
测试工具脚本:
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...");
}
}
Run Code Online (Sandbox Code Playgroud)
我不建议使用直接更改值
Test myTest = (Test)target;
myTest.value = EditorGUI.TextField(textFieldRect, myTest.value);
Run Code Online (Sandbox Code Playgroud)
而是使用 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();
}
Run Code Online (Sandbox Code Playgroud)
这样做的巨大优势在于,撤消/重做以及将场景和类标记为“脏”都是自动处理的,您不必手动进行。
然而,为了使这项工作变量始终是要么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);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6241 次 |
| 最近记录: |