三个班级之间的交流,彼此都不认识

时间:2019-12-10 14:50:24

标签: c# oop unity3d delegates

我希望有人能帮助我弄清楚如何让三个班级互相交流

我有一个知道B和C类的A类,并且我必须传递布尔值或文本之类的数据,而B和C却彼此不认识...我知道我应该使用委托来处理这类事情。 ..但是我想以巫婆的方式使用它们..

好吧,我会说得更清楚一点,就像我说的那样,我有一个了解B和C的A类,但是B和C彼此不认识。

在B类上,一个带有await的方法正在运行一个任务,该任务将播放大量资源和动画,直到满足特定条件为止,在这种情况下,B类中的async函数现在将在C中中断类中有一个Onclick事件(带有UI按钮),将在按下该事件时再次启动B类上的Task。...

所以回顾一下 A =实例化B和C B =启动一个任务,如果满足特定条件,该任务将被中断。 C =如果B处于“等待”模式,并且触发了OnClick事件,则B类的Task将会再次开始。

有人可以帮助我吗?

3 个答案:

答案 0 :(得分:0)

根据您的描述,显然会想到一个答案:接口。

接口是一个附加的声明,是一种“合同”,您可以在其中声明一个具有此类公共方法(setter / getter)的类。一个类可以实现多个接口,并且接口声明只能包含该功能的某些方面(即,您可以具有ITriggerable接口,该接口将一个类声明为具有公共void Trigger()方法)。

如果您发现自己太受类的相互依赖关系和/或继承树的束缚,则此方法非常有用。您可以拥有完全不相关的类(不仅是单行为的,而且是POCO的)实现相同的接口,并且它限制了一个类对另一类所需的知识量。我不需要知道您的父类还是您的其他字段,只要我知道您可以ITrigger,就可以在您身上调用Trigger,这就是我所需要知道的全部信息。

如果以后您想在不同的上下文中重用代码,则接口可能是天赐之物,因为您无需引入任何其他依赖项。

很有帮助的是,Unity为所有GetComponent调用提供了重载,这些重载以接口名称而不是类名称作为参数,因此我可以通过调用查找所有可触发的子代

  var trigs= GetComponentsInChildren<ITriggerable>(). 

Unity对接口的唯一缺少的处理是能够显示对象实现和接口的公共字段,但是我怀疑这是由于对象不必从UntiyEngine.Object派生来实现给定的界面。

答案 1 :(得分:0)

这是我一直在寻找的,是开始的好地方

公共类ClassA {

ClassB _b;
ClassC _c;

void Start()
{
    _b = new ClassB();
    _c = new ClassC();

    _c.Button.onClick.AddListener(() => {
        if(!_b.IsRunning)
        {
            _b.SomeTask();
        }
    });
}


public class ClassB{

public bool IsRunning {get; private set;}

public async Task SomeTask()
{
    IsRunning = true;

    //do stuff

    IsRunning = false;
}}

public class ClassC{
public UIButton Button;}

答案 2 :(得分:-1)

1-任何monobehaviour类(是吗?)都可以引用为一种类型,例如:

  

public MyClass myClass;

然后可以访问其中的任何公共变量或方法。 2-将A类设为可以实例化的类(Singleton模式):

  

公共类MyClass:MonoBehaviour {

private static MyClass instance = null;

public static MyClass Instance {
    get {
        return instance;
    }
}
//Check if it hasn't been already instanciated!
void Awake() {
    if (instance != null && instance != this) {
        Destroy(this.gameObject);
    }
    instance = this;
}

然后您可以在任何地方致电MyClass.DoSomething(); ...