unity3d 类与类之间的通信

参考文章如下:

https://blog.csdn.net/KingSea168/article/details/47326045 脚本交互

https://www.cnblogs.com/jeason1997/p/4818777.html 优雅地管理你的代码

https://blog.csdn.net/arbut/article/details/44203371 委托、事件、单例在Unity3D中的使用

1,静态函数,直接使用类调用。

BasicGrammar.Fun();

2,直接引用,创建Prefab,挂载脚本。

public BasicGrammar bg; 在面部中挂载有BasicGrammar脚本的Prefab。

优点: 简单高效,编辑器中直接可见。
缺点: 脚本间强耦合,一个脚本的变化可能带来链式反应,也容易出现"Null ReferenceException"异常

3,获取到对象,使用SendMessage。

GameObject.Find(gameObject.name).SendMessage("Fun3"); //能调用private类型函数

优点:  低耦合,调用方便。
缺点:不言而喻基本没什么程序员爱用,效率较低,以字符串的形式调用不是类型安全的,出错调试起来十分困难

4,获取到对象,直接调用函数。

GameObject.Find(gameObject.name).GetComponent<BasicGrammar>().Fun2();

5,使用delegate和event。

在B类中获得A类的对象,然后将B类的方法注册给A类的委托(A.delegateA = FunB)即可。

A类在需要的地方调用委托即可调用到B类的函数。//能调用private类型函数

6,使用单例模式。

BasicGrammar.Instance.Fun();

优点: 逻辑结构清晰,有效解决了多对一的调用需求
缺点: 要保证单例的构造比子模块的构造早,单例的生命周期要控制好,单例类后期会变得极其臃肿

思考:

使用1:A,B,C,DanLi类,4个类全部挂载。DanLi类初始化时拿到A,B,C,3个类的对象,A,B,C类之间的交互使用DanLi类里的A,B,C的对象。

使用2:A,B,C,DanLi类,4个类全部挂载。A,B,C,3个类初始化时将需要使用的类注册到DanLi类的事件里,然后A,B,C类之间的交互使用DanLi类里的事件。

7,使用观察者模式(或者是类似于观察者模式),完成消息之间的通信。

猜你喜欢

转载自blog.csdn.net/tran119/article/details/81318045