http://blog.csdn.net/zy19940906/article/details/47724387

 单例是场景间切换时传递数据的最常见的方式之一,在unity中,很多方法被封装,有时候感觉不知道从何处看起,只能从官方文档上去根据功能找类了。个人感觉u3d可视化太过强烈,许多自定义的一些功能似乎让人无从下手,当然也可能是自己水平不够,不太熟悉。比如说场景间的数据传递,在cocos2dx时,我一般会在director里边创建一个单例Interface,用以游戏中的从数据库读取玩家信息,关卡信息,场景间的数据同步等;要么就是在场景间切换的时候直接用带参数的构造函数实现,在u3d就不用说了,场景一般是直接在界面上创建了,切换场景时也只是简单的一句 Application.LoadLevel(scene);,没法在另一个场景创建时传递数据,因为它的创建场景函数是这样的:

  1. // 摘要:
  2. //     Create a new scene.
  3. [WrapperlessIcall]
  4. public static void NewScene();

因而只好用单例去实现了:

关于单例也很多种实现形式,参考了网上一些别人的方法,自己实践整理出三种较为便捷的方法,比较简单

方法一:纯c#单例,这个单例正常是不需要使用unity的接口和方法,当然,如果要读取文件用它的也是更方便

  1. using UnityEngine;
  2. using System.Collections;
  3. //用以存放数据测试用的结构体
  4. public struct Tollgate_Date
  5. {
  6. public  int index;
  7. public   int playerhealth;
  8. }
  9. public class MyInterface/* : MonoBehaviour*/
  10. {
  11. private  static MyInterface myinterface = null;
  12. public Tollgate_Date[] date = new Tollgate_Date[10];
  13. // Use this for initialization
  14. void Start () {
  15. }
  16. public  static MyInterface getInstance()
  17. {
  18. if(myinterface==null)
  19. {
  20. myinterface=new MyInterface();
  21. myinterface.init();
  22. }
  23. return myinterface;
  24. }
  25. public void init()
  26. {
  27. for (int i = 0; i < date.Length;i++ )
  28. {
  29. date[i].index = 1;
  30. date[i].playerhealth = 1;
  31. }
  32. }
  33. // Update is called once per frame
  34. void Update ()
  35. {
  36. }
  37. }

这个方法,就不能再继承基类MonoBehaviour了,继承之后它默认需要挂在在一个对象身上,所以入过不给对象,那么将赋值不了,myinterface一直为空。这样只需要在第一个场景任意一个object的脚本中初始化下就行了:MyInterface.getInstance();

方法二:手动创建一个对象挂载

  1. </pre><pre name="code" class="csharp">using UnityEngine;
  2. using System.Collections;
  3. public class MyDate : MonoBehaviour {
  4. private static MyDate mydate = null;
  5. public Tollgate_Date[] tollgatedate = new Tollgate_Date[10];
  6. public static GameObject obj;
  7. // Use this for initialization
  8. void Start () {
  9. }
  10. public static MyDate getInstance()
  11. {
  12. if(mydate==null)
  13. {
  14. obj = new GameObject("MyDate");//创建一个带名字的对象
  15. mydate = obj.AddComponent(typeof(MyDate)) as MyDate;
  16. mydate.init();
  17. DontDestroyOnLoad(obj);
  18. }
  19. return mydate;
  20. }
  21. void init()
  22. {
  23. for (int i = 0; i < tollgatedate.Length; i++)
  24. {
  25. tollgatedate[i].index = 1;
  26. tollgatedate[i].playerhealth = 1;
  27. }
  28. }
  29. // Update is called once per frame
  30. void Update () {
  31. }
  32. }

使用方法同方法一,仅仅在脚本中创建一个对象,而这个对象因为DontDestroyOnLoad函数将一直不会被释放,同时再次执行时也因为非空而保证不会再创建

其中

  1. mydate = obj.AddComponent(typeof(MyDate)) as MyDate;
  1. </pre><pre name="code" class="csharp">通过底层可以看到意思是添加一个名称为className的组件到游戏物体,把这个单例对象和GameObject对象关联起来。

方法三:对象方法

  1. using UnityEngine;
  2. using System.Collections;
  3. public class TestInstance : MonoBehaviour
  4. {
  5. private static TestInstance testinsatnce = null;
  6. public Tollgate_Date[] tollgatedate = new Tollgate_Date[10];
  7. // Use this for initialization
  8. void Start ()
  9. {
  10. }
  11. void Awake()
  12. {
  13. if (testinsatnce == null)
  14. {
  15. testinsatnce = this;
  16. testinsatnce.init();
  17. //
  18. DontDestroyOnLoad(gameObject);
  19. }
  20. else
  21. {
  22. Destroy(gameObject);
  23. }
  24. }
  25. public static TestInstance getInstance()
  26. {
  27. return testinsatnce;
  28. }
  29. void init()
  30. {
  31. for (int i = 0; i < tollgatedate.Length; i++)
  32. {
  33. tollgatedate[i].index = 1;
  34. tollgatedate[i].playerhealth = 1;
  35. }
  36. }
  37. // Update is called once per frame
  38. void Update () {
  39. }
  40. }

