2017-11-26 19:20:07 ax1274669874 阅读数 1145

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.}


2017-04-09 21:10:02 Mogoson 阅读数 3702

MGS-SerialPort

概述

Unity3D与串口通信,同步读取,持续写入,串口参数通过本地文件配置。

版本

  • Unity3D 5.4.1f1。
  • .NET 2.0。

问题

  1. Unity3D目前不能正常在Update,FixedUpdate等事件函数中直接读取串口数据,运行程序卡顿。
  2. Unity3D目前没有实现“SerialPort.ReceivedBytesThreshold”属性设置,抛出没有实现异常。
  3. Unity3D目前不能正常触发“SerialPort.DataReceived”事件,无异常抛出,无响应。
  4. Unity3D目前不能正常读取“SerialPort.BytesToRead”属性,运行程序卡死。
  5. Unity3D目前不能有效执行“SerialPort.DiscardInBuffer”方法,无异常抛出,输入缓冲区没
    能清空。
  6. Unity3D目前不能有效执行“SerialPort.DiscardOutBuffer”方法,无异常抛出,输出缓冲区没
    能清空。
  7. 上位机与下位机收发周期不一致(除特殊情况外可协调一致),每次从缓冲区读取到的数据基本
    不是一个完整的数据帧(单次接收/发送的数据),接收周期小于发送周期时,每次读取到的字
    节数小于1个数据帧长度;接收周期大于发送周期时,每次读取到的字节数大于1个数据帧长度。
  8. 即使上位机与下位机收发周期一致,因收发时刻差异,每次从缓冲区读取到的数据并非都是一个
    完整的数据帧,数据或长或短。

方案

参数配置

  • 串口参数按行写入到本地文本文件,便于调试,维护时修改适配。

持续读写

  • 使用线程按照读取周期持续从串口读取数据。
  • 使用线程按照写入周期持续向串口写入数据。

数据同步

协议

  • 商定收发周期尽量一致,不一致也无妨。
  • 商定收发协议,数据帧长度固定,数据帧的第一个字节作为收发头部标记(ReadHead/WiteHead),
    数据帧的最后一个字节作为收发尾部标记(ReadTail/WiteTail),剩余字节数作为收发数据计
    数(ReadCount/WriteCount)。

读取

  1. 读取整个缓冲区Buffer,并获取读取到的字节数Count;事实上,如果程序运行内存吃紧且收发
    周期基本一致,那么单次可以只从缓冲区读取1个数据帧长度(ReadCount+2)的字节以节约内
    存开销,读者可根据自己的需求自行修改。
  2. 如果Count不超过2个数据帧则数据没有延迟,直接将读取到的字节数据(Buffer的前Count个字节)
    添加到一个ReadBuffer列表;否则数据有延迟冗余,将读取到的字节数据(Buffer的前Count个字节)
    的后2个数据帧长度的字节数据添加到ReadBuffer列表;因为正常情况下,2个数据帧长度的连
    续字节数据必然包含一个完整的数据帧。继续。
  3. 检查ReadBuffer的长度,如果小于1个数据帧长度则返回步骤1;如果大于或等于1个数据帧长度
    (有可能包含一个完整的数据帧),继续。
  4. 检查ReadBuffer,如果第一个字节不等于ReadHead标记,则删除这个无效字节,返回步骤3;如
    果第一个字节等于ReadHead标记,则检查第1个数据帧长度位置的字节,如果等于ReadTail标记
    则找到一个完整的数据帧,将ReadBuffer前1个数据帧长度的字节存入ReadBytes,至此,缓冲
    区中由串口发来的最近一个完整数据帧已读取到;否则数据无效;现在ReadBuffer的前1个数据
    帧长度的字节已经检查过,将其从ReadBuffer中删除,返回步骤3。

写入

  1. 检查WriteBytes,长度不等于WriteCount则返回(避免WriteBytes被误操作重新初始化为其他长
    度的数组时,向串口写入错误的字节数据);如果长度等于WriteCount,继续。
  2. 在WriteBytes前面添加WiteHead标记,后面添加WriteTail标记,将其写入串口;返回步骤1。

实现

  1. SerialPortConfig.cs 结构体存储串口参数配置。
  2. SerialPortConfigurer.cs 串口参数配置写入本地文件,从文件读取配置。
  3. SerialPortController.cs 串口同步读取,持续写入。

源码

2012-11-26 19:52:11 HPsoft 阅读数 8478

  unity3d可以把游戏发布在很多游戏平台下,但unity3d在不同的运行平台下,本地文件路径是不一样的,这样给我们用给应用配置的本地文本文件的读取带来不小的麻烦,要要把不同的平台来写出不同的路径,特别是android 平台下就更麻烦了。

  在网上转了很久,终于看到老外有个比较完美的解决办法,不敢独美,分享一下,其实很简单,就是写脚本的时候声明一个公共 TextAsset 类型变量;然后在可视化里把你要的文本文件拖进去就行了,呵呵很简单又很完美,完全不用考虑什么路径问题了


示例代码,随手写的,没测试过,但原理已经很清楚了

方法一

using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
  public TextAsset asset;
  void Start() {
    print(asset.text);
  }
}

然后把文本文件拖进 public TextAsset asset;里 调用就asset.text就可以了。


方法二

