Appearance
脚本间数据传递
在数据传递中,又分为:静态变量、单例、事件、接口。
静态变量
csharp
public class ScriptA
{
public static int a = 10;
}
public class ScriptB
{
void Start(){
Debug.Log(ScriptA.a);
}
}
获取实例上的脚本或绑定脚本
- 获取实例上的
csharp
public class ScriptA
{
public static int a = 10;
}
public class ScriptB : MonoBehaviour
{
ScriptA scriptA;
void Start(){
scriptA = GetComponent<ScriptA>();
Debug.Log(scriptA.a);
}
}
- 获取绑定脚本
csharp
public class ScriptA
{
public static int a = 10;
}
public class ScriptB : MonoBehaviour
{
public ScriptA scriptA;
void Start(){
Debug.Log(scriptA.a);
}
}
// 需要在编辑器中,将脚本A拖拽到脚本B的scriptA属性上
使用PlayerPrefs
csharp
public class ScriptA
{
public static int a = 10;
}
public class ScriptB : MonoBehaviour
{
void Start(){
PlayerPrefs.SetInt("a", ScriptA.a);
// 判断是否存在
if(PlayerPrefs.HasKey("a")){
Debug.Log("存在");
ScriptA.a = PlayerPrefs.GetInt("a");
}else{
Debug.Log("不存在");
}
Debug.Log(ScriptA.a);
}
}
使用单例
csharp
public class ValueGet
{
private int num = 10;
ValueGet static _valueGet = null;
public static ValueGet GetInstance()
{
if (_valueGet == null)
{
_valueGet = new ValueGet();
}
return _valueGet;
}
}
使用SendMessage
可用于同物体,以及该物体下的子物体内的脚本间的通信。
csharp
public class ScriptA
{
private int a = 10;
public void GetA(){
Debug.Log(a);
}
}
public class ScriptB : MonoBehaviour
{
void Start(){
SendMessage("GetA");
}
void GetA(){
Debug.Log(ScriptA.a);
}
}
还有几个其他方法:
方法 | 说明 |
---|---|
SendMessage("接收函数", 参数) | 发送给自身的所有脚本 |
SendMessageUpwards("接收函数", 参数) | 发送给自身的所有脚本,以及自身父物体及先祖等层级的所有脚本 |
BroadcastMessage("接收函数", 参数) | 发送给自身的所有脚本,以及自身子物体及孙类等层级的所有脚本 |
使用事件中心
csharp
public class EventCenter
{
public delegate void EventDelegate(int a);
public static event EventDelegate OnEvent;
public static void SendEvent(int a)
{
if (OnEvent != null)
{
OnEvent(a);
}
}
}
public class ScriptA
{
private int a = 10;
void Start(){
EventCenter.OnEvent += GetA;
}
void GetA(int a){
Debug.Log(a);
}
}
public class ScriptB : MonoBehaviour
{
void Start(){
EventCenter.SendEvent(ScriptA.a);
}
}