unity解决脚本相互调用的几种方法

发表于2015-08-07
评论0 3.5k浏览
经常看到论坛里面有问,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);
}
}
优点:  
   低耦合,调用方便。
缺点:

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

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引