我正在制作视觉小说,我的游戏使用了一些自定义类来存储重要数据。
示例:
public class Speech
{
public Sprite CharacterHead; // Holds a reference to a sprite which is the "head" of who's currently speaking
public LocalizedString SpeechOrigin; // Holds a reference to a localizedstring that is what that character is saying based on the language. (Uses Unity.Localization)
public string Name; // the name of the character that is speaking
}
此“语音”类从不应该在运行时更改,而只需要在对话期间读取即可。
我的问题是:存储这种类型的数据的通用的良好做法是什么?我对团结还很陌生,而我发现做到这一点的唯一方法是通过在monobehaviour类上声明一个List并通过Inspector对其进行编辑,但这似乎不是在将要处理的游戏中处理此问题的有效方法。拥有1000多种不同的“语音”。
Ps:不要介意所有变量都是公共的,现在就以这种方式使开发的某些部分变得更容易,我会在必要时更改必要的部分。
答案 0 :(得分:1)
您不应使用c#代码存储大量数据,而应使用通过创建JSON文件,XML文件或任何其他类型的人类和计算机可读格式为数据设计的外部文件。
XML应该是您的用例的最佳选择,它已广泛用于对话树
以下是您可以在用例中使用XML的示例
<npcs>
<npc name="Oren">
<dialogue>
<text>Hi #{PlayerName} do you want to eat falafel? </text>
<options>
<option action="yes">yes, I would like</option>
<option action="no">no...</option>
</options>
</dialogue>
</npc>
</npcs>
使用XML非常简单,并且非常适合对话
答案 1 :(得分:1)
有一些很好的方法来存储此信息,尤其是在将它们本地化的情况下。本质上,您将存储一个ID,该ID用来引用各种字符串,在所有语言文件中该ID都是恒定的。
基本上,您可以使用某些电子表格软件(例如Google表格),并在那里发表所有演讲;一列为字符串的ID,一列为实际值。您可以将工作表导出为CSV文件,然后加载到Unity中。 然后,您可以编写一些简单的解析代码,以从文件中读取每一行,并拆分ID和值并将其存储在字典中。
使用JSON,如果正确构建它,则可以使用Unity内置的JSON实用程序或其他更好的实用程序将数据直接读取到C#对象类中。 here上有不错的视频对此进行了说明。
YAML与JSON基本相同,但括号较少。这也是Unity用于序列化的格式。但是,由于没有内置解析器,因此只能通过编写自己的解析器或使用第三方解析器来使用这种格式。
如今,JSON文件通常是用于数据存储的行业标准,但是最终取决于您所使用的最容易使用的格式。我已尝试按照在文件中添加和删除字符串的难易程度的顺序列出这些内容。
答案 2 :(得分:1)
您为什么不只使用ScriptableObject
?这是Unity在游戏中存储数据的默认方式。您也可以从Unity编辑器中编辑它,而不是使用其他外部编辑器。您还可以将任何资源从游戏项目的文件夹中拖放到其中(例如,头部的纹理,整个本地化的字符串作为数据,对话框音频片段等)