通过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');