在 Unity 中存储只读数据的良好做法
Good practices for storing readonly data in Unity
我正在制作视觉小说,我的游戏使用了一些自定义 classes 来存储重要数据。
示例:
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
}
此“演讲”class 不应在运行时更改,只需要在对话期间阅读。
我的问题是:存储此类数据的一般良好做法是什么?我对 unity 还很陌生,我发现唯一的方法是在 monobehaviour classes 上声明一个 List 并通过 Inspector 编辑它们,但这似乎不是处理这个问题的有效方法一款将有 1000 多种不同“语音”的游戏。
Ps:不要介意所有的变量都是public,它们现在这样是为了让开发的某些部分更容易,我会在适当的时候改变必要的。
您不应在 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,而且非常适合对话
有几种存储这些信息的好方法,特别是如果您也对它们进行本地化。本质上,您将存储一个 ID,您使用该 ID 引用各种字符串,该 ID 在语言文件中保持不变。
- CSV 格式文件
基本上,您可以使用一些 spreadsheet 软件(例如 Google Sheets)并在那里进行所有演讲;一列用于字符串的 ID,一列用于实际值。您可以将 sheet 导出为 CSV 文件并加载到 Unity 中。
然后您可以编写一些简单的解析代码来读取文件中的每一行,并将 ID 和值拆分出来并存储在字典中。
- JSON 格式化文件
使用 JSON,如果您正确构建它,您可以使用 Unity 的内置 JSON 实用程序或其他更好的实用程序,将数据直接读入 C# 对象 类。
here.
可以找到解释这一点的不错的视频
- YAML 格式文件
YAML 与JSON 基本相同,只是少了括号。它也是 Unity 用于序列化的格式。但是,您只能通过编写自己的解析器或使用第三方解析器来使用此格式,因为没有内置解析器。
JSON 文件通常是当今数据存储的行业标准,但最终由您决定哪种格式最容易使用。我试着按照从文件中添加和删除字符串的难易程度来列出这些内容。
为什么不直接使用 ScriptableObject
?这是 Unity 在游戏中存储数据的默认方式。您也可以从 Unity Editor 中编辑它,而不是使用其他外部编辑器。您还可以 drag-and-drop 将游戏项目文件夹中的任何资源放入其中(例如头部的纹理、作为数据的整个本地化刺痛、对话音频剪辑等)
我正在制作视觉小说,我的游戏使用了一些自定义 classes 来存储重要数据。
示例:
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
}
此“演讲”class 不应在运行时更改,只需要在对话期间阅读。
我的问题是:存储此类数据的一般良好做法是什么?我对 unity 还很陌生,我发现唯一的方法是在 monobehaviour classes 上声明一个 List 并通过 Inspector 编辑它们,但这似乎不是处理这个问题的有效方法一款将有 1000 多种不同“语音”的游戏。
Ps:不要介意所有的变量都是public,它们现在这样是为了让开发的某些部分更容易,我会在适当的时候改变必要的。
您不应在 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,而且非常适合对话
有几种存储这些信息的好方法,特别是如果您也对它们进行本地化。本质上,您将存储一个 ID,您使用该 ID 引用各种字符串,该 ID 在语言文件中保持不变。
- CSV 格式文件
基本上,您可以使用一些 spreadsheet 软件(例如 Google Sheets)并在那里进行所有演讲;一列用于字符串的 ID,一列用于实际值。您可以将 sheet 导出为 CSV 文件并加载到 Unity 中。 然后您可以编写一些简单的解析代码来读取文件中的每一行,并将 ID 和值拆分出来并存储在字典中。
- JSON 格式化文件
使用 JSON,如果您正确构建它,您可以使用 Unity 的内置 JSON 实用程序或其他更好的实用程序,将数据直接读入 C# 对象 类。 here.
可以找到解释这一点的不错的视频- YAML 格式文件
YAML 与JSON 基本相同,只是少了括号。它也是 Unity 用于序列化的格式。但是,您只能通过编写自己的解析器或使用第三方解析器来使用此格式,因为没有内置解析器。
JSON 文件通常是当今数据存储的行业标准,但最终由您决定哪种格式最容易使用。我试着按照从文件中添加和删除字符串的难易程度来列出这些内容。
为什么不直接使用 ScriptableObject
?这是 Unity 在游戏中存储数据的默认方式。您也可以从 Unity Editor 中编辑它,而不是使用其他外部编辑器。您还可以 drag-and-drop 将游戏项目文件夹中的任何资源放入其中(例如头部的纹理、作为数据的整个本地化刺痛、对话音频剪辑等)