我为什么要使用SerializeField?

Emi*_*uin 4 c# unity-game-engine

我刚刚开始学习C#和Unity,有一件事我不习惯:

我应该何时何地使用[SerializeField]

尽管使用[SerializeField]并且在我的Unity界面中有更多的文本框,但是将变量保留为硬编码是不是很糟糕?

提前感谢您的关注和耐心.

Pro*_*mer 7

为什么以及何时应该使用[SerializeField]?

使用该SerializeField属性会导致Unity序列化任何private变量.这不适用于C#中的静态变量和属性.

SerializeField需要变量时使用该属性,private但也希望它在编辑器中显示.

例如,这不会出现在编辑器中:

private float score;
Run Code Online (Sandbox Code Playgroud)

这是因为它是一个private变量,但下面的变量应该出现在编辑器中:

[SerializeField]
private float score;
Run Code Online (Sandbox Code Playgroud)

那是因为你申请SerializeField了它,你告诉Unity序列化它并在编辑器中显示它.


请注意,private变量与C#有关,而不是Unity.还有公共变量变量.标记变量private意味着您不希望其他脚本能够访问该变量.还有public资格赛.标记变量public意味着您希望其他脚本能够访问该变量.

有时,您希望其他脚本能够从另一个脚本访问您的变量,但您不希望该public变量显示在编辑器中.您可以public使用[HideInInspector]属性隐藏变量 .

这将在编辑器中显示:

public float score;
Run Code Online (Sandbox Code Playgroud)

不会在编辑器中显示:

[HideInInspector]
public float score;
Run Code Online (Sandbox Code Playgroud)

尽管使用[SerializeField]并且在我的Unity界面中有更多文本框,将变量保留为硬编码是不是很糟糕?

是的,这对于新用户来说尤其不好.对于很长一段时间的Unity和C#程序员来说,这应该不是什么大问题.这是不好的原因是因为你有以下代码:

[SerializeField]
private float score = 5f;
Run Code Online (Sandbox Code Playgroud)

默认值5位于编辑器中.保存脚本后,此变量现在在编辑器中更新为5.问题是您可以将此更改从编辑器更改为14.一旦从编辑器中更改它,脚本中的值仍然是,5但是当您运行它时,Unity将使用您在编辑器中设置的值14.这可能会导致您花费大量时间来解决甚至不是问题的问题,因为在您期望使用脚本中设置的默认值时,编辑器中设置了不同的值.

score变量重置为默认5变量的唯一方法是将变量重命名为其他变量或从编辑器重置变量.当你从改变它的值也不会更改,甚至53从脚本.必须从编辑器重命名或重置它.值得了解但是当你习惯Unity时,你不必担心这一点.


Dra*_*18s 5

[SerializeField] 属性用于将非公共字段标记为可序列化:以便 Unity 可以保存和加载这些值(默认情况下所有公共字段都是序列化的),即使它们不是公共字段。

这就是它所做的一切。你在需要的时候使用它。

  • 是的,但您可能想要更改/设置私有变量的值。我正是这个意思 (2认同)
  • @AyushKoul有时你可能想将所有类数据转储到一个文件或字符串中,例如 JSON 或二进制文件,这样你就可以从这样的文件中加载它(也许是因为你做了一个保存文件,你想在例如,未来)。序列化/反序列化是将原始数据转换为某种任意格式并返回的行为。请参阅 https://docs.unity3d.com/Manual/JSONSerialization.html (2认同)