您的当前位置:首页正文

Unity读取文件TextAsset读取配置文件方式

2023-10-23 来源:个人技术集锦
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(\ }

parts[0] = \"hero1\" parts[1] = \"1\" parts[2] = \"1\" parts[2] = \"1

补充:Unity加载TextAsset中的内容为空

需求需要从Resources⽬录下加载json⽂件,于是在⽬录下创建了个txt⽂本,然后修改后缀名为.Json,

⽤Resource.Load() 发现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] //⼀定要有,同时不能继承MonoBehaviourpublic 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(json); }

return _data; } } }

然后在unity 的StreamingAssets⽂件夹下创建个test.txt⾥⾯内容:(⼀定要有花括号)

{\"Num1\":30,\"Num2\":60,\"String1\":\"aaa\

然后再其他脚本⾥,直接调⽤就好了

例如:

using UnityEngine;

using System.Collections;

public class LoadConfig : MonoBehaviour {// Use this for initializationvoid Start () {

print(Config._Data.Num1); print(Config._Data.String2); }

// Update is called once per framevoid Update () {}}

2017.3.27更新:⾃⼰⼜理解了⼀点

如果要读取⽹页某天⽓信息,但是不⽌⼀个花括号,分了⼏层,需要怎么做?例如信息:

{\"weatherinfo\":{\"city\":\"北京\东南风\级\暂⽆实况\

上⾯的就不多复述,⼤概思路就是再建⽴⼀个类保存⼆级信息Config类修改如下(之前的全部删除):

using UnityEngine;

using System.Collections;

using System.Collections.Generic;using System;

[Serializable] //⼀定要有,同时不能继承MonoBehaviourpublic 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 initializationvoid Start () {

StartCoroutine(\"load\");

Invoke(\"LoadMessage\}

// Update is called once per framevoid 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(json); }

void LoadMessage() {

print(_config.weatherinfo.city); print(_config.weatherinfo.cityid); }}

以上为个⼈经验,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。如有错误或未考虑完全的地⽅,望不吝赐教。

因篇幅问题不能全部显示,请点此查看更多更全内容