Unity3D与数据传值技术


在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来进行传值

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值