在unity3d中,经常会遇到一个脚本需要调用(或传送到)其他脚本数据的情况,在刚学unity3d时我经常使用获取脚本组件的方式来获取数据,没错,即使这种Getcomponent<脚本名>()方法来获取脚本上的信息,但是特别麻烦,大概用了两周,觉得太恶心了,脚本所挂载的对象名改了,脚本名改了,脚本的引用先后等等,头皮发麻,后来干脆把数据全部用Playerprefs存起来,直接调用,我觉得很好,就这样用着。但想想有点不严谨啊,还是用单例吧,嗯,我觉得这样很好。但其实还有好几种方式,所以总结了一下我所用过的脚本之间如何进行值传递。
脚本组件方式传值
先创建两个脚本A和B,再创建两个对象改名为A和B,将对应的脚本挂上去
public class A : MonoBehaviour {
public string hero;
void Start () {
hero = GameObject.Find("B").GetComponent<B>().person;
Debug.Log(hero);
}
}
public class B : MonoBehaviour {
public string person;
void Start () {
person = "Tsila";
}
}
接下来我们运行一下:
没有成功的传递,这个与脚本的执行顺序有关,两个Start()总有一先一后,我让两个脚本分别添加:
Debug.Log("B"+Time.realtimeSinceStartup);
............................................
Debug.Log(" A:"+ Time.realtimeSinceStartup);
结果如下:
A脚本比B脚本先执行,所以B中的初始化A无法获取。这种情况只有去edit>Project Settings>Script Execution Order里去改变脚本的执行顺序,数值越小优先级越高。
这样B脚本就先于A执行了,就能准确的把值传递过来了。
静态类传值
我们先创建第一个脚本,值产生的脚本Person,里面的信息我们需要传递给第二个值处理的脚本Server,还需要第三个脚本MyData,用来暂存数据。
using UnityEngine;
public class Person : MonoBehaviour
{
string name;
int age;
float height;
string sex;
private void Start()
{
name = "Alan";
age = 21;
height = 173;
sex = "男";
}
[ContextMenu("Send")]
void Send()
{
Mydata.name = name;
Mydata.height = height;
Mydata.age = age;
Mydata.sex = sex;
}
}
里面有四个数据,在person脚本中我们可以产生这个数据,但是这个类不做数据的处理,于是我们需要用第二个暂存的脚本MyData(这个不需要挂对象上):
public class Mydata
{
public static string name;
public static int age;
public static float height;
public static string sex;
}
这里记得是静态的,这样就不会存在创建对象了,数据会暂时在这里存着。
第三个脚本Server:
public class Server : MonoBehaviour {
[ContextMenu("print")]
void Test()
{
Debug.Log("name:"+Mydata.name+" age:"+Mydata.age+" height:"+Mydata.height+" sex:"+Mydata.sex);
}
}
这样就差不多了,测试一下,直接先测试Server的print()方法,结果:
先让Person的Send()触发一下,再来Print(),结果:
静态传值相对于第一种还是很方便的,关键点就是创建一个不继承的MONO的类,并且声明静态的数据用来存值。
SendMessage传值方式
这是一种Unity推荐的简单,易用,低耦合的数据传值技术
详情:https://docs.unity3d.com/ScriptReference/GameObject.SendMessage.html
2019.10.30补充:在一个类中使用这种方式调用另一个类里的某个方法是可行的,但是使用这种方式无法定位这个方法在哪些类中被调用,在查找所有有关方法的引用时,这种方式无法查找到,所以慎用
定义委托与事件进行传值
详情:https://blog.csdn.net/qq_36754021/article/details/76445937
PlayerPrefs技术
详情:https://docs.unity3d.com/ScriptReference/PlayerPrefs.html
XML数据持久化技术
详情:https://www.cnblogs.com/carsonche/p/6829411.html
网络服务器端技术
利用socket或者www来进行传值