我希望有人能帮助我弄清楚如何让三个班级互相交流
我有一个知道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将会再次开始。
有人可以帮助我吗?
答案 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();
...