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);
    }
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。如有错误或未考虑完全的地方,望不吝赐教。

(0)

相关推荐

  • C#中public变量不能被unity面板识别的解决方案

    究其根本,原因在于,能在unity面板上识别的变量,public不是唯一的条件,另外一个条件是可序列化 比如你声明了如下一个类 using System.Collections; using System.Collections.Generic; using UnityEngine; public class Wave { public GameObject prefab; public int count; public float rate; } 在另外一个类中进行声明时如下: public

  • Unity3d使用FairyGUI 自定义字体的操作

    最近ui同学使用了一种新字体(锐字锐线怒放黑简) 发现全部切成图片字体 吓死我了 unity3d和fairygui搭配使用字体过程 1.第一步肯定是找美术同学拿他们找来的字体 由于fairygui编辑器用的字体是访问操作系统的字体 所以拿到新字体直接双击安装吧(或者放入操作系统盘内的Windows/Fonts)如下图 2.在fairygui里加个文本 选择字体 就能找到我们添加的字体了 3.接着把字体拷贝到unity3d工程下 存放在Resource\Font(没有可以自己建文件夹)注意这边命名

  • Unity使用物理引擎实现多旋翼无人机的模拟飞行

    内容简介 最近在用Unity实现无人机的模拟飞行,但发现站里基本没有完整介绍如何实现该功能的博客,因时间紧迫,就自己简单做了一个仿真(不是完全按照现实物理情景来做,即通过各个螺旋桨旋转产生力带动机体飞行).下面我会简述完全按现实物理情景实现模拟飞行,并详细描述我自己做的模拟飞行(不完全仿真),给各位提供参考. 现实物理情景的实现--简述(以四旋翼无人机为例) 因为我没有实现1:1仿真,所以这里只介绍思路,希望能给到读者一点启发. 构建一个四旋翼无人机模型(可以网上下载.或用Maya等建一个) 将

  • Unity游戏之存储数据

    在许多游戏中当我们因为一些问题无法接着进行游玩,我们都会选择保存,以便后面有空时,接着游玩.接下来,我们会学习一些Unity有关的存储方法. 一.Unity-PlayerPrefs(数据持久化) 这是Unity自带的用于本地持久化保存与读取的类,采用的是键值对的方式来进行存储,一般通过键名来进行获取.PlayerPrefs有Int,float,string类型. 保存数据 PlayerPrefs.SetString("Color", color); PlayerPrefs.SetInt

  • Unity 静态变量跨场景操作

    创建两个场景同时赋值StaticVarious 脚本 然后按键好,H ,J 进行不断切换场景,会发现unity 控制台输出数字不断增加,然后把静态去掉,这样结果都是10. using UnityEngine; using System.Collections; using UnityEngine.SceneManagement; public class StaticVarious : MonoBehaviour { static int value = 10; void Start () {

  • Unity3d 如何更改Button的背景色

    我就废话不多说了,大家还是直接看代码吧~ using UnityEngine; using System.Collections; public class ButtonStyle : MonoBehaviour { public Color _color;//在编辑环境下选择背景色,透明度不能为0 public Texture2D tex; void OnGUI(){GUI.Button(new Rect(0,0,100,100),"tex");Color oldColor = GU

  • 在unity脚本中控制Inspector面板的参数操作

    在编写脚本的过程中我们会遇到一些小问题 比如一个的变量 为了在其他脚本中可以调用 我们需要写成public类型的 这样的话在Inspector面板中会出现此变量 这篇博客会给大家介绍一些方法去避免这些小问题 1.[Header(" ")] 这个的作用是给它下面的所有变量一个总标题 2.[Tooltip("")] 这个的作用是给下面的第一行(紧邻的语句)注释 这个注释和双斜杠的注释不同 这个注释的效果是在unity中鼠标拖到变量的名字上 他会出现注释(括号的双引号中的

  • unity 切换场景不销毁物体问题的解决

    在用unity进行游戏开发时我们有时需要一些物体在场景切换时不需要被销毁这时我们可以用官方给的DontDestroyOnLoad()方法, 这个方法可以让我们在场景切换时不销毁场景.但如果你又返回这个场景(创建不可销毁物体的场景)时就会发现会有两个这个物体(标记为不可销毁的物体). 这个问题有一个较为简单的解决方法就是: 在物体的Awake()或Star()方法中加入这段代码.如果找到和自己一样的名字却不是自己的物体就将自己销毁,这样就解决了这个问题.(别的地方不知道,我的项目是可以用): if

  • 解决在Unity中使用FairyGUI遇到的坑

    首先!首先!首先! 首先,我们由于历史问题,项目用的UI编辑器不是大众使用的GUI或者NGUI, 而是使用不知道算不算小众的FairyGUI,这个UI系统使用挺方便的,也提供了很多UI编码的案例,至少从直接使用来说方便了不少. 但是!但是!但是! 可能用到这个UI编辑器的不是那么多,项目上遇到的问题在网上百度出来的结果很少,基本自己断点查找bug. 最后!最后!最后! 我这个从没写过几次技术博客的人,要写这篇技术贴的原因是:昨晚加班到四五点钟查找BUG回到屋里,发现由于没有关好自己卧室的门,室友

  • Unity3D运行报DllNotFoundException错误的解决方案

    起因 unity程序build到pc上,拿到其他人的机器上结果有些功能不正常,看log里面大概是 Fallback handler could not load library: xxx.dll DllNotFoundException: xxx.dll 初看以为是缺失dll,但是实际上并不是这样,首先在很多人机器上都是没有问题的,只在极少数机器上才出现异常,另外报错的dll都是有的,并不存在缺失的问题. 后来网上搜了一下,看到http://answers.unity3d.com/questio

  • 在Unity中使用全局变量的操作

    创建一个脚本,输入下面的代码.脚本不需要添加到任何物体上,globle变量可以跨场景全局调用. using System.Collections; using System.Collections.Generic; using UnityEngine; public class Globle { public static int globle= 1; } 和以前的许多语言不同,C#没有全局变量或全局函数.C#的所有字段和方法都在类的上下文中. 在C#中,与全局字段或函数等价的是静态字段或方法.

  • Unity3D 单例模式和静态类的使用详解

    Unity3D的API提供了很多的功能,但是很多流程还是会自己去封装一下去.当然现在网上也有很多的框架可以去下载使用,但是肯定不会比自己写的用起来顺手. 对于是否需要使用框架的问题上,本人是持肯定态度的,把一些常用方法进行封装,做成一个功能性的框架,可以很大程度上提高代码的效率,维护也方便. 对于网络上很多教程上使用的"游戏通用MVC框架",现在看来并不符合MVC这种结构性框架的设计思想:要知道,MVC最初是被设计为Web应用的框架,而游戏中的很多事件并不是通过用户点击UI发生的,Vi

随机推荐