Unity 讀取文件 TextAsset讀取配置文件方式
1 支持文件類型
.txt
.html
.htm
.xml
.bytes
.json
.csv
.yaml
.fnt
2 尋找文件
1 //Load texture from disk
TextAsset bindata= Resources.Load("Texture") as TextAsset; Texture2D tex = new Texture2D(1,1); tex.LoadImage(bindata.bytes);
2 直接在編輯器中賦值
public TextAsset textFile;
3 配置文件通常分行配置屬性
例如:
英雄名稱,等級,生命,攻擊
hero1,1,1,1 hero2,1,1,1 string[] lines = textFile.text.Split("\n"[0]); 可以讀出屬性 lines[0] = "英雄名稱,等級,生命,攻擊" lines[1] = "hero1,1,1,1" lines[2] = "hero2,1,1,1"
然後可以讀出每條數據的具體屬性
for (int i = 0; i < lines.Length - 2; i++) { string[] parts = lines[i + 1].Split(","[0]); } parts[0] = "hero1" parts[1] = "1" parts[2] = "1" parts[2] = "1
補充:Unity加載TextAsset中的內容為空
需求需要從Resources目錄下加載json文件,於是在目錄下創建瞭個txt文本,然後修改後綴名為.Json,
用Resource.Load<TextAsset>() 發現TextAsset.text竟然為空,裡面什麼都沒有,以為是.Json首字母大寫的緣故,於是改為.json,結果還沒有用,
新開工程卻發現用腳本生成的json文件卻是可以獲取到的,再仔細檢查發現選中json文件的時候屬性面板竟然什麼都沒顯示出來,於是懷疑json文件不正確沒有被unity識別到,用vs高級保存選項發現文本竟然是GBK2312格式,改為UTF-8格式發現可以顯示出來並能讀取到text。
於是懷疑是創建txt文本時默認編碼格式不正確,發現默認編碼格式是ASCII格式,看來以後創建json的時候更要註意編碼格式的問題瞭。
補充:Unity 簡易讀取配置文件內容(txt,懶人用)
翻以前別人寫的一個項目,看到讀取本地配置文件的,目前雖然不太懂,但是先放著,估摸以後牛B瞭就看懂瞭
首先自定義一個config類:
using UnityEngine; using System.Collections; using System; [Serializable] //一定要有,同時不能繼承MonoBehaviour public class Config { public int Num1; //我文檔裡有2個int,2個string類型 public int Num2; public string String1; public string String2; // Use this for initialization void Start () { } private static Config _data; public static Config _Data { get { if (_data == null) { string json = System.IO.File.ReadAllText(Application.streamingAssetsPath + "/test.txt"); _data = JsonUtility.FromJson<Config>(json); } return _data; } } }
然後在unity 的StreamingAssets文件夾下創建個test.txt
裡面內容:(一定要有花括號)
{"Num1":30,"Num2":60,"String1":"aaa","String2":"bbb"}
然後再其他腳本裡,直接調用就好瞭
例如:
using UnityEngine; using System.Collections; public class LoadConfig : MonoBehaviour { // Use this for initialization void Start () { print(Config._Data.Num1); print(Config._Data.String2); } // Update is called once per frame void Update () { } }
2017.3.27更新:自己又理解瞭一點
如果要讀取網頁某天氣信息,但是不止一個花括號,分瞭幾層,需要怎麼做?
例如信息:
{"weatherinfo":{"city":"北京","cityid":"101010100","temp":"18","WD":"東南風","WS":"1級","SD":"17%","WSE":"1","time":"17:05","isRadar":"1","Radar":"JC_RADAR_AZ9010_JB","njd":"暫無實況","qy":"1011","rain":"0"}}
上面的就不多復述,大概思路就是再建立一個類保存二級信息
Config類修改如下(之前的全部刪除):
using UnityEngine; using System.Collections; using System.Collections.Generic; using System; [Serializable] //一定要有,同時不能繼承MonoBehaviour public class Config { public Weatherinfo weatherinfo; //這裡的weatherinfo 就是上面信息的第一層weatherinfo,建立父級保存信息(名字要對應天氣的weatherinfo) } [Serializable] public class Weatherinfo //weatherinfo下的信息保存,類裡的city 對應信息裡的city,一次類推,我就寫2個瞭; { public string city; public int cityid; }
再新建一個名字為LoadWWW的腳本,用於讀取網絡的數據:
using UnityEngine; using System.Collections; using System; public class LoadWWW : MonoBehaviour { Config _config = new Config(); // Use this for initialization void Start () { StartCoroutine("load"); Invoke("LoadMessage", 1f); } // Update is called once per frame void Update () { } IEnumerator load() { WWW w = new WWW("http://www.weather.com.cn/data/sk/101010100.html");//加載某網頁數據,根據自己需求改 yield return w; string json = w.text; print(json); _config = JsonUtility.FromJson<Config>(json); } void LoadMessage() { print(_config.weatherinfo.city); print(_config.weatherinfo.cityid); } }
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。如有錯誤或未考慮完全的地方,望不吝賜教。
推薦閱讀:
- None Found