unity3d如何获取本地存储

2019-08-08 21:30:00 piai9568 阅读数 2281
  • Unity 值得看的500+ 技术内容列表

    Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

下面介绍几种 Unity本地记录存储的实现方式。

第一种 Unity自身提供的 PlayerPrefs

//保存数据

PlayerPrefs.SetString("Name",mName);
PlayerPrefs.SetInt("Age",mAge);
PlayerPrefs.SetFloat("Grade",mGrade)

//读取数据

mName=PlayerPrefs.GetString("Name","DefaultValue");
mAge=PlayerPrefs.GetInt("Age",0);
mGrade=PlayerPrefs.GetFloat("Grade",0F);

//清除所有记录

 PlayerPrefs.DeleteAll();

//删除其中某一条记录

PlayerPrefs.DeleteKey("Age");

//将记录写入磁盘

PlayerPrefs.Save()

第二种 BinaryFormatter 二进制序列化

假设有一个Player类

[System. Serializable]
public class Player
{
      public int health;
      public int  power;
      public Vector3 position;
}

由于BinaryFormatter序列化不支持Unity的Vector3类型,所以我们需要做一下包装。

public class PlayerData{
	
	public int level;
	public int health;
	public float[] position;

	public PlayerData(Player player)
	{
		this.level = player.level;
		this.health = player.health;
		this.position = new float[3];
		this.position[0] = player.transform.position.x;
		this.position[1] = player.transform.position.y;
		this.position[2] = player.transform.position.z;
	}
}

我们对PlayerData进行保存和读取。读取出来的PlayerData可以赋给Player。

public static class SaveSystem{
       //保存数据
	public static void SavePlayer(Player player)
	{
		BinaryFormatter formatter = new BinaryFormatter();
		string path = Application.persistentDataPath+"/player.fun";
		FileStream stream = new FileStream(path,FileMode.Create);
		PlayerData data = new PlayerData(player);
		formatter.Serialize(stream,data);
		stream.Close();
	}

     //读取数据
	public static PlayerData LoadPlayer()
	{
		string path = Application.persistentDataPath+"/player.fun";
		if(File.Exists(path))
		{
			BinaryFormatter formatter = new BinaryFormatter();
			FileStream stream = new FileStream(path,FileMode.Open);
			PlayerData data = formatter.Deserialize(stream) as PlayerData;
			stream.Close();
			return data;
		}else{
			Debug.LogError("Save file not found in  "+path);
			return null;
		}
	}
}

第三种 保存为json格式的文本文件

使用 Unity 自身API JsonUtility

保存数据

	public static void SavePlayerJson(Player player)
	{
		string path = Application.persistentDataPath+"/player.json";
		var content = JsonUtility.ToJson(player,true);
		File.WriteAllText(path,content);
	}

读取数据

	public static PlayerData LoadPlayerJson()
	{
		string path = Application.persistentDataPath+"/player.json";
		if(File.Exists(path)){
			var content = File.ReadAllText(path);
			var playerData = JsonUtility.FromJson<PlayerData>(content);
			return playerData;
		}else{
			Debug.LogError("Save file not found in  "+path);
			return null;
		}
	}

第四种 XmlSerializer进行串行化

假如有类

public class Entity
{
    public Entity()
    {
    }
    public Entity(string c, string f)
    {
      name = c;
      school = f;
    }
    public string name;
    public string school;
}

读取数据

List<Entity> entityList=null;
XmlSerializer xs = new XmlSerializer(typeof(List<Entity>));
using (StreamReader sr = new StreamReader(configPath))
{
   entityList = xs.Deserialize(sr) as List<Entity>;
}

保存数据

List<Entity> entityList=null;
XmlSerializer xs = new XmlSerializer(typeof(List<Entity>));
using (StreamWriter sw = File.CreateText(configPath))
{
  xs.Serialize(sw, entityList);
}

对应的xml文件为:

<?xml version="1.0" encoding="utf-8"?>
<ArrayOfEntity xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 <Entity>
  <Name>Alice</Name>
  <School>SJTU</School>
 </Entity>
 <Entity>
  <Name>Cici</Name>
  <School>CSU</School>
 </Entity>
 <Entity>
  <Name>Zero</Name>
  <School>HIT</School>
 </Entity>
