前幾天有個朋友問我為什么在IOS平臺中可以正常的讀寫文件可是在Android平臺中就無法正常的讀寫。當時因為在上班所以我沒時間來幫他解決,晚上回家后我就拿起安卓手機真機調試很快就定位問題所在,原來是他文件的路徑寫錯了。開發中往往一道很難的問題解開的時候發現原來真的非常的簡單,哇咔咔。
剛好在MOMO的書中也有涉及到文件的讀取與寫入,那么本節我將書中的部分內容搬到博客中為大家講解一下。廢話我就不多說了咱直奔主題,創建Text.cs腳本,直接掛在攝像機中。代碼中包括:創建文件、讀取文件、刪除文件。
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 //文本中每行的內容
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