经常看到论坛里面有问,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);
}
}
 
优点:
低耦合,调用方便。
缺点:
不言而喻基本没什么程序员爱用,效率较低,
以字符串的形式调用不是类型安全的, 出错调试起来十分困难