经常看到论坛里面有问,unity中脚本怎么调用另一个脚本,或者unity里面的有没有事件管理器等等,下面我们可以看看unity解决脚本相互调用的几种方法
1. 直接引用
最基本调用另一脚本的办法。通常项目中使用在一个预制体的内部,该模块完全由自己负责基本不对外耦合,操作方式简单在Inspector中拖拽即可。
public class Window : MonoBehaviour { public Button button; void Start() { Debug.Log("ClickButton"); button.Click(); } } public class Button : MonoBehaviour { public void Click() { Debug.Log("Clicked Me"); } }
优点:
简单高效,编辑器中直接可见。
缺点:
脚本间强耦合
一个脚本的变化可能带来链式反应
也容易出现"Null ReferenceException"异常
2. 单例模式
脚本间强耦合
一个脚本的变化可能带来链式反应
也容易出现"Null ReferenceException"异常
2. 单例模式
mvc的基础,能有效的解决多对一调用需求
public class Player : MonoBehaviour { protected static Player instance; public static Player Instance { get { if (null == instance) { instance = GameObject.FindObjectOfType<Player>(); } return instance; } } void Awake() { if (null == instance) instance = this; if (this != instance) { Debug.LogError("singleton:" + this.ToString() + " exists, remove it"); GameObject.Destroy(this); } } void OnDestroy() { instance = null; } public void Jump() { Debug.Log("I Jumped"); } } public class JumpButton : MonoBehaviour { public void OnClick() { Player.Instance.Jump(); } }
优点:
mvc结构,逻辑结构清晰,
有效解决了多对一的调用需求
缺点:
要保证单例的构造比子模块的构造早
单例的生命周期要控制好
单例类后期会变得极其臃肿
3. SendMessage,BroadCastMessage
有效解决了多对一的调用需求
缺点:
要保证单例的构造比子模块的构造早
单例的生命周期要控制好
单例类后期会变得极其臃肿
3. SendMessage,BroadCastMessage
unity4.6前的自带事件系统,基本解耦,以字符串的形式发送消息。ps:
public class Window : MonoBehaviour { public GameObject button; void Start() { Debug.Log("ClickButton"); button.SendMessage("Click"); button.SendMessage("Click",this); button.SendMessage("Click",this,SendMessageOptions.DontRequireReceiver); } }
优点:
低耦合,调用方便。
缺点:
不言而喻基本没什么程序员爱用,效率较低,
以字符串的形式调用不是类型安全的, 出错调试起来十分困难
缺点:
不言而喻基本没什么程序员爱用,效率较低,
以字符串的形式调用不是类型安全的, 出错调试起来十分困难