【问题标题】:Instantiate a class that derives from MonoBehaviour [duplicate]实例化一个派生自 MonoBehaviour 的类
【发布时间】:2015-06-16 03:26:50
【问题描述】:

有没有办法实例化从 MonoBehaviour 派生的类,例如下面的示例而不会收到警告:“您正在尝试使用 'new' 关键字创建 MonoBehaviour。这是不允许的。只能添加 MonoBehaviour使用 AddComponent()。或者,您的脚本可以从 ScriptableObject 继承或根本没有基类"

例子:

public class e1506131012test2 : MonoBehaviour 
{
    Move move = new Move();
    //Move move = gameObject.GetComponent<Move>();

    void Update()
    {
        move.Printing();
    }

}

public class Move : MonoBehaviour 
{
    public int number = 5;

    public void Printing()
    {
        print(number);
    }
}

【问题讨论】:

  • 您能否澄清一下“不允许这样做”的哪一部分需要更多解释?或者,您可以说明您的实际目标,并且可能有不同的方法来实现它。
  • 尝试:AddComponent(Move);在 "class e1506131012test2" 中,不要让 Move 派生自 MonoBehaviour...
  • 添加组件(移动);或 gameObject.Addcomponent();给我另一个控制台错误(见下面的答案)。我希望实例化一个派生自 MonoBehaviour 的类(例如:class myClass : MonoBehaviour into myOtherClass)

标签: c# inheritance unity3d


【解决方案1】:

有几种方法可以做到这一点,最简单的可能是使用AddComponent,如错误消息所示:

Move move;
void Start()
{
    move = gameObject.Addcomponent<Move>();
}

您不能只使用new 建立从 MonoBehaviour 派生的对象的原因是此类对象必须是 GameObject 的组件。因此,无论何时创建一个,都必须确保以有效的方式添加它。

【讨论】:

  • 谢谢,当我使用 Move 时 move = gameObject.Addcomponent();我在控制台中收到错误消息:“字段初始化程序无法引用非静态字段、方法或属性‘UnityEngine.Component.gameObject”希望有一种方法可以实例化从 MonoBehaviour 派生的类,而不会出现控制台错误或警告。干杯
  • 是的,对不起,我没有想到,我已经将我的答案更新为应该有用的东西。顺便说一句,如果你的 e1506131012test2 GameObject 总是有一个 Move 组件,你可能想通过检查器添加它。
  • 谢谢亚当,这意味着每次我希望实例化从 MonoBehaviour 派生的类并将类脚本附加到它时,我都必须创建一个新的游戏对象,对吗?我希望将其保留在代码级别(在检查器中没有拖放),您对编写它的最佳方式有什么建议吗?干杯
  • 你不能有一个没有游戏对象的 MonoBehaviour(组件),但你可以有多个 MonoBehaviour(组件)附加到单个游戏对象。不要被 gameObject 的使用弄糊涂了,这是对当前组件所属的 GameObject 的引用。
  • 感谢亚当的帮助
【解决方案2】:

只是不要从 MonoBehaviour 派生它。

public class Move 
{
    public int number = 5;

    public void Printing()
    {
        print(number);
    }
}

如果它真的必须是 MonoBehaviour,那意味着你可能将它放在预制件上,在这种情况下你使用 Instantiate()。

【讨论】:

  • 感谢安德鲁的评论。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-14
  • 2021-11-19
  • 2013-05-20
相关资源
最近更新 更多