【Unity】【C#】UGUI实现读取道具时候的问题

通过UGUI实现黑暗之光的教程的内容的道具信息读取时候遇到的问题:

读取的道具图片名字Icon_name在Unity中显示正常,可是只有最后一个图片的读取正常

文本道具信息如下:

1001,小血瓶,icon-potion1
1002,中血瓶,icon-potion2
1003,小蓝瓶,icon-potion3
1004,小盾,icon-shield
1005,中盾,icon-shield1

文本分割代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ObjectsInfo : MonoBehaviour {
    public TextAsset objectInfoListText;
    public static ObjectsInfo _instance;
    private Dictionary<int, ObjectInfo> infoDic = new Dictionary<int, ObjectInfo>();

    private void Awake()
    {
        _instance = this;
        ReadInfo(); 
    }

    public ObjectInfo GetObjectInfoById(int id)
    {
        ObjectInfo info = null;
        infoDic.TryGetValue(id, out info);
        return info;
    }
//===================================
//错误出现在ReadInfo()  根据个人测试
//===================================
    void ReadInfo()
    {
        string text = objectInfoListText.text;
        string[] item = text.Split('\n');
        //通过换行分割每个道具的所有信息
        foreach (string itemInfo in item)
        {
            ObjectInfo objInfo = new ObjectInfo();
            //通过逗号分割每个道具的每条信息
            string[] infoA = itemInfo.Split(',');
            objInfo.id = int.Parse(infoA[0]);
            objInfo.name = infoA[1];
            objInfo.icon_name = infoA[2];
            infoDic.Add(objInfo.id, objInfo);
        }
    }
}
public class ObjectInfo
{
    public int id;
    public string name;
    public string icon_name;
}

读取道具信息代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;


public class InventoryItemGrid : MonoBehaviour {

    public Image mObject;

    public int objId;
    public ObjectInfo objInfo;
    public Sprite sprite;

    //通过按下X键盘,对某个道具信息进行更换
    
	void Update () {

        if (Input.GetKeyDown(KeyCode.X))
        {

            mObject = transform.Find("Inventory-Item").GetComponent<Image>();
            objId = Random.Range(1001, 1006);
            objInfo = ObjectsInfo._instance.GetObjectInfoById(objId);
            //以上内容生成道具Id,然后通过道具Id获取道具Icon_name
            //以下通过Resources.Load(path),对Resources文件夹对应名字的资源进行存入内存
            string path = objInfo.icon_name;
            print(objInfo.Incn_name);
            sprite = Resources.Load<Sprite>(path);
            mObject.sprite = sprite;

        }
    }
}

运行后出现错误:

除了最后一个道具信息的图片能被正确读取出来使用,其他道具的图片信息均读不出来。

可是Unity反馈的icon_name与资源文件夹的对应文件名字相同。

设定只更改icon_potion3来进行测试问题

//只能生成Id1003的物品,即对应的物品图片名称为 icon-potion3
objId = Random.Range(1003, 1004);
objInfo = ObjectsInfo._instance.GetObjectInfoById(objId);
string s = "icon-potion3";
string path = objInfo.icon_name;
print("s:" + s);
print("path:"+objInfo.icon_name);
print(s.Equals(path));

通过比较字符串,发现如下问题:

在Console显示的s 和 path 是一样的字符串,可是比较出来的结果为false

然后根据对汇编的回想,,发现可能就出现在对换行符分割的时候出了问题:

Split('\n');

通过Vs 附加到Unity 

在局部变量里面发现 path 字符串实际内容是"icon-potion3\r"

由此发现我们分割脚本的时候,除了最后一个(最后一个不需要对换行符分割)icon_name外,

存储的字符串内容都多出了一个\r 回车符

解决方法:

既然发现问题,解决方法显然。

并且多种。

最直接的方法 改成Split('\r');

猜你喜欢

转载自blog.csdn.net/Terrell21/article/details/81348341
今日推荐