using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
  void Start() {

    TextAsset asset = (TextAsset) Resources.Load("filename", typeof(TextAsset));
    print(asset.text);
  }
}

然后把文本文件放到Resources目录里,调用Resources.Load() 方法就可以了,这里的文件名不需要写后缀名。

注意以上该去中的文本文件的后缀名必需是 .txt .html .htm .xml


2019-07-19 11:54:33 nt_xs_j 阅读数 471

我们在做项目游戏时,会有很多的配置信息,有的是一些表格,然后做配置表,生成xml等文件再加载到unity来使用,还有一些轻量级的数据做到setting类的公共字段,在面板赋值,为了方便,也会生成一个本地文件,这样可以在后续更改时尽可能少的去修改源代码。

生成asset文件要使用到 AssetDatabase 这个类,关于这个类似操作asset文件夹下的文件的,可以加载图片,资源等,详细的可以去查看 API.我们这里只需要使用它的CreateAsset()方法。

该方法需要提供路径,就是你文件存储的路径,还有存储的内容。需要特别注意的是:路径是相对于asset文件夹就是工程文件夹,不是绝对路径,如果使用绝对路径是无法创建的,而且创建之前要确保该文件夹存在,否则也无法创建成功(这里采坑才发现,当使用绝对路径它会一直告诉你文件夹路径有问题,要使asset文件夹相对路径)

然后,要先创建一下你要保存的内容,这里要用到ScriptableObject ,关于这个  的api就不在贴了,由于该文件是需要我们在运行之前就得创建的,所以也用到了编辑器扩展相关知识,不了解的去 充下电。好了基本涉及到的知识点讲完了接下来上代码

首先贴上实例的要做成文件的类:

[Serializable]
public class LocalSettings : ScriptableObject 
{
    public GameSetting gameSetting;
    public int val;
    public float fl;
}

    其中gamesetting是一个数据类,可序列话的,但是不继承scriptableObject。

接下来是负责创建的工具类:

public class ConfigFile  <T>where T :ScriptableObject 
{
    //
    public static void CreatLocalFile()
    {
        if (!Directory.Exists (SettingFilePath))
        {
            Directory.CreateDirectory(SettingFilePath);
        }
        string path = "Assets/SettingFiles/" + typeof(T)+ ".asset";//使用类  的名字
        ScriptableObject ob = ScriptableObject.CreateInstance(typeof(T));
        if (ob ==null)
        {
            Debug.LogError("cant creat file:" + typeof(T));
        }
        else
        {
            Debug.Log("Creat path:" +path);
            AssetDatabase.CreateAsset(ob, path);
        }
    }
}

该类负责创建asset文件,通过传入继承了scriptableObject 的类

 

最后是编辑器的:

 [MenuItem("ConfigFile/Create/LocalSetting")]
    public static void Create()
    {
        ConfigFile<LocalSettings>.CreatLocalFile();
        
    }

这样当在窗口点击localsetting按钮就可以创建asset文件了!

   Get到了吗?点个赞呗!!

2017-12-25 12:33:55 qq_37045414 阅读数 6689

1、修改host文件

      在C:\Windows\System32\drivers\etc文件夹下找到hosts文件,因为涉及到管理权限,将该文件复制到桌面并用txt打开,里面什么都没有。

      写下这段文字: 127.0.0.1  www.xxxxx.cn

     127.0.0.1:8080   :表示的是访问的本地服务器

     www.xxxxx.cn   :表示你在浏览器中输入的地址

     写下这段文字的意思是要告诉你浏览器当输入www.xxxxx.cn时,你要访问的是localhost:8080端口下启动的服务。

2、将webGL文件保存到你的项目Tomcat的根目录下。

      找到你的项目的Tomcat安装位置。找到webapps文件夹。下面是我的Tomcat的地址:

      D:\DevelopTools\apache-tomcat-7.0.50\webapps。

      在该文件夹下新建文件夹ROOT。这个是Tomcat可访问根目录的方式,如果不了解自行去百度上查一下。


      然后在ROOT文件夹下新建文件夹,名字和你的javaWeb访问的Unity3D的src路径的要相同(下面有介绍)

      我的文件夹命名为:cdfb5995ce5e49949c00dae26e0b05d3(32位随机数)

      最后,将通过Unity3D导出的webGL文件下的index.html文件和一个你自己命名的文件夹一起拷贝到上面的文件夹中。

        注意:这里需要在你的编程软件中配置一下Tomcat。我用的是IDEA:

                  (1)首先打开Edit configrations。在server选项卡下将HTTP port改为  80  端口。

  (2)在Deployment选项卡下,选定项目后点绿色的“+”号 选择 “External Resouse” ,然后找到你刚才保存的ROOT文件夹并选中。

                           这步的操作是保证你所创建的ROOT文件夹能被Tomcat找到。

3、修改javaWeb项目中访问Unity3D的src路径。

      将访问的view.jsp界面的src路径改成www.zhcskjtext.cn。例如下面这段代码:

    <iframe src='http://www.xxxxx.cn/cdfb5995ce5e49949c00dae26e0b05d3/index.html'id="iframepage"name="iframepage" frameBorder=0scrolling=nowidth="100%"></iframe>


4、重启Tomcat服务器。

 

   这样你就可以通过浏览器来访问你本地上的webGL文件了。

   

     

                             

unity3d读写XML

阅读数 610

没有更多推荐了,返回首页