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

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

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

Text.cs

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





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  





015         //删除文件





016         DeleteFile(Application.persistentDataPath,"FileName.txt");





017  





018         //创建文件,共写入3次数据





019         CreateFile(Application.persistentDataPath,"FileName.txt","宣雨松MOMO");





020         CreateFile(Application.persistentDataPath,"FileName.txt","宣雨松MOMO");





021         CreateFile(Application.persistentDataPath
,"FileName.txt","宣雨松MOMO");





022         //得到文本中每一行的内容





023         infoall =
LoadFile(Application.persistentDataPath,"FileName.txt");





024  





025     }





026  





027    /**





028    * path:文件创建目录





029    * name:文件的名称





030    *  info:写入的内容





031    */





032    void CreateFile(string path,string name,string
info)





033    {





034       //文件流信息





035       StreamWriter
sw;





036       FileInfo t = new
FileInfo(path+"//"+ name);





037       if(!t.Exists)





038       {





039         //如果此文件不存在则创建





040         sw =
t.CreateText();





041       }





042       else





043       {





044         //如果此文件存在则打开





045         sw =
t.AppendText();





046       }





047       //以行的形式写入信息





048       sw.WriteLine(info);





049       //关闭流





050       sw.Close();





051       //销毁流





052       sw.Dispose();





053    } 





054  





055   /**





056    * path:读取文件的路径





057    * name:读取文件的名称





058    */





059    ArrayList LoadFile(string path,string
name)





060    {





061         //使用流的形式读取





062         StreamReader sr
=null;





063         try{





064             sr
= File.OpenText(path+"//"+ name);





065         }catch(Exception
e)





066         {





067             //路径与名称未找到文件则直接返回空





068             return
null;





069         }





070         string
line;





071         ArrayList arrlist =
new ArrayList();





072         while ((line =
sr.ReadLine()) != null)





073         {





074             //一行一行的读取





075             //将每一行的内容存入数组链表容器中





076             arrlist.Add(line);





077         }





078         //关闭流





079         sr.Close();





080         //销毁流





081         sr.Dispose();





082         //将数组链表容器返回





083         return
arrlist;





084    }  





085  





086   /**





087    * path:删除文件的路径





088    * name:删除文件的名称





089    */





090  





091    void DeleteFile(string path,string
name)





092    {





093         File.Delete(path+"//"+
name);





094  





095    }





096  





097    void OnGUI()





