【问题标题】:Creating System.Object instance in Unity在 Unity 中创建 System.Object 实例
【发布时间】:2020-07-02 21:16:32
【问题描述】:

我在 Unity 中遇到了一种错误,可能是因为我几乎是新手: 我有一个正确存在于内存中的 MonoBehaviour 对象。 为了代码组织,这个对象有两个标准 System.Object 类的成员,需要通过新的调用来创建。

class A
{
     // ...
}
class B
{
    // ...
}
class Status : MonoBehaviour
{
    A m_AVar;
    B m_BVar;

    public A AVar
    {
        get {return m_AVar;}
        protected set { m_AVar = value; }
    }
    public B BVar
    {
        get { return m_BVar; }
        protected set { m_BVar = value; }
    }

    void Awake()
    {
         // SingletonImplementation
    }

    void Start()
    {
        m_AVar = new A();
        m_BVar = new B();
    }

在游戏中的某个时刻,有人决定调用我的 Status.ExecuteSomeAction():

    public void ExecuteSomeAction()
    {
          AVar.DoSome();
          BVar.DoSomethingElse();
    }

一切顺利。而最后通过 UIButton.OnClickEvent:

    public void ExecuteOnClickAction()
    {
        AVar.Foo();
    }

但是不管什么 AVar 结果都是 null。左右阅读,我觉得那些 System.Object 的幕后有些东西我仍然没有得到。

我哪里做错了?

【问题讨论】:

    标签: c# unity3d


    【解决方案1】:

    前段时间我自己也遇到过类似的问题。 当单例模式创建此类(状态)的新实例时,将不会创建指向 UI 对象的链接。

    为了解决这个问题,创建一个负责处理 UI 的类。然后这个类将调用你的 Status 类。

    另一种方法是根据您的需要更改单例模式。就我而言,我只是写了这个:

    public static Status Instance { get; set; }
    
    public Awake()
    {
       Instance = this;
    }
    

    这可能有点草率,因为如果这个类有多个实例,但它确实可以完成工作,我会遇到问题。

    【讨论】:

    • 我还是不明白:为什么在代码的某些部分它可以工作,而在其他一些则不行?而且:A 和 B 不是 Unity UI 类,为什么不应该创建?
    • 差点忘了:B 类型,只有一个 int 属性,不存在这种问题。 (A 改为使用 SceneManager 来改变场景)。
    • 还有谜团:我添加了一个“sceneCreationTickCounter”,每次我新建它时都会增加它,并且当我使用它时检查为空:错误已解决并勾选为 1...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 2019-03-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多