查看原文
其他

unity解决脚本相互调用的几种方法丨Gad程序

2015-10-07 Gad-腾讯游戏开发者平台


经常看到论坛里面有问,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. 单例模式
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
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);

}

}

优点:
低耦合,调用方便。
缺点:

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

免费组件下载丨专业知识学习丨组队游戏制作丨项目孵化渠道

腾讯游戏开发者平台Gad微信号:Gad-GameDev

腾讯游戏出品,国内业界首家专业独立游戏开发者平台。

Gad面向游戏从业者,打造开放、互联、回馈、分享的专业游戏人社区。


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存