连载是把双刃剑
Unity 希望让每个人都变得更轻松,包括编码知识有限的人(初学者、设计师)。
为了帮助他们解决问题,Unity 在检查器中显示数据。这使得编码人员可以通过调整值进行编码,而设计人员可以在不打开 MonoDevelop/IDE 的情况下进行设计。
有两种方法可以在检查器中显示值:
public int myVar = 10;
[SerializeField] private int myOtherVar = 0; // Can also be protected
第二种更好,因为它符合封装原则(变量是私有的/受保护的,并通过方法或属性进行修改)。
当您在编辑器中显示变量时,脚本中给定的值仅在拖动脚本时使用。然后 Unity 会序列化这些值,并且不再关心任何脚本修改。这可能会导致混乱,例如,myVar
在脚本中设置为 20 后,实际上不会使用它。序列化写入场景文件中。
示例中的两行代码的工作方式完全相同。
可能的解决方案
通过按脚本组件设置轮上的 Reset,可以让 Unity 考虑脚本中的新值。这还将重置组件的所有其他变量,因此仅在需要时才执行此操作。
将变量设置为私有并省略属性[SerializeField]
将禁用序列化过程,因此 Unity 将不再在场景文件中查找要显示的值 - 相反,该值将由脚本在运行时创建。
将组件添加到 Unity 时,会创建该组件类型的新对象。显示的值是该对象的序列化值。因此,只能显示成员值,而不能显示静态变量,因为它们不可序列化。 (这是一个 .NET 规范,并非严格特定于 Unity。)因为Unity不序列化静态字段 http://docs.unity3d.com/ScriptReference/SerializeField.html,这就是为什么添加static
修改器似乎解决了这个问题。
解释OP
在 OP 案例中,根据评论,您的公共字段在编辑器中显示的值为 1。您认为该值是默认值,而实际上它是您最初声明该字段时最有可能赋予该字段的值。将脚本添加为组件后,您将值设置为 10,并认为它有问题,因为它仍然使用值 1。您现在应该明白它按照设计工作得很好。
Unity 序列化什么?
默认情况下,Unity 将序列化并显示值类型(int、float、enum 等)以及字符串、数组、List 和 MonoBehaviour。 (可以使用编辑器脚本修改它们的外观,但这不是主题。)
下列:
public class NonMonoBehaviourClass{
public int myVar;
}
默认情况下不序列化。再次强调,这是 .NET 规范。 Unity 默认序列化 MonoBehaviour 作为引擎要求的一部分(这会将内容保存到场景文件中)。如果您希望在编辑器中显示“经典”类,只需这么说:
[System.Serializable]
public class NonMonoBehaviourClass{
public int myVar = 10;
}
显然,您不能将其添加到游戏对象中,因此您需要在 MonoBehaviour 中使用:
public class MyScript:MonoBehaviour{
public NonMonoBehaviourClass obj = new NonMonoBehaviourClass();
}
这将在检查器中显示该对象并允许修改myVar
实例中的变量NonMonoBehaviourClass
。再次强调,任何更改myVar
该值被序列化并存储到场景后,将不再考虑脚本内的内容。
有关在检查器中显示内容的额外提示
最后,接口也不显示在检查器中,因为它们不包含任何变量 - 仅包含方法和属性。在调试模式下,默认情况下不显示属性。您可以使用检查器右上角的三行按钮更改此模式。前两个设置是正常/调试。第一个是默认变量,第二个也将显示私有变量。这对于观察它们的值很有用,但不能从编辑器中更改。
因此,如果您需要显示界面,则必须考虑抽象类,因为它提供类似的功能(多继承除外),但可以是 MonoBehaviour。
参考:
http://docs.unity3d.com/ScriptReference/SerializeField.html http://docs.unity3d.com/ScriptReference/SerializeField.html
http://docs.unity3d.com/Manual/script-Serialization.html http://docs.unity3d.com/Manual/script-Serialization.html
https://www.youtube.com/watch?v=9gscwiS3xsU https://www.youtube.com/watch?v=9gscwiS3xsU
https://www.youtube.com/watch?v=MmUT0ljrHNc https://www.youtube.com/watch?v=MmUT0ljrHNc