初面网初面网

脚本间数据传递

在数据传递中,又分为:静态变量、单例、事件、接口。

静态变量

public class ScriptA
{
    public static int a = 10;
}

public class ScriptB
{
  void Start(){
    Debug.Log(ScriptA.a);
  }
}

获取实例上的脚本或绑定脚本

  • 获取实例上的
public class ScriptA
{
    public static int a = 10;
}

public class ScriptB : MonoBehaviour
{
  ScriptA scriptA;
  void Start(){
    scriptA = GetComponent<ScriptA>();
    Debug.Log(scriptA.a);
  }
}
  • 获取绑定脚本
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

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

使用单例

public class ValueGet
{
  private int num = 10;

  ValueGet static _valueGet = null;
  public static ValueGet GetInstance()
  {
    if (_valueGet == null)
    {
      _valueGet = new ValueGet();
    }
    return _valueGet;
  }
}

使用SendMessage

可用于同物体,以及该物体下的子物体内的脚本间的通信。

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("接收函数", 参数)发送给自身的所有脚本,以及自身子物体及孙类等层级的所有脚本

使用事件中心

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

更新于 2025/2/26