我正在制作一个Unity C#脚本,该脚本旨在被其他人用作角色对话工具,以写出多个游戏角色之间的对话。
我有一个DialogueElement
类,然后创建一个DialogueElement
对象列表,每个对象代表一行对话。
第一个
我希望用户能够通过只与Unity检查器交互来使用对话框工具(因此没有编辑代码)。这种设置的问题是,对话框工具的用户无法为Characters
枚举中的字符指定他们自己的自定义名称(如Felix或Wendy),因为它们在DialogueElement
类中被硬编码为“CharacterA”和“CharacterB”。
对于那些不熟悉Unity的人来说,它是一个游戏创建程序。Unity允许用户创建物理文件(称为可脚本化对象),作为类对象的容器。可脚本化对象的公共变量可以通过一个称为“检查器”的可视界面来定义,如下所示:
我想使用一个枚举来指定哪些字符是对话框的台词,因为使用枚举可以在检查器中创建一个很好的下拉菜单,用户可以在其中轻松地选择字符,而不必为每一行对话手动键入字符的名称。
**如何允许用户定义Characters
枚举的元素?**在本例中,我尝试使用字符串数组变量,播放器可以在其中键入所有可能字符的名称,然后使用该数组定义枚举。
我不知道这样解决问题是否可行。我对任何想法都持开放态度,允许用户指定一个名称列表,然后在检查器中创建一个下拉菜单,用户可以在其中选择一个名称,如上图所示。
这个解决方案不需要从字符串数组中特别声明一个新的枚举。我只是想找到一种方法来实现这个功能。我想到的一个解决方案是编写一个单独的脚本,用来编辑包含字符枚举的C#脚本的文本。我认为这在技术上是可行的,因为Unity会在每次检测到脚本被更改时自动重新编译脚本,并更新检查器中的可脚本化对象,但我希望能找到更干净的方法。
链接到存储库以供参考:
https://github.com/guitarjorge24/DialogueTool
4条答案
按热度按时间xwmevbvl1#
你不能改变枚举本身,因为它需要被编译(当然,这不是完全不可能的,但是我不建议你主动改变脚本并强制重新编译)
没有看到你所需要的其他类型是有点困难的,但是你最好在一个自定义的编辑器脚本中使用
EditorGUILayout.Popup
来完成你所需要的。正如前面所说,我不知道你的确切需求和类型Characters
,也不知道你是如何引用它们的,所以现在我假设你通过列表Dialogue.CharactersList
中的索引将DialogueElement
引用到某个字符。这基本上就像一个enum
那么工作!由于这些编辑器脚本可能会变得相当复杂,我尝试对每一步进行注解:
这就是它现在的样子
kiz8lqtg2#
对于那些谁需要枚举像字符串下拉,你可以使用代码从我的github repo.下载这个文件夹,并添加到您的项目. https://github.com/datsfain/EditorCools/tree/main/Assets/Tools/DropdownStringAttribute
将以下代码行添加到任何可序列化的类中:
sf6xfgos3#
另一个选项是使用检查器增强资源,如Odin Inspector或NaughtyAttributes。
如果你有这样一个成员:
对于奥丁,你会这样写:
在NaughtyAttributes中,您可以写入:
这些解决方案类似于datsfain的建议。
虽然Odin不是免费的,但它有很多额外的功能。https://odininspector.com/attributes/value-dropdown-attribute
NaughtyAttributes是免费的,但有点旧,更基本。https://dbrizov.github.io/na-docs/attributes/drawer_attributes/dropdown.html
4xrmg8kj4#
我要写另一个答案...因为双重答案更好!
正如derHugo在他的回答中所说的,可以使用枚举来完成,但是它会强制重新编译。嗯,有时候也许你真的需要枚举(在某些情况下,它们比字符串快得多),并且你愿意接受重新编译的代价。
这里有一个我写的小工具类,用于生成枚举并将其保存到文件中。
创建一个成员变量,其中包含设计者可以编辑的字符串列表。您可能希望在UI上放置一个名为“GenerateEnums”的按钮或类似的按钮,还可能放置一个保存目录的字符串,它将调用save函数并将枚举定义写入文件。有代码强制重新编译,因此每当设计者按下该按钮时,他们需要等待几秒钟。此外,这里有一个先有鸡还是先有蛋的问题--在定义至少生成一次之前,您不能引用该类型。(就像“public enum CharacterType { dummy }”).在设计者编辑字符串列表之后,按下生成按钮,并等待几秒钟,他们将能够在使用该枚举类型(本例中为CharacterType)的任何字段中看到更新后的选择。
注意事项:
请记住,这个方法有点脆弱,就像你在编辑器中使用枚举一样。在值的中间删除或插入枚举值可能会导致使用该枚举的任何字段使用错误的索引,因为所有索引都将移动一位。不会有编译器错误,而且你可能会在运行时得到奇怪的活动。
如果在代码中使用枚举值,删除或重命名该枚举值可能会导致代码停止编译(这可能是件好事-使用字符串时没有编译器错误,并且在运行时您会得到一个无声的令人困惑的惊喜)。