这个方法与第二个方法最大区别就是它是在场景中建立一个GameObject,把脚本挂载上去,而不是通过手动创建关联实现,在这里该对象在别处使用时,通过getinstance来取得当前的单例对象。

【转】Unity3d的单例及场景间的数据传递的更多相关文章

  1. WinForm登陆:窗体间的数据传递

    1. 登陆逻辑 FrmMain 为主窗体(启动窗体) FrmLogin 为登陆窗体 在“主窗体”中使用ShowDialog()方法显示“登陆窗体”,并通过“登陆窗体”的DialogResult告知“主 ...

  2. C#不同窗体间通信,数据传递

    在一个项目中,很多时候都需要在窗体间进行数据传递和通信,最觉见的是父子窗体之间的数据传递,比如登录ID,各个窗体都需要知道.有很多文章都写了这方面的问题,提出很多优秀的方法,鄙人不才,搜了一些资料之后 ...

  3. iOS:控制器间的数据传递

    在iOS开发中遇到的控制器间的数据传递主要有两种情况:顺传递与逆传递.顺传递是指数据的传递方向和控制器的跳转方向相同(如图1):逆传递是指数据的传递方向和控制器的跳转方向相反(如图2).这里分别介绍这 ...

  4. 封装MySQL的单例,连接数据库并对数据进行增删改查操作

    单例: 一个类只能有一个对象 应用场景:多次请求数据库只需要一个连接对象. 实现:三私一公 1.私有的静态属性用来保存对象的单例2.私有的构造方法用来阻止在类的外部实例化3.私有的__clone阻止在 ...

  5. hive、sqoop、MySQL间的数据传递

    hdfs到MySQL csv/txt文件到hdfs MySQL到hdfs  hive与hdfs的映射: drop table if exists emp;create table emp ( id i ...

  6. React Native移动开发实战-3-实现页面间的数据传递

    React Native使用props来实现页面间数据传递和通信.在React Native中,有两种方式可以存储和传递数据:props(属性)以及state(状态),其中: props通常是在父组件 ...

  7. fragment间的数据传递

    今天我将要讲的是fragment间的数据是如何进行传递的.这里我将举个简单的例子. 首先要有个MainActivity,它托管了MainFragment,而MainFragment又托管了DatePi ...

  8. vue组件间的数据传递

    父组件向子组件传递数据 在 Vue 中,可以使用 props 向子组件传递数据.   App.vue HelloWorld.vue 在子组件部分: 如果需要从父组件获取 logo 的值,就需要使用 p ...

  9. Liferay7 BPM门户开发之40: Form表单的Action到Render的数据传递

    在Form提交后的变量,很多情况是要展现在jsp页面中,这时Action到Render的变量传递就非常有用. 例如,您在数据库中添加了学生的详细信息. 为了实现这一需求,先创建Form表单(学生的细节 ...

随机推荐

  1. Ajax的open方法

    Ajax的open()方法有3个参数:1.method:2.url:3.boolean: 参数1有get和post两个取值 参数2是表单的action属性值 参数3:boolean的取值 当该bool ...

  2. spark 之knn算法

    好长时间忙的没写博客了.看到有人问spark的knn,想着做推荐入门总用的knn算法,顺便写篇博客. 作者:R星月  http://www.cnblogs.com/rxingyue/p/6182526 ...

  3. angular2+ form 表单中 input输入框的disabled属性设置无效

    最近项目中遇到一个表单input设置disabled问题,直接赋值angular原生的[disabled]=“isDisabled”无效,浏览器警告信息: 无奈,只能按照控制台提示修改: 问题解决

  4. 关于java的自增问题

    程序执行结果是0,,,因为count永远是0

  5. Linux命令的常用

    使用chown命令更改文件拥有者 在 shell 中,可以使用chown命令来改变文件所有者.chown命令是change owner(改变拥有者)的缩写.需要要注意的是,用户必须是已经存在系统中的, ...

  6. 【SQL】连接 —— 内连接、外连接、左连接、右连接、交叉连接

    连接 · 内连接 · 外连接 · 左连接 · 右连接 · 全连接 · 交叉连接 · 匹配符号(+)  连接  根据表之间的关系,呈现跨表查询的结果.     外连接     内连接 左连接 右连接 全 ...

  7. 【dp】奶牛家谱 Cow Pedigrees

    令人窒息的奶牛题 题目描述 农民约翰准备购买一群新奶牛. 在这个新的奶牛群中, 每一个母亲奶牛都生两个小奶牛.这些奶牛间的关系可以用二叉树来表示.这些二叉树总共有N个节点(3 <= N < ...

  8. ELFhash - 优秀的字符串哈希算法

    ELFhash - 优秀的字符串哈希算法 2016年10月29日 22:12:37 阅读数:6440更多 个人分类: 算法杂论算法精讲数据结构 所属专栏: 算法与数据结构   版权声明:本文为博主原创 ...

  9. python笔记-list列表的方法

    #!usr/bin/python # -*- coding: utf-8 -*- # 存储5个人的年龄,求他们的平均年龄 age1 = 18 age2 = 15 age3 = 38 age4 = 20 ...

  10. 常见的js算法面试题收集,es6实现

    1.js 统计一个字符串出现频率最高的字母/数字 let str = 'asdfghjklaqwertyuiopiaia'; const strChar = str => { let strin ...