经常看到论坛里面有问,unity中脚本怎么调用另一个脚本,或者unity里面的有没有事件管理器等等,下面我们可以看看unity解决脚本相互调用的几种方法
1. 直接引用
最基本调用另一脚本的办法。通常项目中使用在一个预制体的内部,该模块完全由自己负责基本不对外耦合,操作方式简单在Inspector中拖拽即可。
优点: 简单高效,编辑器中直接可见。
缺点:
脚本间强耦合
一个脚本的变化可能带来链式反应
也容易出现"Null ReferenceException"异常
2. 单例模式
mvc的基础,能有效的解决多对一调用需求
优点:
mvc结构,逻辑结构清晰,
有效解决了多对一的调用需求
缺点:
要保证单例的构造比子模块的构造早
单例的生命周期要控制好
单例类后期会变得极其臃肿
3. SendMessage,BroadCastMessage
unity4.6前的自带事件系统,基本解耦,以字符串的形式发送消息。ps:
优点:
低耦合,调用方便。
缺点:
不言而喻基本没什么程序员爱用,效率较低,
以字符串的形式调用不是类型安全的, 出错调试起来十分困难
1. 直接引用
最基本调用另一脚本的办法。通常项目中使用在一个预制体的内部,该模块完全由自己负责基本不对外耦合,操作方式简单在Inspector中拖拽即可。
[AppleScript]
纯文本查看
复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
|
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的基础,能有效的解决多对一调用需求
[AppleScript]
纯文本查看
复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
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:
[AppleScript]
纯文本查看
复制代码
01
02
03
04
05
06
07
08
09
10
11
|
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
)
;
}
}
|
优点:
低耦合,调用方便。
缺点:
不言而喻基本没什么程序员爱用,效率较低,
以字符串的形式调用不是类型安全的, 出错调试起来十分困难