热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Unity3D游戏引擎之游戏场景的切换与持久化简单数据的储存(十四)

Unity3D游戏引擎之游戏场景的切换与持久化简单数据的储存雨松MOMO原创文章如转载,请注明:转载至我的独立域名博客雨松MOMO程序研究院,原文地址:http:www

Unity3D 游戏引擎之游戏场景的切换与持久化简单数据的储存




雨松MOMO原创文章如转载,请注明:转载至我的独立域名博客雨松MOMO程序研究院,原文地址:http://www.xuanyusong.com/archives/542



  持久化简单的数据储存在Unity3D 中提供了一个简单有效的方法,如果之前的你做过Android的开发你会发现在Unity3D中持久化数据的储存和Android非常的想象。那么下面MOMO 将用一个简单有效的例子向大家介绍Unity3D中持久化数据。

首先我们须要熟悉一下Unity3D中的PlayerPrefs这个类。这个类中一共帮助我们封装了9个方法,用来数据的储存与读取。


举一个例子

PlayerPrefs.SetString("key", "value");
string str = PlayerPrefs.GetString("key", "defaule"));



我们发现它是以键值对的形式进行储存与读取,每一个Key对应一个Value,储存过后通过Key可以得到之前储存的Value。这里说一下GetString()方法中的第二个参数, 它代表默认值。意思是如果通过第一个参数的Key没有找到对应的Value的话GetString()方法就会返回我们写的第二个参数的默认值。怎么样?很简单吧~ 感觉和Android完全一样哈。


Unity3D默认的字体的 size 只有 16 ,这就意味了放在iPhone4 (960 X 640)上 字体会显示的非常小。字体的来源有很多,大家可以在互联网上下载,或者从自己的电脑中拷贝,在Mac电脑下字体放在 Finder -> 资源库 -> Fonts









我们可以看见电脑中存在了很多字体,我这里随便选一个,将 华文仿宋.ttf 用鼠标拖动到Project中。


选中: 华文仿宋

FontSize 30 :毫无疑问是字体的大小,这里写30让字体几乎放大1倍。

Character:  设置字体的文字编码 Unicode  ASCLL 编码

Style:设置字体的风格,粗体 斜体










点击Cretae ->GUISkin 创建一个GUI的皮肤,将 华文仿宋 拖动到箭头所指向的方向。发现下面存在很多GUI皮肤相关控件设置的,可以在这里设置每一个高级控件~大家可以手动的修改一下看看效果哈。










游戏场景在游戏制作中是一个非常重要的部分,因为任何一款游戏都是由若干的场景组成,Unity3D的游戏场景做的非常贴心。


创建2个游戏场景,一个是scene0 一个是scene1 ,本章的目标是在第一个游戏场景中保存一些基本游戏数据,然后切换到第二个场景中显示第一个场景中保存的数据,实现场景的切换已经数据的储存。


在scene0中创建一个c# 脚本名称为Scene0Main.cs 将它绑定在摄像头中。


Scene0Main.cs

using UnityEngine;
using System.Collections;

public class Scene0Main : MonoBehaviour {

	//储存数据的显示
	public string testStr;
	public string testInt;
	public string testFloat;
	
	//GUI皮肤 为上面我们添加的皮肤
	//在外面用鼠标拖动上为它赋值
	public GUISkin fontSkin;
	//显示的图片
	public Texture Imagetexture;
	 
	// Use this for initialization
	void Start () {
		//读取key的值
		testStr = PlayerPrefs.GetString("testStr", "default");
		testInt = PlayerPrefs.GetInt("testInt", 0).ToString();
		testFloat = PlayerPrefs.GetFloat("testFloat", 0).ToString();
		
	}
	
