在 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 在语言文件中保持不变。

  1. CSV 格式文件

基本上,您可以使用一些 spreadsheet 软件(例如 Google Sheets)并在那里进行所有演讲;一列用于字符串的 ID,一列用于实际值。您可以将 sheet 导出为 CSV 文件并加载到 Unity 中。 然后您可以编写一些简单的解析代码来读取文件中的每一行,并将 ID 和值拆分出来并存储在字典中。

  1. JSON 格式化文件

使用 JSON,如果您正确构建它,您可以使用 Unity 的内置 JSON 实用程序或其他更好的实用程序,将数据直接读入 C# 对象 类。 here.

可以找到解释这一点的不错的视频
  1. YAML 格式文件

YAML 与JSON 基本相同,只是少了括号。它也是 Unity 用于序列化的格式。但是,您只能通过编写自己的解析器或使用第三方解析器来使用此格式,因为没有内置解析器。

JSON 文件通常是当今数据存储的行业标准,但最终由您决定哪种格式最容易使用。我试着按照从文件中添加和删除字符串的难易程度来列出这些内容。

为什么不直接使用 ScriptableObject?这是 Unity 在游戏中存储数据的默认方式。您也可以从 Unity Editor 中编辑它,而不是使用其他外部编辑器。您还可以 drag-and-drop 将游戏项目文件夹中的任何资源放入其中(例如头部的纹理、作为数据的整个本地化刺痛、对话音频剪辑等)

https://docs.unity3d.com/Manual/class-ScriptableObject.html

https://youtu.be/aPXvoWVabPY