zoukankan      html  css  js  c++  java
  • Unity3D笔记十九 持久化数据

    1PlayerPrefs(生命周期???)

    1.1 保存与读取数据

      在C#中类似缓存、CookieSession等保存数据的,但是有点区别的是在C#中如果在取值时没有取到默认值则返回值是NULL,但Unity中如GetInt("Test", 100); 在取值Test时如果没有默认值则直接返回的是100

      在Unity中提供了一个用于本地持久化保存与读取数据的类——PlayerPrefs 是轻量级的存储。它的工作原理是以哈希、字典的方式:键值对的形式将数据保存在文件中。

    PlayerPrefs类可保存与读取3种基本的数据类型:浮点型、整型和字符串型。

      SetFloat():保存浮点类型。

      SetInt():保存整型。

      SetString():保存字符串。

      GetFloat():获取浮点类型。

      GetInt():获取整型。

      GetString():获取字符串。

    Eg

    //保存整型

    PlayerPrefs.SetInt("Test", 100); 

    //获取整型

    PlayerPrefs.GetInt("Test", 100); 

     

    1.2 删除数据

    删除数据方法:

      a、根据键删除值:DeleteKey(),删除之前先判断是否存在HasKey()

     

      b、删除所有数据:DeleteAll()

     

    1.3 注册界面

    _8_1.cs

    using UnityEngine;
    using System.Collections;
    
    /// <summary>
    /// 注册
    /// </summary>
    public class _8_1 : MonoBehaviour
    {
    
        /// <summary>
        /// 用户姓名
        /// </summary>
        private string userName = string.Empty;
        /// <summary>
        /// 用户号码
        /// </summary>
        private string userPhone = string.Empty;
        /// <summary>
        /// 用户年龄
        /// </summary>
        private string userAge = string.Empty;
        /// <summary>
        /// 用户身高
        /// </summary>
        private string userHight = string.Empty;
        /// <summary>
        /// 是否将信息显示
        /// </summary>
        private bool isShowInfo = false;
    
    
        void OnGUI()
        {
            GUILayout.BeginHorizontal("box", GUILayout.Width(200));
            GUILayout.Label("请输入姓名");
            userName = GUILayout.TextField(userName, 10);
            GUILayout.EndHorizontal();// [hɒrɪ'zɒnt(ə)l]adj. 水平的;地平线的;同一阶层的
    
            GUILayout.BeginHorizontal("box");
            GUILayout.Label("请输入号码");
            userPhone = GUILayout.TextField(userPhone, 11);
            GUILayout.EndHorizontal();
    
            GUILayout.BeginHorizontal("box");
            GUILayout.Label("请输入年龄");
            userAge = GUILayout.TextField(userAge, 3);
            GUILayout.EndHorizontal();
    
            GUILayout.BeginHorizontal("box");
            GUILayout.Label("请输入身高");
            userHight = GUILayout.TextField(userHight, 3);
            GUILayout.EndHorizontal();
    
            if (GUILayout.Button("注册"))
            {
                isShowInfo = true;
                #region  持久化保存数据
                PlayerPrefs.SetString("userName", userName);
                PlayerPrefs.SetString("userPhone", userPhone);
                PlayerPrefs.SetInt("userAge", int.Parse(userAge));
                PlayerPrefs.SetFloat("userHeight", float.Parse(userHight));
                #endregion
            }
            if (GUILayout.Button("取消"))
            {
                isShowInfo = false;
                PlayerPrefs.DeleteAll();//删除所有持久化对应值
            }
            if (isShowInfo)
            {
                GUILayout.Label("输入的姓名为:" + PlayerPrefs.GetString("userName", "姓名默认值"));
                GUILayout.Label("输入的号码为:" + PlayerPrefs.GetString("userPhone", "号码默认值"));
                GUILayout.Label("输入的年龄为:" + PlayerPrefs.GetInt("userAge", 0).ToString());
                GUILayout.Label("输入的身高为:" + PlayerPrefs.GetFloat("userHeight", 0.0f).ToString());
            }
        }
    
        // Use this for initialization
        void Start()
        {
    
        }
    
        // Update is called once per frame
        void Update()
        {
    
        }
    }

     

    自定义文件

    2.1 文件的创建与写入 

    文件的创建与写入都需要使用流来操作。

    _8_2.cs

    using UnityEngine;
    using System.Collections;
    using System.IO;
    /// <summary>
    /// 文件的创建与写入 
    /// </summary>
    public class _8_2 : MonoBehaviour
    {
    
        // Use this for initialization
        void Start()
        {
            //创建文件,共写入3次数据
            CreateFile(Application.dataPath, "FileName", "TestInfo0");
            CreateFile(Application.dataPath, "FileName", "TestInfo1");
            CreateFile(Application.dataPath, "FileName", "TestInfo2"); 
        }
        /// <summary>
        /// 文件流
        /// </summary>
        /// <param name="path">文件创建目录</param>
        /// <param name="name">文件的名称</param>
        /// <param name="infos">写入的内容</param>
        void CreateFile(string path, string name, string infos)
        {
            StreamWriter sw;//文件流信息
            FileInfo fileInfo = new FileInfo(path + "//" + name);
            if (!fileInfo.Exists)
            {
                sw = fileInfo.CreateText();
            }
            else
            {
                sw = fileInfo.AppendText();//如果此文件存在,则打开该文件
            }
            sw.WriteLine(infos);
            sw.Close();
            sw.Dispose();
        }   
        // Update is called once per frame
        void Update()
        {
    
        }
    }

    应用程序

    应用程序相关的方法都写在Application类中。它可以获取或设置当前程序的一些属性,比如加载游戏关卡,获取资源文件路径,退出当前游戏程序,获取当前游戏平台等。

       OnApplicationFocus():获得焦点时表示当前游戏处于可控制状态。

        OnApplicationPause():程序暂停时表示当前游戏呈不可控制状态。 [pɔːz]n. 暂停;间歇

       OnApplicationQuit():程序退出时表示当前游戏已经退出。

    3.1 创建关卡

    File”→“New Scene”菜单项创建一个新关卡(同一个游戏项目中可以存在任意数量的游戏关卡)

    3.2 切换关卡

    File”→“Build Settings,点击右下角的“Add Current”按钮可为当前游戏关卡授权,右侧数字为关卡的ID,ID0的关卡表示程序运行时第一个进入的场景

    3.3截屏

    截屏操作需调用方法Application.CaptureScreenshot("name.png"),该方法的参数为截屏图片的文件名称,成功截屏后该文件将被默认保存在根目录下。 ['kæptʃə]vt. 俘获;夺得

    n. 捕获;战利品,

    3.4 打开网页

    Application.OpenURL(“www.baidu.com”) 参数为待打开网页的完整网址

     

    3.5 退出游戏

    Application.Quit()方法即可退出当前游戏。需要注意的是,该方法只能在真实设备中执行,而无法在模拟器中执行。

     

    4、资源数据库

    AssetDatabase

    4.7 实例——鼠标拣选

     

    using UnityEngine;
    using System.Collections;
    /// <summary>
    /// 以摄像机的位置为原点,以鼠标在屏幕中选择的当前点为目标点,发射一条射线,获取这条射线终点的三维坐标系即可
    /// 鼠标拣选原理的应用非常广泛,比如当玩家在地图中选择一个点时,人物会朝该点移动
    /// </summary>
    public class _8_4 : MonoBehaviour
    {
    
        // Use this for initialization
        void Start()
        {
    
        }
    
        // Update is called once per frame
        void Update()
        {
            if (Input.GetMouseButtonDown(0))
            {
                ////创建一条从摄像机到鼠标选择的当前点的射线
                Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
                RaycastHit hit;
                if (Physics.Raycast(ray, out hit))
                {
                    //确定选择的点为地形后,创建立方体对象
                    GameObject objCube = GameObject.CreatePrimitive(PrimitiveType.Cube);
                    objCube.transform.position = hit.point; 
                }
            }
        }
    }

     

     

    _8_4.cs


    作者:PEPE
    出处:http://pepe.cnblogs.com/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    整数数组中最大子数组的和的问题(续)
    整数数组中最大子数组的和的问题
    PHP开发环境(Apache+mysql+PHPstorm+php)的搭建
    echart 库 初始
    2.15 学习总结 之 天气预报APP volley(HTTP库)之StringRequest
    2.14 学习总结 之 序列化
    2.13 阶段实战 使用layui重构选课系统
    2.12 学习总结 之 表单校验插件validate
    jsp连接数据库的乱码问题 servlet请求参数编码处理get post
    Rocket
  • 原文地址:https://www.cnblogs.com/PEPE/p/3549186.html
Copyright © 2011-2022 走看看