在 Unity Inspector 中获取选定的组件 window
Get selected component in Unity Inspector window
我正在尝试制作一个具有适用于所有类型内置组件的功能的自定义检查器。
我真正想做的是,当我 select 它时,将 属性 select 在检查器中以蓝色显示的名称作为字符串获取。有什么办法吗?
示例:突出显示本地位置时,是否有任何方法可以获取“转换组件 - LocalPosition (0,0,0);
我尝试阅读 API 以了解是否有什么可以帮助我但没有任何运气。也尝试使用 CustomEditor(TypeOf(Transform))
但我无法在突出显示时访问这些值。
任何帮助将不胜感激!
FocusInEvent 适合你吗?
您必须为每个 VisualElement 添加一个事件,或者循环遍历根并找到所有 VisualElement 并将事件添加到它。然后您可以获得 VisualElement 的名称并在事件处理中使用它。
来自关于 focus events
的文档
public void CreateGUI()
{
TextField textField = new TextField();
textField.value = placeHolderText;
rootVisualElement.Add(textField);
textField.RegisterCallback<FocusInEvent>(OnFocusInTextField);
textField.RegisterCallback<FocusOutEvent>(OnFocusOutTextField);
}
private void OnFocusInTextField(FocusInEvent evt)
{
// If the text field just received focus and the user might want to write
// or edit the text inside, the placeholder text should be cleared (if active)
if (placeHolderMode)
{
var textField = evt.target as TextField;
textField.value = "";
}
}
我已经添加了一个工作示例,正如您所说,它似乎不适用于编辑器。编辑器实现在我的 unity 版本 (2020.3.30f1) 中运行,代码如下。
using UnityEngine;
public class FocusScript : MonoBehaviour
{
}
using UnityEditor;
using UnityEngine;
using UnityEngine.UIElements;
[CustomEditor(typeof(FocusScript))]
public class CustomEditorFocus : Editor
{
public override VisualElement CreateInspectorGUI()
{
VisualElement myInspector = new VisualElement();
TextField textField = new TextField();
textField.name = "test text field";
textField.value = "test";
textField.label = "test label";
myInspector.Add(textField);
textField.RegisterCallback<FocusInEvent>(OnFocusInTextField);
return myInspector;
}
private void OnFocusInTextField(FocusInEvent evt)
{
var textField = evt.target as TextField;
Debug.Log("Testing with field: " + textField.name);
}
}
我正在尝试制作一个具有适用于所有类型内置组件的功能的自定义检查器。
我真正想做的是,当我 select 它时,将 属性 select 在检查器中以蓝色显示的名称作为字符串获取。有什么办法吗?
示例:突出显示本地位置时,是否有任何方法可以获取“转换组件 - LocalPosition (0,0,0);
我尝试阅读 API 以了解是否有什么可以帮助我但没有任何运气。也尝试使用 CustomEditor(TypeOf(Transform))
但我无法在突出显示时访问这些值。
任何帮助将不胜感激!
FocusInEvent 适合你吗?
您必须为每个 VisualElement 添加一个事件,或者循环遍历根并找到所有 VisualElement 并将事件添加到它。然后您可以获得 VisualElement 的名称并在事件处理中使用它。
来自关于 focus events
的文档public void CreateGUI()
{
TextField textField = new TextField();
textField.value = placeHolderText;
rootVisualElement.Add(textField);
textField.RegisterCallback<FocusInEvent>(OnFocusInTextField);
textField.RegisterCallback<FocusOutEvent>(OnFocusOutTextField);
}
private void OnFocusInTextField(FocusInEvent evt)
{
// If the text field just received focus and the user might want to write
// or edit the text inside, the placeholder text should be cleared (if active)
if (placeHolderMode)
{
var textField = evt.target as TextField;
textField.value = "";
}
}
我已经添加了一个工作示例,正如您所说,它似乎不适用于编辑器。编辑器实现在我的 unity 版本 (2020.3.30f1) 中运行,代码如下。
using UnityEngine;
public class FocusScript : MonoBehaviour
{
}
using UnityEditor;
using UnityEngine;
using UnityEngine.UIElements;
[CustomEditor(typeof(FocusScript))]
public class CustomEditorFocus : Editor
{
public override VisualElement CreateInspectorGUI()
{
VisualElement myInspector = new VisualElement();
TextField textField = new TextField();
textField.name = "test text field";
textField.value = "test";
textField.label = "test label";
myInspector.Add(textField);
textField.RegisterCallback<FocusInEvent>(OnFocusInTextField);
return myInspector;
}
private void OnFocusInTextField(FocusInEvent evt)
{
var textField = evt.target as TextField;
Debug.Log("Testing with field: " + textField.name);
}
}