Unity3D研究之支持中文与本地文件的读取写入(转)

摘要:
刚好在MOMO的书中也有涉及到文件的读取与写入,那么本节我将书中的部分内容搬到博客中为大家讲解一下。Text.cs[代码]c#/cpp/oc代码:001usingUnityEngine;002usingSystem.Collections;003usingSystem.IO;004usingSystem.Collections.Generic;005usingSystem;006007publicclassText:MonoBehaviour{008//文本中每行的内容009ArrayListinfoall;010//皮肤资源,这里用于显示中文011publicGUISkinskin;012voidStart()013{014015//删除文件016DeleteFile;017018//创建文件,共写入3次数据019CreateFile;020CreateFile;021CreateFile;022//得到文本中每一行的内容023infoall=LoadFile;024025}026027/**028*path:文件创建目录029*name:文件的名称030*info:写入的内容031*/032voidCreateFile033{034//文件流信息035StreamWritersw;036FileInfot=newFileInfo;037if(!Application.persistentDataPath路径就是将文件保存在手机的沙盒中,如果在编辑器中运行本程序文件将保存在Finder-》资源库-》Caches-》你的工程-》保存的文件。

前几天有个朋友问我为什么在IOS平台中可以正常的读写文件可是在Android平台中就无法正常的读写。当时因为在上班所以我没时间来帮他解决,晚上回家后我就拿起安卓手机真机调试很快就定位问题所在,原来是他文件的路径写错了。开发中往往一道很难的问题解开的时候发现原来真的非常的简单,哇咔咔。 刚好在MOMO的书中也有涉及到文件的读取与写入,那么本节我将书中的部分内容搬到博客中为大家讲解一下。废话我就不多说了咱直奔主题,创建Text.cs脚本,直接挂在摄像机中。代码中包括:创建文件、读取文件、删除文件。

AD:
51CTO学院:IT精品课程在线看!

Text.cs

[代码]c#/cpp/oc代码:

001using UnityEngine;
002using System.Collections;
003using System.IO;
004using System.Collections.Generic;
005using System;
006
007public class Text : MonoBehaviour {
008//文本中每行的内容
009ArrayList infoall;
010//皮肤资源,这里用于显示中文
011public GUISkin skin;
012void Start ()
013{
014
015//删除文件
016DeleteFile(Application.persistentDataPath,"FileName.txt");
017
018//创建文件,共写入3次数据
019CreateFile(Application.persistentDataPath,"FileName.txt","宣雨松MOMO");
020CreateFile(Application.persistentDataPath,"FileName.txt","宣雨松MOMO");
021CreateFile(Application.persistentDataPath ,"FileName.txt","宣雨松MOMO");
022//得到文本中每一行的内容
023infoall = LoadFile(Application.persistentDataPath,"FileName.txt");
024
025}
026
027/**
028* path:文件创建目录
029* name:文件的名称
030* info:写入的内容
031*/
032void CreateFile(string path,string name,string info)
033{
034//文件流信息
035StreamWriter sw;
036FileInfo t = new FileInfo(path+"//"+ name);
037if(!t.Exists)
038{
039//如果此文件不存在则创建
040sw = t.CreateText();
041}
042else
043{
044//如果此文件存在则打开
045sw = t.AppendText();
046}
047//以行的形式写入信息
048sw.WriteLine(info);
049//关闭流
050sw.Close();
051//销毁流
052sw.Dispose();
053}
054
055/**
056* path:读取文件的路径
057* name:读取文件的名称
058*/
059ArrayList LoadFile(string path,string name)
060{
061//使用流的形式读取
062StreamReader sr =null;
063try{
064sr = File.OpenText(path+"//"+ name);
065}catch(Exception e)
066{
067//路径与名称未找到文件则直接返回空
068return null;
069}
070string line;
071ArrayList arrlist = new ArrayList();
072while ((line = sr.ReadLine()) != null)
073{
074//一行一行的读取
075//将每一行的内容存入数组链表容器中
076arrlist.Add(line);
077}
078//关闭流
079sr.Close();
080//销毁流
081sr.Dispose();
082//将数组链表容器返回
083return arrlist;
084}
085
086/**
087* path:删除文件的路径
088* name:删除文件的名称
089*/
090
091void DeleteFile(string path,string name)
092{
093File.Delete(path+"//"+ name);
094
095}
096
097void OnGUI()
098{
099//用新的皮肤资源,显示中文
100GUI.skin = skin;
101//读取文件中的所有内容
102foreach(string str in infoall)
103{
104//绘制在屏幕当中,哇咔咔!
105GUILayout.Label(str);
106}
107
108}
109
110}

