gpt4 book ai didi

c# - 按枚举类型自定义检查器

转载 作者:太空宇宙 更新时间:2023-11-03 22:57:53 24 4
gpt4 key购买 nike

Inspector image

有一个包含多种移动类型的平台类。TypeA 是在航路点之间启动时自动移动当特定 bool 值为真时,TypeB 会随重力下落。我通过选择自己的枚举类型来控制这些不同的行为。

我现在想做的是只能在 inspector 上看到与运动类型匹配的那些变量,因为 TypeA 使用 TypeB 完全忽略的路点系统,而 inspector 上剩余的所有未使用变量只会让事情变得困惑和困惑。

我可以一次只让他们成为自己的类(class),但如果我坚持并尝试这样做:这能做到吗?我该怎么做?

要问的另一件事是,是否有像我这样的类在性能效率方面更好?要在自己的脚本上上课?或者只是不关心性能?如果没有显着的性能差异,我打算像以前那样做。

编辑:添加了带有指示的已发布检查员。 红色是选择要遵循的运动函数的枚举 1. 是跟随航路点系统漫游的运动类型之一 2.是与PC接触时摔倒的运动类型之一 3. 是一种仅在 powered boolean 为真时才移动的移动类型

最佳答案

您需要实现自己的自定义检查器。有 Unity's official tutorial关于这个话题。自定义检查器使用 GUI 类,您将需要检查您的条件并在且仅当条件满足时绘制一个字段。

这是我从 Change Inspector Variables Depending On Enum 中获取的示例代码.从这段代码中,您将了解如何从目标类中动态获取 enum 字段的值。

~/Assets/PropertyHolder.cs

using System.Collections;
using UnityEngine;


public class PropertyHolder : MonoBehaviour
{
public enum Status { A, B, C };

public Status state;

public int valForAB;

public int valForA;
public int valForC;

public bool controllable;

void Start()
{

}

void Update()
{

}
}

~/Assets/Editor/PropertyHolderEditor.cs

using UnityEditor;
using UnityEngine;

[CustomEditor(typeof (PropertyHolder)), CanEditMultipleObjects]
public class PropertyHolderEditor : Editor
{

public SerializedProperty
state_Prop,
valForAB_Prop,
valForA_Prop,
valForC_Prop,
controllable_Prop;

void OnEnable()
{
// Setup the SerializedProperties
state_Prop = serializedObject.FindProperty("state");
valForAB_Prop = serializedObject.FindProperty("valForAB");
valForA_Prop = serializedObject.FindProperty("valForA");
valForC_Prop = serializedObject.FindProperty("valForC");
controllable_Prop = serializedObject.FindProperty("controllable");
}

public override void OnInspectorGUI()
{
serializedObject.Update();

EditorGUILayout.PropertyField(state_Prop);

PropertyHolder.Status st = (PropertyHolder.Status) state_Prop.enumValueIndex;

switch (st)
{
case PropertyHolder.Status.A:
EditorGUILayout.PropertyField(controllable_Prop, new GUIContent("controllable"));
EditorGUILayout.IntSlider(valForA_Prop, 0, 10, new GUIContent("valForA"));
EditorGUILayout.IntSlider(valForAB_Prop, 0, 100, new GUIContent("valForAB"));
break;

case PropertyHolder.Status.B:
EditorGUILayout.PropertyField(controllable_Prop, new GUIContent("controllable"));
EditorGUILayout.IntSlider(valForAB_Prop, 0, 100, new GUIContent("valForAB"));
break;

case PropertyHolder.Status.C:
EditorGUILayout.PropertyField(controllable_Prop, new GUIContent("controllable"));
EditorGUILayout.IntSlider(valForC_Prop, 0, 100, new GUIContent("valForC"));
break;

}

serializedObject.ApplyModifiedProperties();
}
}

这是仅在满足条件时才检查 bool & draw 的方法,来自 Hide/Show properties dynamically in inspector .修改 bool 检查部分以比较您使用上述代码找到的 enum 值。

public class MyScript : MonoBehaviour
{
public bool flag;
public int i = 1;
}

[CustomEditor(typeof (MyScript))]
public class MyScriptEditor : Editor
{
void OnInspectorGUI()
{
var myScript = target as MyScript;

myScript.flag = GUILayout.Toggle(myScript.flag, "Flag");

if (myScript.flag)
myScript.i = EditorGUILayout.IntSlider("I field:", myScript.i, 1, 100);

}
}

结合这两者你应该得到你想要的行为。

关于c# - 按枚举类型自定义检查器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44557742/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com