C# 在两个类之间传递信息,其中一个类是单行为类

C# 在两个类之间传递信息,其中一个类是单行为类,c#,unity3d,callback,C#,Unity3d,Callback,我想将数据从classA传递到扩展单行为的classB 我在我的classB public void activate(String nameVal) { } 我使用ClassB.activate(“数据”)调用了上述方法。但由于某些原因,它从未被称为。如何将回调从classA发送到classB?取决于您的需要: 1) 将activate()设置为静态。就像在C#中一样,调用静态方法不需要对对象的引用 2) 如果您符合“一个对象”的要求,那么可以使用单例模式 互联网上有很多关于它的

我想将数据从
classA
传递到扩展单行为的
classB

我在我的
classB

public void  activate(String nameVal)
  {

  }

我使用
ClassB.activate(“数据”)
调用了上述方法。但由于某些原因,它从未被称为。如何将回调从classA发送到classB?

取决于您的需要:

1) 将activate()设置为静态。就像在C#中一样,调用静态方法不需要对对象的引用

2) 如果您符合“一个对象”的要求,那么可以使用单例模式

互联网上有很多关于它的图图,所以我不会对其进行太多的扩展,但基本上,您创建一个包含唯一对象的静态变量,如下所示:

public class Singleton : MonoBehaviour
{
    private static Singleton instance = null;

    private Singleton()
    {
    }

    public static Singleton Instance
    {
        get
        {
            if (instance==null)
            {
                instance = new Singleton();
            }
            return instance;
        }
    }
}
您可以想出更先进的方法来在中实现它

编辑: 应该注意的是,这是一个相当奇怪的需求。通常,是单一行为控制着另一个“简单”脚本。在非单行为的进程之后,您可能确实需要回调,但在本例中,脚本B引用了classA

因此,我添加了一个3)适当的回调:

类B,包含MyCallback()(适合需要的适当方法)

A类:

public void DoSomeProcess(string data, Action<string> callback)
{
    // Some process
    callback("data processed");
}
public void DoSomeProcess(字符串数据、操作回调)
{
//一些过程
回调(“数据处理”);
}

这取决于
classA
上的方法

CallClassB
未被调用。
如果您正在调用
CallClassB()
,那么您可以完全确定
ClassB.activate(“数据”)将被调用,或者您将得到一个
NullReference异常

public class classA
{
    public classB ClassB;

    //this method either:
    //OPTION 1 - calls ClassB.activate  
    //OPTION 2 - gets a NullReference Exception  
    public void CallClassB()
    {
        ClassB.activate("data");
    }
}
进一步说明:
也许值得考虑的是,在C#中,小写代表变量(作为类的实例),而大写代表类。
阅读你的评论,你似乎在做相反的事情

进一步说明2:
这不是回调。如果我们谈论回调,我们应该提到事件、侦听器、委托或任何其他可能的回调。如果这是你的情况,答案是:
-classB尚未收到您的回拨。


为什么取决于回调而不是方法。

在何处以及如何调用它?你怎么确定它叫什么名字?它什么也不做。。您可能至少应该在调用该方法时添加日志。。。你能为上下文添加更多的代码吗?同样值得一提的是,单例模式非常有争议,如果可能的话,你应该始终使用“真实”引用。类名使用大写,变量使用小写<代码>ClassB ClassB
public class classA
{
    public classB ClassB;

    //this method either:
    //OPTION 1 - calls ClassB.activate  
    //OPTION 2 - gets a NullReference Exception  
    public void CallClassB()
    {
        ClassB.activate("data");
    }
}