有没有一种方法可以让脚本将对象引用为字段



我在四处搜索时遇到了困难,可能严重误解了Unity希望您如何构建项目,但我的情况是:

我的游戏中有一些角色,我想在编辑器中配置它们。我已经创建了表示不同行为类型和可以执行的操作的类有没有一种方法可以让我在脚本上为这些类键入一个字段,这样我就可以使用检查器进行拖放,以配置不同的预制件

以下是一些演示情况的代码:

单位.cs

// A unit on the board.
public class Unit : MonoBehaviour
{
public UnitAction action;
}

UnitAction.cs

// A unit on the board.
public class UnitAction : MonoBehaviour
{
// Does things
}

一旦将此脚本应用于预制件,这些字段就会显示在检查器中,但没有填充默认字段值的选项。如果我使字段类型为UnityEngine.Object,我可以将脚本放在那里,但这似乎是我不想要的。

听起来您正试图序列化对脚本本身的引用,而不是那些脚本的实例。有几种方法可以让你做到这一点:

  1. 您可以将UnitAction脚本附加为GameObject的组件,该组件位于您的";单位";对象(在同一场景中,是"单位"对象的子对象,或者可能是最常见的情况,是"单元"对象本身(。然后,您将能够将这些实例化的组件序列化到Unit类中的字段中。这是最常见的用例。

  2. 您可以为每个UnitAction组件创建一个预制件,然后将这些预制件序列化到单元类字段中。然后在运行时实例化一个UnitAction。根据您所描述的内容,这似乎并不适合您的案例,因为UnitAction可能不需要动态实例化,但要注意这一点很重要。这篇文章有一个使用这种方法给一个单位一个咒语列表的例子(还提供了一些关于如何考虑使用可能对你有价值的统一组件的良好上下文(:

Unity:现在您正在考虑组件

我猜您不希望这些脚本在编辑器中公开,所以您可以使用一个名为SerializeField的属性。它将向编辑器公开字段,这样您就可以拖动引用,但其他脚本将无法访问您放入的字段。

如果你想在编辑器中显示一个特定的脚本,只需编写

[SerializeField] private YourScriptName scriptReference = null;

由于列表是通用结构,如果你愿意,你也可以用类似的方式制作脚本列表

[SerializeField] private List<YourScriptName> scriptListReference = new List<YourScriptName>();

由于我认为您不会再分配这些引用,如果您想在任何时候获取引用,您可以制作一个getter方法。

public YourScriptName GetYourScript(){ return scriptReference;}

Unity很少有字段不能序列化,所以通常情况下,如果你想拖动对组件、脚本、对象等的引用,你需要做的就是将其设为SerializeField或public,后跟你想拖动的任何类型。

从文档来看,序列化系统

无法序列化静态字段。

无法序列化属性。

CAN串行化公共非静态字段(可串行化类型(

CAN序列化标记有SerializeField属性的非公共非静态字段。

它可以序列化的字段如下

  • 从UnityEngine继承的所有类。对象,例如游戏对象,组件,MonoBehavior,纹理2D,动画剪辑
  • 所有基本数据类型,如int、string、float、bool
  • 一些内置类型,如Vector2、Vector3、Vector4、四元数、Matrixx4、Color、Rect、LayerMask
  • 可序列化类型的数组可序列化类型
  • 枚举
  • 结构

相关内容

最新更新