</ArrayOfEntity>

在这里插入图片描述

2015-10-24 17:32:47 dingkun520wy 阅读数 14938
  • Unity 值得看的500+ 技术内容列表

    Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

原文地址:http://blog.csdn.net/dingkun520wy/article/details/49386507

(一)简单数据存储PlayerPrefs

这种存储方法比较简单直接上代码

//简单数据存储
    public void SimpleLocalStorage()
    {
        //存储信息
        PlayerPrefs.SetString("TestString", "存储");
        PlayerPrefs.SetInt("TestInt", 8);
        PlayerPrefs.SetFloat("TestFloat", 8.8F);
        //获取信息
        PlayerPrefs.GetString("TestString");
        PlayerPrefs.GetInt("TestInt");
        PlayerPrefs.GetFloat("TestFloat");

        //判断是否有信息
        if (PlayerPrefs.HasKey("TestString"))
        {
            //删除信息
            PlayerPrefs.DeleteKey("TestString");
            PlayerPrefs.DeleteKey("TestInt");
            PlayerPrefs.DeleteKey("TestFloat");
        }
        //删除所有
        PlayerPrefs.DeleteAll();
    }

(二)Xml数据存储

首先是定义数据对象和Xml格式字符串相互转换的函数

/// 数据对象转换xml字符串
    public string SerializeObject(object pObject, System.Type ty)
    {
        string XmlizedString = null;
        MemoryStream memoryStream = new MemoryStream();
        XmlSerializer xs = new XmlSerializer(ty);
        XmlTextWriter xmlTextWriter = new XmlTextWriter(memoryStream, Encoding.UTF8);
        xs.Serialize(xmlTextWriter, pObject);
        memoryStream = (MemoryStream)xmlTextWriter.BaseStream;
        XmlizedString = UTF8ByteArrayToString(memoryStream.ToArray());
        return XmlizedString;
    }

    /// xml字符串转换数据对象
    public object DeserializeObject(string pXmlizedString, System.Type ty)
    {
        XmlSerializer xs = new XmlSerializer(ty);
        MemoryStream memoryStream = new MemoryStream(StringToUTF8ByteArray(pXmlizedString));
        XmlTextWriter xmlTextWriter = new XmlTextWriter(memoryStream, Encoding.UTF8);
        return xs.Deserialize(memoryStream);
    }
//UTF8字节数组转字符串
    public string UTF8ByteArrayToString(byte[] characters)
    {
        UTF8Encoding encoding = new UTF8Encoding();
        string constructedString = encoding.GetString(characters);
        return (constructedString);
    }

    //字符串转UTF8字节数组
    public byte[] StringToUTF8ByteArray(String pXmlString)
    {
        UTF8Encoding encoding = new UTF8Encoding();
        byte[] byteArray = encoding.GetBytes(pXmlString);
        return byteArray;
    }

然后定义读取和存储文本文件的函数,这里用到了Base64的加密方法

/// 创建文本文件
    public void CreateTextFile(string fileName, string strFileData, bool isEncryption)
    {
        StreamWriter writer;                               //写文件流
        string strWriteFileData;
        if (isEncryption)
        {
            strWriteFileData = Encrypt(strFileData);  //是否加密处理
        }
        else
        {
            strWriteFileData = strFileData;             //写入的文件数据
        }
        
        writer = File.CreateText(fileName);
        writer.Write(strWriteFileData);
        writer.Close();                                    //关闭文件流
    }


    /// 读取文本文件
    public string LoadTextFile(string fileName, bool isEncryption)
    {
        StreamReader sReader;                              //读文件流
        string dataString;                                 //读出的数据字符串

        sReader = File.OpenText(fileName);
        dataString = sReader.ReadToEnd();
        sReader.Close();                                   //关闭读文件流

        if (isEncryption)
        {
            return Decrypt(dataString);                      //是否解密处理
        }
        else
        {
            return dataString;
        }
     
    }
