【转】Unity3d的单例及场景间的数据传递
http://blog.csdn.net/zy19940906/article/details/47724387
单例是场景间切换时传递数据的最常见的方式之一,在unity中,很多方法被封装,有时候感觉不知道从何处看起,只能从官方文档上去根据功能找类了。个人感觉u3d可视化太过强烈,许多自定义的一些功能似乎让人无从下手,当然也可能是自己水平不够,不太熟悉。比如说场景间的数据传递,在cocos2dx时,我一般会在director里边创建一个单例Interface,用以游戏中的从数据库读取玩家信息,关卡信息,场景间的数据同步等;要么就是在场景间切换的时候直接用带参数的构造函数实现,在u3d就不用说了,场景一般是直接在界面上创建了,切换场景时也只是简单的一句 Application.LoadLevel(scene);,没法在另一个场景创建时传递数据,因为它的创建场景函数是这样的:
- // 摘要:
- // Create a new scene.
- [WrapperlessIcall]
- public static void NewScene();
因而只好用单例去实现了:
关于单例也很多种实现形式,参考了网上一些别人的方法,自己实践整理出三种较为便捷的方法,比较简单
方法一:纯c#单例,这个单例正常是不需要使用unity的接口和方法,当然,如果要读取文件用它的也是更方便
- using UnityEngine;
- using System.Collections;
- //用以存放数据测试用的结构体
- public struct Tollgate_Date
- {
- public int index;
- public int playerhealth;
- }
- public class MyInterface/* : MonoBehaviour*/
- {
- private static MyInterface myinterface = null;
- public Tollgate_Date[] date = new Tollgate_Date[10];
- // Use this for initialization
- void Start () {
- }
- public static MyInterface getInstance()
- {
- if(myinterface==null)
- {
- myinterface=new MyInterface();
- myinterface.init();
- }
- return myinterface;
- }
- public void init()
- {
- for (int i = 0; i < date.Length;i++ )
- {
- date[i].index = 1;
- date[i].playerhealth = 1;
- }
- }
- // Update is called once per frame
- void Update ()
- {
- }
- }
这个方法,就不能再继承基类MonoBehaviour了,继承之后它默认需要挂在在一个对象身上,所以入过不给对象,那么将赋值不了,myinterface一直为空。这样只需要在第一个场景任意一个object的脚本中初始化下就行了:MyInterface.getInstance();
方法二:手动创建一个对象挂载
- </pre><pre name="code" class="csharp">using UnityEngine;
- using System.Collections;
- public class MyDate : MonoBehaviour {
- private static MyDate mydate = null;
- public Tollgate_Date[] tollgatedate = new Tollgate_Date[10];
- public static GameObject obj;
- // Use this for initialization
- void Start () {
- }
- public static MyDate getInstance()
- {
- if(mydate==null)
- {
- obj = new GameObject("MyDate");//创建一个带名字的对象
- mydate = obj.AddComponent(typeof(MyDate)) as MyDate;
- mydate.init();
- DontDestroyOnLoad(obj);
- }
- return mydate;
- }
- void init()
- {
- for (int i = 0; i < tollgatedate.Length; i++)
- {
- tollgatedate[i].index = 1;
- tollgatedate[i].playerhealth = 1;
- }
- }
- // Update is called once per frame
- void Update () {
- }
- }
使用方法同方法一,仅仅在脚本中创建一个对象,而这个对象因为DontDestroyOnLoad函数将一直不会被释放,同时再次执行时也因为非空而保证不会再创建
其中
- mydate = obj.AddComponent(typeof(MyDate)) as MyDate;
- </pre><pre name="code" class="csharp">通过底层可以看到意思是添加一个名称为className的组件到游戏物体,把这个单例对象和GameObject对象关联起来。
方法三:对象方法
- using UnityEngine;
- using System.Collections;
- public class TestInstance : MonoBehaviour
- {
- private static TestInstance testinsatnce = null;
- public Tollgate_Date[] tollgatedate = new Tollgate_Date[10];
- // Use this for initialization
- void Start ()
- {
- }
- void Awake()
- {
- if (testinsatnce == null)
- {
- testinsatnce = this;
- testinsatnce.init();
- //
- DontDestroyOnLoad(gameObject);
- }
- else
- {
- Destroy(gameObject);
- }
- }
- public static TestInstance getInstance()
- {
- return testinsatnce;
- }
- void init()
- {
- for (int i = 0; i < tollgatedate.Length; i++)
- {
- tollgatedate[i].index = 1;
- tollgatedate[i].playerhealth = 1;
- }
- }
- // Update is called once per frame
- void Update () {
- }
- }
这个方法与第二个方法最大区别就是它是在场景中建立一个GameObject,把脚本挂载上去,而不是通过手动创建关联实现,在这里该对象在别处使用时,通过getinstance来取得当前的单例对象。
【转】Unity3d的单例及场景间的数据传递的更多相关文章
- WinForm登陆:窗体间的数据传递
1. 登陆逻辑 FrmMain 为主窗体(启动窗体) FrmLogin 为登陆窗体 在“主窗体”中使用ShowDialog()方法显示“登陆窗体”,并通过“登陆窗体”的DialogResult告知“主 ...
- C#不同窗体间通信,数据传递
在一个项目中,很多时候都需要在窗体间进行数据传递和通信,最觉见的是父子窗体之间的数据传递,比如登录ID,各个窗体都需要知道.有很多文章都写了这方面的问题,提出很多优秀的方法,鄙人不才,搜了一些资料之后 ...
- iOS:控制器间的数据传递
在iOS开发中遇到的控制器间的数据传递主要有两种情况:顺传递与逆传递.顺传递是指数据的传递方向和控制器的跳转方向相同(如图1):逆传递是指数据的传递方向和控制器的跳转方向相反(如图2).这里分别介绍这 ...
- 封装MySQL的单例,连接数据库并对数据进行增删改查操作
单例: 一个类只能有一个对象 应用场景:多次请求数据库只需要一个连接对象. 实现:三私一公 1.私有的静态属性用来保存对象的单例2.私有的构造方法用来阻止在类的外部实例化3.私有的__clone阻止在 ...
- hive、sqoop、MySQL间的数据传递
hdfs到MySQL csv/txt文件到hdfs MySQL到hdfs hive与hdfs的映射: drop table if exists emp;create table emp ( id i ...
- React Native移动开发实战-3-实现页面间的数据传递
React Native使用props来实现页面间数据传递和通信.在React Native中,有两种方式可以存储和传递数据:props(属性)以及state(状态),其中: props通常是在父组件 ...
- fragment间的数据传递
今天我将要讲的是fragment间的数据是如何进行传递的.这里我将举个简单的例子. 首先要有个MainActivity,它托管了MainFragment,而MainFragment又托管了DatePi ...
- vue组件间的数据传递
父组件向子组件传递数据 在 Vue 中,可以使用 props 向子组件传递数据. App.vue HelloWorld.vue 在子组件部分: 如果需要从父组件获取 logo 的值,就需要使用 p ...
- Liferay7 BPM门户开发之40: Form表单的Action到Render的数据传递
在Form提交后的变量,很多情况是要展现在jsp页面中,这时Action到Render的变量传递就非常有用. 例如,您在数据库中添加了学生的详细信息. 为了实现这一需求,先创建Form表单(学生的细节 ...
随机推荐
- Android(java)学习笔记98:如何让你的GridView不再滚动
1. 如何让你的GridView不再滚动: GridView显示不完整的原因是因为,他的外层也套用了一个滑动的控件,这个解决办法是:重写GridView,是控制GridView不能滚动,就是写一个类继 ...
- python_输出100:200内的素数
sushu=[] for i in range(100,201): for j in range(2,i): if i%j==0: break if i==j+1: sushu.append(i) p ...
- 踩坑日志!viser-ng的使用
在ng-alian项目中使用viser图表库,在app.module中引用了viser-ng,然而,在具体的html项目中使用<v-chart>会报错,提示v-chart不是一个angul ...
- Andrew NG 自动化所演讲(20140707):DeepLearning Overview and Trends
出处 以下内容转载于 网友 Fiona Duan,感谢作者分享 (原作的图片显示有问题,所以我从别处找了一些附上,小伙伴们可以看看).最近越来越觉得人工智能,深度学习是一个很好的发展方向,应该也是未来 ...
- 解决Jquery中使用each循环时,循环外的js依旧会执行
今天在改项目bug时,发现一个问题,我获取一个div中所有的input,并取值时,判断某一条件,但是循环外的js依然可以执行. $(".tab-reg-next input").e ...
- 【Ecshop】修改处理用户购物车的行为
Ecshop v2.7.3的购物车处理方面在现在看来有比较反用户体验的设计: 用户未登录时加入购物车的商品,在用户登录后会被清空而不是加入到登录用户的购物车中: 用户登录后加入购物车的商品,在退出后会 ...
- 【CSS】简略说明css的权重之分
/*权重 :id > class > 标签 (小环境) 权重:内联 > 内部 > 外部 (大环境) 小环境处于内部环境中 */ <style> #p1{ /* id ...
- JZOJ 5344. 摘果子
Description Input Output Sample Input 7 9 39 6 13 2 22 6 7 4 -19 5 28 6 -17 1 2 1 3 2 4 1 5 4 6 2 7 ...
- 关于request.getServletContext()方法报错的问题
可以通过修改pom文件来添加一个javax.servlet-api-3.1.0.jar的jar包,找到你的pom.xml文件添加代码如下: <dependency> <groupId ...
- Python知识点进阶——迭代器
可迭代对象 可迭代对象可以简单的理解为用for循环遍历的,如list.tuple.dict.set.str 判断一个对象是否是迭代器: 可以将数据类型 和 是否为可迭代对象 比较来判断是否是可以迭代 ...