Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在Unity中存储只读数据的良好实践_C#_Class_Unity3d_Localization_Storage - Fatal编程技术网

C# 在Unity中存储只读数据的良好实践

C# 在Unity中存储只读数据的良好实践,c#,class,unity3d,localization,storage,C#,Class,Unity3d,Localization,Storage,我正在制作一部视觉小说,我的游戏使用了一些存储重要数据的自定义类 例如: 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 t

我正在制作一部视觉小说,我的游戏使用了一些存储重要数据的自定义类

例如:

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
 }
此“Speech”类在运行时不应更改,只需在对话期间读取

我的问题是:存储此类数据的一般良好做法是什么?我对unity还相当陌生,我发现唯一能做到这一点的方法是在MonoBehavior类上声明一个列表,并通过Inspector进行编辑,但在一个将有1000多个不同“语言”的游戏中,这似乎不是一种有效的处理方法


Ps:不要介意所有的变量都是公共的,现在这样做是为了简化开发的某些部分,到时候我会更改必要的变量。

您不应该在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>

嗨#{PlayerName}你想吃沙拉三明治吗?
是的,我想要
不

使用XML非常简单,而且非常适合对话

有几种很好的方法来存储这些信息,特别是如果您也在本地化这些信息的话。从本质上讲,您将存储一个用于引用各种字符串的ID,该ID在语言文件中保持不变

  • CSV格式文件
  • 基本上,你可以使用一些电子表格软件(比如谷歌表格),把你所有的演讲都放在那里;一列表示字符串的ID,一列表示实际值。您可以将图纸导出为CSV文件并加载到Unity中。 然后,您可以编写一些简单的解析代码来读取文件中的每一行,并将ID和值拆分出来并存储在字典中

  • JSON格式文件
  • 对于JSON,如果您正确地构建它,您可以使用Unity的内置JSON实用程序或其他更好的实用程序,将数据直接读取到C#object类中。 一个像样的视频可以解释这一点

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


    JSON文件目前通常是数据存储的行业标准,但最终取决于您认为最容易使用的格式。我试着按照从文件中添加和删除字符串的容易程度来列出它们。

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


    谢谢!您的建议正是我所需要的,我在这一部分停留了一段时间,我正在寻找您提供的起点。谢谢您,我将对此进行研究。