c# - 使用检查器为动态列表分配 ButtonClickedEvent 时出现 Unity 2018 错误
问题描述
我写了一些动态列表来填写统一检查员,
[Serializable]
public class MenuItem
{
public string title = "Item";
public bool enabled = true;
public Button.ButtonClickedEvent onClick = null;
public MenuItem[] submenu;
}
public MenuItem[] menu = null;
现在,当我使用检查器为菜单分配值时,第一级一切正常。但是在第二级之后,我无法将 ButtonClickedEvent 分配给创建的 MenuItem 子项。我在统一编辑器中收到此错误:
type is not a enum value
UnityEditor.SerializedProperty:set_enumValueIndex(Int32)
UnityEditorInternal.UnityEventDrawer:AddEventListener(ReorderableList) (at C:/buildslave/unity/build/Editor/Mono/Inspector/UnityEventDrawer.cs:355)
UnityEditorInternal.Defaults:DrawFooter(Rect, ReorderableList) (at C:/buildslave/unity/build/Editor/Mono/GUI/ReorderableList.cs:115)
UnityEditorInternal.ReorderableList:DoListFooter(Rect) (at C:/buildslave/unity/build/Editor/Mono/GUI/ReorderableList.cs:641)
UnityEditorInternal.ReorderableList:DoList(Rect) (at C:/buildslave/unity/build/Editor/Mono/GUI/ReorderableList.cs:413)
UnityEditorInternal.UnityEventDrawer:OnGUI(Rect) (at C:/buildslave/unity/build/Editor/Mono/Inspector/UnityEventDrawer.cs:148)
UnityEditorInternal.UnityEventDrawer:OnGUI(Rect, SerializedProperty, GUIContent) (at C:/buildslave/unity/build/Editor/Mono/Inspector/UnityEventDrawer.cs:117)
UnityEngine.GUIUtility:ProcessEvent(Int32, IntPtr)
解决方案
这里 UnityEvent Editor 打破了嵌套结构 ,有一个答案建议使用 ScriptableObject 而不是递归列表。但是没有HOW!
但请注意答案的重点,如果我有特定的级别数,我可以使用这样的东西
[Serializable]
public class MenuItem
{
public string title = "Item";
public bool enabled = true;
public int width = 100;
public string relatedLeftDockPanel = "";
public string relatedRightDockPanel = "";
public Button.ButtonClickedEvent onClick = null;
public MenuItemLevel1[] submenu;
}
[Serializable]
public class MenuItemLevel1
{
public string title = "Item";
public bool enabled = true;
public int width = 100;
public string relatedLeftDockPanel = "";
public string relatedRightDockPanel = "";
public Button.ButtonClickedEvent onClick = null;
public MenuItemLevel2[] submenu;
}
[Serializable]
public class MenuItemLevel2
{
public string title = "Item";
public bool enabled = true;
public int width = 100;
public string relatedLeftDockPanel = "";
public string relatedRightDockPanel = "";
public Button.ButtonClickedEvent onClick = null;
}
编辑:甚至更好
public class MenuItem
{
public string title = "Item";
public bool enabled = true;
public int width = 100;
public string relatedLeftDockPanel = "";
public string relatedRightDockPanel = "";
public Button.ButtonClickedEvent onClick = null;
}
[Serializable]
public class MenuItemLevel0 : MenuItem
{
public MenuItemLevel1[] submenu;
}
[Serializable]
public class MenuItemLevel1 : MenuItem
{
public MenuItemLevel2[] submenu;
}
[Serializable]
public class MenuItemLevel2 : MenuItem
{
}
它解决了这个问题,但我想有一些更好的解决方案。
推荐阅读
- data-structures - 如何使用哈希表解决问题?
- arrays - 带有动态数据的 highchart 饼图
- hyperledger-fabric - Kubernetes 上的 Hyperledger Fabric 2.0 一切正常包安装提交但调用给我错误
- visual-studio-code - Visual Studio Code 在高对比度主题中选择文本颜色
- visual-foxpro - 与 vfp 的一致连接失败
- c# - 可以在不使用空间的情况下射击子弹(PictureBoxes)(例如在 Space Invaders 中),例如使用计时器?
- git - 切换分支时如何停止git自动更新?
- excel - 使用 vba 使行高从 2 到 50=118
- mysql - 如何防止通过触发器插入表?
- jenkins - 詹金斯 | DSL| 工作区目录问题