/// 加密方法
    /// 描述: 加密和解密采用相同的key,具体值自己填,但是必须为32位
    public string Encrypt(string toE)
    {
        byte[] keyArray = UTF8Encoding.UTF8.GetBytes("12348578902223367877723456789012");
        RijndaelManaged rDel = new RijndaelManaged();
        rDel.Key = keyArray;
        rDel.Mode = CipherMode.ECB;
        rDel.Padding = PaddingMode.PKCS7;
        ICryptoTransform cTransform = rDel.CreateEncryptor();
        byte[] toEncryptArray = UTF8Encoding.UTF8.GetBytes(toE);
        byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);

        return Convert.ToBase64String(resultArray, 0, resultArray.Length);
    }

    /// 解密方法
    /// 描述: 加密和解密采用相同的key,具体值自己填,但是必须为32位
    public string Decrypt(string toD)
    {
        byte[] keyArray = UTF8Encoding.UTF8.GetBytes("12348578902223367877723456789012");
        RijndaelManaged rDel = new RijndaelManaged();
        rDel.Key = keyArray;
        rDel.Mode = CipherMode.ECB;
        rDel.Padding = PaddingMode.PKCS7;
        ICryptoTransform cTransform = rDel.CreateDecryptor();
        byte[] toEncryptArray = Convert.FromBase64String(toD);
        byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);

        return UTF8Encoding.UTF8.GetString(resultArray);
    }

定义数据对象

public class UserData
{
    public string userName;         //用户名
    public int onlyId;				//用户唯一id

    public UserData()
    {

    }
}



函数的用法


//xml数据存储和读取
    public void XmlLocalStorage()
    {
        string _fileName = Application.persistentDataPath + "/UnityUserData";

        UserData user = new UserData();
        user.userName = "乐逍遥";
        user.onlyId = 1;
        //存储数据
        string s = SerializeObject(user, typeof(UserData));
        //创建XML文件且写入数据
        CreateTextFile(_fileName, s,false);

        //读取数据
        try
        {
            string strTemp = LoadTextFile(_fileName,false);
            //反序列化对象
            UserData userD = DeserializeObject(strTemp, typeof(UserData)) as UserData;

        }
        catch
        {
            Debug.Log("系统读取XML出现错误,请检查");
        }
    }



2017-04-15 19:45:48 hehewyp1 阅读数 436
  • Unity 值得看的500+ 技术内容列表

    Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

  最近给自己的小游戏弄好背包系统后,开始琢磨怎么保存到本地,我有三种选择方案:1.用excel格式保存 2.用sqlite保存 3.用json格式保存 excel优势是方便编辑,但对它不熟悉,sqlite在unity上坑比较多,所以最后选择用json保存。

  在unity5.3出来前,一直使用的是LitJson来解析。后来官方出了自己的JsonUtility,这两个都很简单、方便,但由于自己很懒,不想学新东西,所以还是使用的LitJson。

  我是参考这篇文章来做的:http://www.cnblogs.com/peiandsky/archive/2012/04/20/2459219.html

  1.将list转换成json格式

ArrayList list = new ArrayList ();
foreach (GameObject obj in objs) {
	Wuping wp = new Wuping ();
	wp.wp_name = obj.GetComponent<WupingDesc> ().wp_name;
	wp.wp_desc = obj.GetComponent<WupingDesc> ().wp_desc;
	wp.wp_num = obj.GetComponent<WupingDesc> ().wp_num;
	list.Add (wp);
}
string json = JsonMapper.ToJson (list);
string fileName = Application.persistentDataPath + "//" + "test.text";
JsonTool.CreateFile(fileName,json);

  里面Wuping类不是MonoBehaviour的子类,而WupingDesc类是MonoBehaviour的子类,所以要转换一下 即JsonMapper.ToJson(这里不能放MonoBehaviour子类的实例)

  2.将json字符串读出来

