经常看到论坛里面有人问,unity中脚本怎么调用另一个脚本,或者unity里面的有没有事件管理器等等,本文17xuee游戏学堂就为大家介绍了游戏开发之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
}
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);
}
}
优点:
低耦合,调用方便。
缺点:
不言而喻基本没什么程序员爱用,效率较低,以字符串的形式调用不是类型安全的,出错调试起来十分困难。