098    {





099         //用新的皮肤资源,显示中文





100         GUI.skin =
skin;





101         //读取文件中的所有内容





102         foreach(string str in
infoall)





103         {





104             //绘制在屏幕当中,哇咔咔!





105             GUILayout.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按钮即可完成字体配置。

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

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

时间: 2024-10-12 21:20:12

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

unity 各平台本地文件的读取目录

在win上,将配置文件放在了 Application.dataPath 目录下,编辑状态下,测试通过.发布为exe后,读取失败.后来将配置文件放到生成的_data文件下,通过. 当然想到以后发布到其他平台,在移动端下 Application.persistentDataPath  才是移动端可用的保存生成文件的地方,放到resource中打包后不可以更改了,放到Application .dataPath中移动端是没有访问权限的.需要修改的文件建议放在Application.persistentD

c文件二进制读取写入文件、c语言实现二进制(01)转化成txt格式文本、c读取文件名可变

c语言实现二进制(01)转化成txt格式文本: 下面的程序只能实现ascall对应字符转换,如果文件内出现中文字符,则会出现错误. 本程序要自己创建个文本格式的输入文件a1.txt,编译后能将文本文件前255字节以内的字符转换成相应的AscII码值的二进制表示,并存入输出文件a2.txt中.然后再将二进制文件还原并存入b2.txt文件. 参考链接:https://www.jb51.net/article/158695.htm 1 #include <cstdio> 2 #include <

PHP 支持中文目录和文件的的遍历

在使用 readdir() 遍历指定目录时,使中文目录和文件名都正常显示需要使用 iconv() 进行文件编码转换: 1 <?php 2 3 header("Content-type:text/html;charset=utf-8"); 4 5 $num = 0; 6 $dirname = 'practise'; 7 8 $dirname = iconv( 'utf-8', 'gb2312',$dirname ); 9 10 $dir_handle = opendir($dirn

Node.js——fs模块(文件系统),创建、删除目录(文件),读取写入文件流

1 /* 2 1. fs.stat 检测是文件还是目录(目录 文件是否存在) 3 2. fs.mkdir 创建目录 (创建之前先判断是否存在) 4 3. fs.writeFile 写入文件(文件不存在就创建,但不能创建目录) 5 4. fs.appendFile 写入追加文件 6 5. fs.readFile 读取文件 7 6. fs.readdir 读取目录 8 7. fs.rename 重命名 9 8. fs.rmdir 删除目录 10 9. fs.unlink 删除文件 11 */ 12

python 文件处理 -- 01 文件打开&amp;读取&amp;写入&amp;关闭&amp;指针

1.文件打开 1.1.文件打开方法 open(name[,mode[,buff]] ->file name--文件路径 mode--打开方式 buff--缓冲buffer的大小 file--返回file类型的对象 重要:必须要写close()方法 1.2文件打开方式 另: 打开二进制文件(如图片)时,需使用如下方式 'rb'.'wb'.'ab'.'rb+'.'wb+'.'ab+' 2.文件读取 2.1文件读取方法 read([size]) 读取size个字节,默认 读取全部. 如果size小于等

Java NIO 读取文件、写入文件、读取写入混合

前言 Java NIO(new/inputstream outputstream)使用通道.缓冲来操作流,所以要深刻理解这些概念,尤其是,缓冲中的数据结构(当前位置(position).限制(limit).容量(capacity)),这些知识点要通过写程序慢慢体会. NIO vs  传统IO NIO是面向缓冲.通道的:传统IO面向流 通道是双向的既可以写.也可以读:传统IO只能是单向的 NIO可以设置为异步:传统IO只能是阻塞,同步的 缓冲区结构图 NIO是面向缓冲区的,缓冲区可以理解为一块内存

浅谈本地文件包含利用

今天在公众号看到了一个本地文件包含的利用工具,看了下国外大牛对该工具的使用的一个视频,感觉很厉害,通过该工具可对存在本地文件包含漏洞的站点进行利用并返回一个LFI shell,通过返回的LFI shell再次获取一个反向连接,从而可执行相关命令,以前对本地文件包含的利用大多都停留在读取文件,如果有远程文件包含的话就可以getshell.这篇文章主要是对本地文件包含的一个简单介绍及利用,主要是对工具的使用,也主要是记录下该过程,方便以后查看,然后再抽时间研究下大神源代码!大神请绕道而行!: ) 0

pyhton 从web获取json数据 保存到本地然后再读取

从web中获取json数据直接进行处理总认为太慢.主要是从web中获取获取数据的过程有点慢. 所以就在想 假设先利用空暇时间把json数据获取并保存到本地,然后再从本地文件里读取和操作.应该就要快非常多. 这中间的主要问题就是格式的转换问题:1.将获取取的json数据序列化后保存到本地文件里:2.从文件里逐行读取数据,再将其反序列化为json格式. 详细的一个演示样例程序例如以下: [为保护个人信息,程序中的一些代码不完整] from urllib.request import urlopen;

Java I/O---RandomAccessFile类(随机访问文件的读取和写入)

1.JDK API中RandomAccessFile类的描述 此类的实例支持对随机访问文件的读取和写入.随机访问文件的行为类似存储在文件系统中的一个大型 byte 数组.存在指向该隐含数组的光标或索引,称为文件指针:输入操作从文件指针开始读取字节,并随着对字节的读取而前移此文件指针.如果随机访问文件以读取/写入模式创建,则输出操作也可用:输出操作从文件指针开始写入字节,并随着对字节的写入而前移此文件指针.写入隐含数组的当前末尾之后的输出操作导致该数组扩展.该文件指针(实现数组随机读写)可以通过