unity3d IO操作
前几天有个朋友问我为什么在IOS平台中可以正常的读写文件可是在Android平台中就无法正常的读写。当时因为在上班所以我没时间来帮他解决,晚上回家后我就拿起安卓手机真机调试很快就定位问题所在,原来是他文件的路径写错了。开发中往往一道很难的问题解开的时候发现原来真的非常的简单,哇咔咔。 刚好在MOMO的书中也有涉及到文件的读取与写入,那么本节我将书中的部分内容搬到博客中为大家讲解一下。废话我就不多说了咱直奔主题,创建Text.cs脚本,直接挂在摄像机中。代码中包括:创建文件、读取文件、删除文件。
Text.cs
using UnityEngine;
using System.Collections;
using System.IO;
using System.Collections.Generic;
using System;
public class Text : MonoBehaviour {
//文本中每行的内容
ArrayList infoall;
//皮肤资源,这里用于显示中文
public GUISkin skin;
void Start ()
{
//删除文件
DeleteFile(Application.persistentDataPath,"FileName.txt");
//创建文件,共写入3次数据
CreateFile(Application.persistentDataPath,"FileName.txt","宣雨松MOMO");
CreateFile(Application.persistentDataPath,"FileName.txt","宣雨松MOMO");
CreateFile(Application.persistentDataPath ,"FileName.txt","宣雨松MOMO");
//得到文本中每一行的内容
infoall = LoadFile(Application.persistentDataPath,"FileName.txt");
}
/**
* path:文件创建目录
* name:文件的名称
* info:写入的内容
*/
void CreateFile(string path,string name,string info)
{
//文件流信息
StreamWriter sw;
FileInfo t = new FileInfo(path+"//"+ name);
if(!t.Exists)
{
//如果此文件不存在则创建
sw = t.CreateText();
}
else
{
//如果此文件存在则打开
sw = t.AppendText();
}
//以行的形式写入信息
sw.WriteLine(info);
//关闭流
sw.Close();
//销毁流
sw.Dispose();
}
/**
* path:读取文件的路径
* name:读取文件的名称
*/
ArrayList LoadFile(string path,string name)
{
//使用流的形式读取
StreamReader sr =null;
try{
sr = File.OpenText(path+"//"+ name);
}catch(Exception e)
{
//路径与名称未找到文件则直接返回空
return null;
}
string line;
ArrayList arrlist = new ArrayList();
while ((line = sr.ReadLine()) != null)
{
//一行一行的读取
//将每一行的内容存入数组链表容器中
arrlist.Add(line);
}
//关闭流
sr.Close();
//销毁流
sr.Dispose();
//将数组链表容器返回
return arrlist;
}
/**
* path:删除文件的路径
* name:删除文件的名称
*/
void DeleteFile(string path,string name)
{
File.Delete(path+"//"+ name);
}
void OnGUI()
{
//用新的皮肤资源,显示中文
GUI.skin = skin;
//读取文件中的所有内容
foreach(string str in infoall)
{
//绘制在屏幕当中,哇咔咔!
GUILayout.Label(str);
}
}
}
代码中头文件需要注意一下,涉及到IO读取文件。创建文件、删除文件、读取文件的方法我也已经封装好,Start方法中为了避免上次保存文件的残留首先删除原来的文件,然后创建文件FileName.txt ,我们也可修改文件的类型的后缀名。这里我写的是.txt ,为了完整的让中文出现在IOS与Android中所以这里给文件中写的数据是”宣雨松MOMO”,最后在OnGUI中将读取文件的文本信息显示在屏幕中,脚本保存格式为UTF-16。
代码中我们保存文件的路径是Application.persistentDataPath。如果你写的路径是 Application.dataPath在编辑器中是可以正常读取,但是在IOS与Android中是无法读取的,昨天问我的那个朋友就是因为这里路径写的有问题没能成功的写入文件。 Application.persistentDataPath路径就是将文件保存在手机的沙盒中,如果在编辑器中运行本程序文件将保存在Finder-》资源库-》Caches-》你的工程-》保存的文件。本例的路径就是 Finder->资源库-> Caches -> txt->FileName.txt。
OK 截至到这里,运行游戏后在编辑器中是可以正常的看到“宣雨松MOMO”出现在Game视图中,但是如果你编译在IOS或者Android上将只显示”MOMO”,原因很简单”宣雨松”三个字无法在Unity默认字体中找到,所以无法显示。而默认字体只有字母和数字、字符。我们为了在移动平台中正常的显示中文,需要自制中文字体包。下面我们开始制作一个简单的字体包,mac机的话大家可以在资源库 -》 fonts中找一个.ttf的字体,或者在网络中下载一个.ttf字体。MOMO比较喜欢微软雅黑字体,大家如果也喜欢微软雅黑可以在后面下载这个工程的源码,嘿嘿。如下图所示, Project视图中的”yh”就是MOMO在网络中下载的微软雅黑字体。
FontSize:字体的大小,这里我设置呈50,为了让大家在IPAD中能看的更清楚。
FontColor:字体颜色。
Character:这里选择Custom set,因为这里需要配置我们需要的字体。
CustomChars:这里输入需要制作的字体。Unity默认的字体包含数字符号字母,为了让移动设备支持中文,这里我输入”宣雨松”它将生成一个包含“宣雨松”的材质与贴图,也就是说将我们需要在移动设备中显示的任何字符串在这里配置一下就OK啦。
最后点击又小角的Apply按钮即可完成字体配置。
将字符赋值给创建的皮肤文件然后应用在程序当中即可,如下图所示这是IPAD中截图的效果,大家应该会问上面代码中明明写入的是”宣雨松MOMO”为什么这里没能显示MOMO呢?蛤蛤原因很简单,上图中在Custom Chars中我们只配置了 “宣雨松” 所以这里就只能显示”宣雨松”无法显示MOMO啦。。大家可根据自己需要显示的字符串添加进去即可。在程序中我们可能会写入很多的中文,但是同样的文字又没必要重复出现,那么如何来制作这个字体包呢?制作的细节大家可以参照威哥的博客:http://1vr.cn/article.asp?id=607 他已经写得很清楚啦。
最后本文的程序MOMO已经打成包,雨松MOMO希望和大家一起学习,一起进步加油哇咔咔,拉拉~~
下载地址:http://vdisk.weibo.com/s/ab_aA
补充:假设你的程序中已经预先将2进制文件做好,如下图所示,你需要把二进制文件放在StreamingAssets这个文件夹中,一定要放在这里。
举个例子,放在StreamingAssets中二进制文件打包后,Unity会将这些二进制文件放置在对应平台下的路径下。所以根据不同平台,访问的路径是不一样的。切记,你的二进制文件一定要放在StreamingAssets !!!!!!
#if UNITY_EDITOR
string filepath = Application.dataPath +"/StreamingAssets"+"/my.xml";
#elif UNITY_IPHONE
string filepath = Application.dataPath +"/Raw"+"/my.xml";
#elif UNITY_ANDROID
string filepath = "jar:file://" + Application.dataPath + "!/assets/"+"/my.xml;
#endif
unity3d IO操作的更多相关文章
- [.NET] 利用 async & await 进行异步 IO 操作
利用 async & await 进行异步 IO 操作 [博主]反骨仔 [出处]http://www.cnblogs.com/liqingwen/p/6082673.html 序 上次,博主 ...
- 文件IO操作..修改文件的只读属性
文件的IO操作..很多同行的IO工具类都是直接写..但是如果文件有只读属性的话..则会写入失败..所以附加了一个只读的判断和修改.. 代码如下: /// <summary> /// 创建文 ...
- python之协程与IO操作
协程 协程,又称微线程,纤程.英文名Coroutine. 协程的概念很早就提出来了,但直到最近几年才在某些语言(如Lua)中得到广泛应用. 子程序,或者称为函数,在所有语言中都是层级调用,比如A调用B ...
- JAVASE02-Unit08: 文本数据IO操作 、 异常处理
Unit08: 文本数据IO操作 . 异常处理 * java.io.ObjectOutputStream * 对象输出流,作用是进行对象序列化 package day08; import java.i ...
- JAVASE02-Unit07: 基本IO操作 、 文本数据IO操作
基本IO操作 . 文本数据IO操作 java标准IO(input/output)操作 package day07; import java.io.FileOutputStream; import ja ...
- IO操作概念。同步、异步、阻塞、非阻塞
“一个IO操作其实分成了两个步骤:发起IO请求和实际的IO操作. 同步IO和异步IO的区别就在于第二个步骤是否阻塞,如果实际的IO读写阻塞请求进程,那么就是同步IO. 阻塞IO和非阻塞IO的区别在于第 ...
- Java基础复习笔记系列 七 IO操作
Java基础复习笔记系列之 IO操作 我们说的出入,都是站在程序的角度来说的.FileInputStream是读入数据.?????? 1.流是什么东西? 这章的理解的关键是:形象思维.一个管道插入了一 ...
- java中的IO操作总结
一.InputStream重用技巧(利用ByteArrayOutputStream) 对同一个InputStream对象进行使用多次. 比如,客户端从服务器获取数据 ,利用HttpURLConnect ...
- Linux系统编程--文件IO操作
Linux思想即,Linux系统下一切皆文件. 一.对文件操作的几个函数 1.打开文件open函数 int open(const char *path, int oflags); int open(c ...
随机推荐
- js文件操作
IE下 1. 写入 FileSystemObject可以将文件翻译成文件流. 第一步: 例: 复制代码代码如下: Var fso=new ActiveXObject(Scripting.FileSys ...
- or and 运算符与 pyhton编码
运算符 # x or y 如果 x 为真,则值为x,否则为y 1 print(4 or 3) # 4 2 print(2 or 3) # 2 3 print(1 or 3) # 1 4 print(0 ...
- JQuery3 的新变化
1. for-of 循环 for-in 循环不被推荐遍历数组,forEach 循环不能中断,for-of 循环(ES6)则弥补了前两者的不足,又添加了更多拓展(比如能遍历字符串,DOM 元素等) 因此 ...
- Linux启动ssh服务
Linux启动ssh服务 在Linux下启动ssh服务使用如下命令其一即可: # service sshd start # /etc/init.d/sshd start 开机启动 使用如下方法其就可以 ...
- ACM训练小结-2018年6月15日
今天题目情况如下:A题:给出若干条边的边长,问这些边按顺序能否组成一个凸多边形,并求出这个多边形的最小包含圆.答题情况:无思路.正解(某种):第一问很简单.对第二问,如果R大于可行的最小R,那么按照放 ...
- Pandas的 loc iloc ix 区别
先看代码: In [46]: import pandas as pd In [47]: data = [[1,2,3],[4,5,6]] In [48]: index = [0,1] In [49]: ...
- MIPI DBI\DPI\DSI简介【转】
本文转载自:http://blog.csdn.net/longxiaowu/article/details/24249971 (1)DBI接口 A,也就是通常所讲的MCU借口,俗称80 system接 ...
- Spring MVC 接收多个实体参数
在SpringMVC 的接收参数中,如果接收一个实体对象,只需要在方法参数中这样做:@RequestBody User user //单个的时候这样接收 @RequestMapping(value = ...
- Android深度探索(卷1)HAL与驱动开发 虚拟环境的安装
前言: 最近在看<Android深度探索(卷1)HAL与驱动开发>安装随书带的虚拟环境浪费了很多时间,说是虚拟环境的安装倒不如说是虚拟环境的导入,其实没什么技术含量,也没有什么复杂的,只是 ...
- BZOJ 4154 kd-tree dfs序 + 二维空间的区间(矩阵)更新单点查找
一开始没思路 感觉像是一个树形dp 然而不会 然后看了一眼题解就明白了 一个点的子树 用dfs序表示肯定是一个连续的区间 并且由于有子树的距离限制 可以转化为一个深度的区间 于是每个点都会有一个在二维 ...