代码中头文件需要注意一下,涉及到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按钮即可完成字体配置。

Unity3D研究之支持中文与本地文件的读取写入(转)第1张

将字符赋值给创建的皮肤文件然后应用在程序当中即可,如下图所示这是IPAD中截图的效果,大家应该会问上面代码中明明写入的是”宣雨松MOMO”为什么这里没能显示MOMO呢?蛤蛤 原因很简单,上图中在Custom Chars中我们只配置了 “宣雨松” 所以这里就只能显示”宣雨松”无法显示MOMO啦。。大家可根据自己需要显示的字符串添加进去即可。在程序中我们可能会写入很多的中文,但是同样的文字又没必要重复出现,那么如何来制作这个字体包呢?制作的细节大家可以参照威哥的博客:http://1vr.cn/article.asp?id=607 他已经写得很清楚啦。

Unity3D研究之支持中文与本地文件的读取写入(转)第2张

代码下载:http://115.com/file/e7ieutvl#Font.unitypackage

免责声明:文章转载自《Unity3D研究之支持中文与本地文件的读取写入(转)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇【linux基础】linux远程登录SSH多个不同的页眉页脚下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

JSON数据的处理中的特殊字符

     JSON如今是非经常见的处理数据的方式了。但因为自己使用的是反射获取数据,必须自己处理特殊字符,但总是发现有一些看不见的字符在前台 var obj = jQuery.parseJSON(msg);会转换失败。     比如例如以下在Vs中能够看到仅仅有两个字符    可实际上却有三个字符,使用notepad++打开 一直不明确这些字符是怎样进...

Android学习笔记——xml

转自http://blog.csdn.net/sam_zhang1984 解析XML有两种方式:SAX和DOM。它们各有利弊。 DOM是把XML文档全部装载到内存中,然后当成一树进行处理。其好处是当成树处理起来比较方便,但弊端是如果XML文件比较大时,会对内存消耗比较大; SAX是逐行扫描XML文档,逐行解析,而且可以在处理XML文档过程中的任意时刻中止处...

Kubernetes K8S之通过yaml文件创建Pod与Pod常用字段详解

YAML语法规范;在kubernetes k8s中如何通过yaml文件创建pod,以及pod常用字段详解 YAML 语法规范 K8S 里所有的资源或者配置都可以用 yaml 或 Json 定义。YAML 是一个 JSON 的超集,任何有效的 JSON 文件也都是一个有效的YAML文件。 具体参见:「YAML 语言教程与使用案例」 通过yaml创建nginx...

1,怎么获得数据库表结构。

1,在注入时初始化这两个模板。 /*** 注入数据源, 该数据源在Spring配置文件中配置* 在注入时初始化这两个模板* @paramdataSource* Method create author: yanwei* Method create dateTime: 2011-11-2 下午03:43:13* Method update autho...

Java调用第三方接口示范

在项目开发中经常会遇到调用第三方接口的情况,比如说调用第三方的天气预报接口。 使用流程【1】准备工作:在项目的工具包下导入HttpClientUtil这个工具类,或者也可以使用Spring框架的restTemplate来调用,上面有调用接口的方法【分为Get和Post方式的有参和无参调用】: package com.njsc.credit.util;imp...

记录一款Unity VR视频播放器插件的开发

效果图## 先上一个效果图: 背景 公司最近在做VR直播平台,VR开发我们用到了Unity,而在Unity中播放视频就需要一款视频插件,我们调研了几个视频插件,记录两个,如下: Unity视频插件调研 网上搜了搜,最流行的有以下两款Unity插件: AVPro 这个在Unity商店售价150$,最新release版本为1.6.15,功能包括: Power...