	// Update is called once per frame
	void Update () {
	
	}
	
	
	void OnGUI() {
		
		//将GUI的皮肤设置为我们创建的皮肤
		GUI.skin = fontSkin;
		
		//贴上图片
		GUI.DrawTexture(new Rect((Screen.width - Imagetexture.width) >>1, 10, 120, 120), Imagetexture);
		
		//添加输入框让用户输入信息,这里面我没有捕获异常,因为用户有可能输入一个不合法的数值
		testStr = GUI.TextField (new Rect(10, 200, 200, 50), testStr, 50);
		testInt = GUI.TextField (new Rect(10, 250, 200, 50), testInt, 50);
		testFloat = GUI.TextField (new Rect(10, 300, 200, 50), testFloat, 50);
		
		//点击按钮保存所有数据
		if (GUI.Button(new Rect(220, 200, 150, 100), "commit all"))
		{
			
			PlayerPrefs.SetString("testStr", testStr);
			PlayerPrefs.SetInt("testInt", int.Parse(testInt));
			PlayerPrefs.SetFloat("testFloat", float.Parse(testFloat));
			//切换场景到scene1
			Application.LoadLevel("scene1");
		}
	}
	
	
}


Scene1Main.cs


using UnityEngine;
using System.Collections;

public class scene1Main : MonoBehaviour {

	public string testStr;
	public string testInt;
	public string testFloat;
	
	public GUISkin fontSkin;
	public Texture Imagetexture;
	 
	// Use this for initialization
	void Start () {
		testStr = PlayerPrefs.GetString("testStr", "default");
		testInt = PlayerPrefs.GetInt("testInt", 0).ToString();
		testFloat = PlayerPrefs.GetFloat("testFloat", 0).ToString();
		
	}
	
	
	void OnGUI() {
		GUI.skin = fontSkin;
		
		GUI.DrawTexture(new Rect((Screen.width - Imagetexture.width) >>1, 10, 120, 120), Imagetexture);
		
		//显示label
		GUI.Label(new Rect(10,150,300,50),"testStr = "+ testStr);
		GUI.Label(new Rect(10,200,300,50),"testInt = "+ testInt);
		GUI.Label(new Rect(10,250,300,50),"testFloat = "+ testFloat);
		
		if (GUI.Button(new Rect(220, 200, 150, 100), "clean all"))
		{
			//删除所有键值
			PlayerPrefs.DeleteAll();
			// 返回场景0
			Application.LoadLevel("scene0");
		}
		
		if (GUI.Button(new Rect(220, 320, 150, 100), "only return"))
		{
			// 返回场景0
			Application.LoadLevel("scene0");
		}
	}
}



File -> Build Settings 点击Add Current添加场景,这一步很重要,如果不添加的话在代码中切换场景会抛异常,盆友们还得注意一下~








build and run 导出运行项目,如下图所示我分别输入string int float 三种类型的数据,然后点击commit all ,将所有数据全部保存下来,游戏场景切换到scene1场景中。







切换到scene1中可以正常的显示scene0中储存的数值,点击clean all 将清空储存的所有信息后返回场景scene0,点击only return 直接返回场景scene0。







另外两个重要的方法

//删除 PlayerPrefs 中某一个key的值
PlayerPrefs. DeleteKey (“key”);

//判断 PlayerPrefs中是否存在这个key
bool b = PlayerPrefs.HasKey(“key”);





最后欢迎各位盆友可以和MOMO一起讨论Unity3D游戏开发,总的来说这一章还是比较简单的,哇咔咔~~~ 附上Unity3D工程的下载地址,Xcode项目我就不上传了,须要的自己导出。


下载地址:http://www.xuanyusong.com/archives/542




推荐阅读
  • 在Kubernetes上部署JupyterHub的步骤和实验依赖
    本文介绍了在Kubernetes上部署JupyterHub的步骤和实验所需的依赖,包括安装Docker和K8s,使用kubeadm进行安装,以及更新下载的镜像等。 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • JavaSE笔试题-接口、抽象类、多态等问题解答
    本文解答了JavaSE笔试题中关于接口、抽象类、多态等问题。包括Math类的取整数方法、接口是否可继承、抽象类是否可实现接口、抽象类是否可继承具体类、抽象类中是否可以有静态main方法等问题。同时介绍了面向对象的特征,以及Java中实现多态的机制。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • C# 7.0 新特性:基于Tuple的“多”返回值方法
    本文介绍了C# 7.0中基于Tuple的“多”返回值方法的使用。通过对C# 6.0及更早版本的做法进行回顾,提出了问题:如何使一个方法可返回多个返回值。然后详细介绍了C# 7.0中使用Tuple的写法,并给出了示例代码。最后,总结了该新特性的优点。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
author-avatar
知足幸福_21942
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有