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

2015年10月08日 11:35 0 点赞 0 评论 更新于 2025-11-21 19:07

在论坛中,我们经常能看到这样的问题:在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(Model-View-Controller)架构的基础,能够有效解决多对一的调用需求。

示例代码

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

这是Unity 4.6之前自带的事件系统,基本实现了解耦,以字符串的形式发送消息。

示例代码

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);
}
}

优点

  • 低耦合:脚本之间的耦合度较低,调用方便。

缺点

  • 效率较低:该方法的执行效率不高,因此很少有程序员愿意使用。
  • 类型不安全:以字符串的形式调用不是类型安全的,出错后调试起来十分困难。

作者信息

洞悉

洞悉

共发布了 3994 篇文章