JsonData data = JsonMapper.ToObject (jsonStr);
string wp_name = (string)data [i] ["wp_name"];

  3.补充:文件读取类(这个参考的这篇文章http://www.xuanyusong.com/archives/1069)

using System.Collections;
using System.Collections.Generic;
using System;
using System.IO;

public class JsonTool {// C#方法名要大写 和java不一样
	public static void CreateFile(string fileName,string content) {
		StreamWriter sw;
		FileInfo t = new FileInfo (fileName);
//		if (!t.Exists) {// 如果文件不存在就创建
//			sw = t.CreateText ();
//		} else {
//			sw = t.AppendText ();
//		}
		sw = t.CreateText ();
		sw.WriteLine (content);
		sw.Close ();
		sw.Dispose ();
	}

	public static string LoadFile(string fileName) {
		StreamReader sr = null;
		try {
			sr = File.OpenText(fileName);
		} catch(Exception e) {
			return null;
		}
		string line;
		string json = "";
		while( (line = sr.ReadLine()) != null ) {
			json += line;
		}
		sr.Close ();
		sr.Dispose ();
		return json;
	}
}


  因为我之前都是做OC的,所以代码格式都是按照OC来写的,所以看上去有些怪。而且今天我才知道原来C#方法名首字母要大写。。。


2017-08-10 09:54:46 cglzy1982 阅读数 5929
  • Unity 值得看的500+ 技术内容列表

    Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

unity本地数据存储读取

unity做游戏,有很多配置数据需要在本地读取,鄙人介绍一下自己的微薄见解:
一般的方法有:
1 xml读取存储
2 二进制文件
3 直接将数据存到预制体上

以上三个用法,都是需要将数据源文件打包为AB包,然后读取使用,这里只是讲解一下预制体数据存储的做法。

在过去,我们项目一直用的是xml存储读取,自己写了个工具将策划写好的excel表导成xml然后打ab使用。
在这个基础上,改进方案,制作prefab存数据
数据变更进程:
excel–>xml–>prefab–>ab–>游戏运行读取使用
如果没有xml的话,可以直接跳过,从excel导出生成prefab
因为已经有工具能直接得到xml,我就讲下我是怎么把xml存到prefab的。

思路:读取本地化xml文件A,实例化对象a存储。动态生成一个prefab,上面挂一个脚本B,里面要有xml数据对象b,然后将读取的文件数据对象a赋值给b,最后将prefab保存到本地即可。

第一步 创建prefab挂载的类XmlCompleteClass
[System.Serializable]//一定要有,需要将数据存储在prefab上并显示可见

[System.Serializable]//一定要有,需要将数据存储在prefab上
public class XmlCompleteClass : MonoBehaviour
{  
    //QuestData 是一个用来存xml数据的类,值得注意的是,QuestData 类名上面也要有[System.Serializable]属性,这样才能在prefab中存上数据
    public QuestData _QuestData ;
    public XmlCompleteClass()
    {
    }
}

第二步 xml数据读取,及将数据放到prefab上的方法:

    // 创建一个泛型类,传递需要读取的xml的读取路径,路径如"Assets/MyAssets/Xmls/other/xxx.xml"
    //proprename表示XmlCompleteClass 类中的属性"_QuestData",将用反射的方法来给XmlCompleteClass 赋值
    //XmlCompleteClass  xx就是我们需要存数据的prefab上挂的脚本对象
    static T loadXmlData<T>(string pa, string proprename,XmlCompleteClass xx = null)
    {
        num++;
        string path = pa;        
        T ss = LoadXml<T>(path);   
        //采用反射方法,从XmlCompleteClass 对象中获取属性,对其赋值
        Type t = xx.GetType(); //获取类型
        object obj = Activator.CreateInstance(t);

        FieldInfo fi = t.GetField(proprename);

        if (fi == null)
        {
            Debug.LogError("注意:找不到这个属性:" + proprename);
            return ss;
        }
        //将xml中读取的数据,赋值给我们在XmlCompleteClass 对象中找到的属性
        fi.SetValue((object)xx, ss);     
        return ss;  
    }
//xml数据读取类
 public static T LoadXml<T>(string path)
    {
        FileStream stream = null;
        try
        {
            if (path.Contains("://"))
            {
                WWW www = new WWW(path);
                while (!www.isDone) { }//等待加载完成
                return LoadXml<T>(www.bytes);
            }
            if (!File.Exists(path))
            {
                Helper.LogWarning("File does not exist : " + path);
                return default(T);
            }
            stream = new FileStream(path, FileMode.Open, FileAccess.Read);
            if (stream == null)
            {
                Helper.LogWarning("stream error.");
                return default(T);
            }           
            XmlSerializer xs = new XmlSerializer(typeof(T));
            T data = (T)xs.Deserialize(stream);
            stream.Close();
            return data;
        }
        catch (FormatException e)
        {
            if (stream != null)
                stream.Close();
            Helper.LogWarning("load " + path + " error.");
            Helper.LogWarning(e.GetType());
            Helper.LogWarning(e.Message);
            return default(T);
        }
    }

最后一步就是调用

   [MenuItem("Tools/生成xml的预制体")]
    public static void SaveXmlPrefab()
    {
        num = 0;
        //创建一个gameobject
        GameObject obj = new GameObject();
        //挂XmlCompleteClass脚本
        XmlCompleteClass xml = obj.AddComponent<XmlCompleteClass>();

        #region 此处加载xml的读取和生成数据
        loadXmlData<MountsData>("q_QuestData", "_QuestData ", xml);

        #endregion
        string paths = BuildAssets.AssetsPath + "Xmlprefab/xmlprefab" + ".prefab";
        //参数1 创建路径,参数2 需要创建的对象, 如果路径下已经存在该名字的prefab,则覆盖
        PrefabUtility.CreatePrefab(paths, obj);      
        EditorBox window = EditorWindow.GetWindow<EditorBox>();
        window.Init(EditorBox.EditorBoxType.OK, string.Format("------------[ 本次生成xml资源 {0} 个 ]------------ ", num));

    }

这样就讲xml数据导出到prefab了,然后prefab打包成ab,已经加载ab包的时候,只需要

XmlCompleteClass xml = obj.transform.GetComponent();将加载的资源转化为gameobject获取到XmlCompleteClass ,就能从中读取到_QuestData数据了

另外贴一下用到的引用类(有些是多余的):
using UnityEngine;
using System.Collections;
using System;
using System.IO;
using UnityEditor;
using Object = UnityEngine.Object;
using System.Collections.Generic;
using System.Xml.Serialization;
using System.Text;
using System.Threading;
using System.Reflection;

2017-11-26 19:20:07 ax1274669874 阅读数 1408
  • Unity 值得看的500+ 技术内容列表

    Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

Unity3D游戏本地存储


Unity3D游戏本地存储玩家积分。Unity提供了一个类似配置文件的类,可以非常好的实现信息数据的存储,那就是PlayerPrefs。它可以存储:int、float和string类型。

// 存进去

PlayerPrefs.SetInt("key1", 10);

PlayerPrefs.SetString("key2", aaaaaa);

PlayerPrefs.SetFloat("key3", 10.009);

// 取出来

int i = PlayerPrefs.GetInt("key1");


unity3d保存文件到本地and加载本地文件
001.using UnityEngine;
002.using System.Collections;
003.using System.IO;
004.using System.Collections.Generic;
005.using System;
006.  
007.public class Text : MonoBehaviour {
008.    //文本中每行的内容
009.    ArrayList infoall;
010.    //皮肤资源,这里用于显示中文
011.    public GUISkin skin;
012.    void Start ()
013.    {
014.        print("当前文件路径:"+Application.persistentDataPath);
015.        //删除文件
016.        DeleteFile(Application.persistentDataPath,"FileName.txt");
017.  
018.        //创建文件,共写入3次数据
019.        CreateFile(Application.persistentDataPath,"FileName.txt","dingxiaowei");
020.        CreateFile(Application.persistentDataPath,"FileName.txt","丁小未");
021.        //CreateFile(Application.persistentDataPath ,"Filename.assetbundle","丁小未");
022.        //下载模型
023.        StartCoroutine(loadasset("http://192.168.1.180/3DShowResource/Products/AssetBundles/HX_DY02.assetbundle"));
024.        //得到文本中每一行的内容
025.        infoall = LoadFile(Application.persistentDataPath,"FileName.txt");
026. 
027.         
028.    }
029.    //写入模型到本地
030.    IEnumerator loadasset(string url)
031.    {
032.        WWW w = new WWW(url);
033.        yield return w;
034.        if (w.isDone)
035.        {
036.            byte[] model = w.bytes;
037.            int length = model.Length;
038.            //写入模型到本地
039.            CreateModelFile(Application.persistentDataPath, "Model.assetbundle", model,length);
040.        }
041.    }
042. 
043.    void CreateModelFile(string path, string name, byte[] info, int length)
044.    {
045.        //文件流信息
046.        //StreamWriter sw;
047.        Stream sw;
048.        FileInfo t = new FileInfo(path + "//" + name);
049.        if (!t.Exists)
050.        {
051.            //如果此文件不存在则创建
052.            sw = t.Create();
053.        }
054.        else
055.        {
056.            //如果此文件存在则打开
057.            //sw = t.Append();
058.            return;
059.        }
060.        //以行的形式写入信息
061.        //sw.WriteLine(info);
062.        sw.Write(info, 0, length);
063.        //关闭流
064.        sw.Close();
065.        //销毁流
066.        sw.Dispose();
067.    }
068.  
069.   /**
070.   * path:文件创建目录
071.   * name:文件的名称
072.   *  info:写入的内容
073.   */
074.   void CreateFile(string path,string name,string info)
075.   {
076.      //文件流信息
077.      StreamWriter sw;
078.      FileInfo t = new FileInfo(path+"//"+ name);
079.      if(!t.Exists)
080.      {
081.        //如果此文件不存在则创建
082.        sw = t.CreateText();
083.      }
084.      else
085.      {
086.        //如果此文件存在则打开
087.        sw = t.AppendText();
088.      }
089.      //以行的形式写入信息
090.      sw.WriteLine(info);
091.      //关闭流
092.      sw.Close();
093.      //销毁流
094.      sw.Dispose();
095.   }
096. 
097.    
098.  
099.  /**
100.   * 读取文本文件
101.   * path:读取文件的路径
102.   * name:读取文件的名称
103.   */
104.   ArrayList LoadFile(string path,string name)
105.   {
106.        //使用流的形式读取
107.        StreamReader sr =null;
108.        try{
109.            sr = File.OpenText(path+"//"+ name);
110.        }catch(Exception e)
111.        {
112.            //路径与名称未找到文件则直接返回空
113.            return null;
114.        }
115.        string line;
116.        ArrayList arrlist = new ArrayList();
117.        while ((line = sr.ReadLine()) != null)
118.        {
119.            //一行一行的读取
120.            //将每一行的内容存入数组链表容器中
121.            arrlist.Add(line);
122.        }
123.        //关闭流
124.        sr.Close();
125.        //销毁流
126.        sr.Dispose();
127.        //将数组链表容器返回
128.        return arrlist;
129.   } 
130. 
131.    //读取模型文件
132.   IEnumerator LoadModelFromLocal(string path, string name)
133.   {
134.       print("file:///" + path + "/" + name);
135.       WWW w = new WWW("file:///"+path + "/" + name);
136.       yield return w;
137.       if (w.isDone)
138.       {
139.           Instantiate(w.assetBundle.mainAsset);
140.       }
141.   }
142. 
143.  
144.  /**
145.   * path:删除文件的路径
146.   * name:删除文件的名称
147.   */
148.  
149.   void DeleteFile(string path,string name)
150.   {
151.        File.Delete(path+"//"+ name);
152.   }
153.  
154.   void OnGUI()
155.   {
156.        //用新的皮肤资源,显示中文
157.        GUI.skin = skin;
158.        //读取文件中的所有内容
159.        foreach(string str in infoall)
160.        {
161.            //绘制在屏幕当中
162.            GUILayout.Label(str);
163.        }
164.        if (GUILayout.Button("加载模型"))
165.        {
166.            StartCoroutine(LoadModelFromLocal(Application.persistentDataPath, "Model.assetbundle"));
167.        }
168.   }
169.  
170.}