Unity - A计划(一年有效期) 扫二维码继续学习 二维码时效为半小时

(61评价)
价格: 2208.00元
关于《黑黯之光》物品信息管理类的报错
杨与争发起了问答2018-05-21
4
回复
804
浏览

把物品信息以及id存入字典并输出,然后报错了:

FormatException: Input string was not in the correct format
System.Int32.Parse (System.String s) (at /Users/builduser/buildslave/mono/build/mcs/class/corlib/System/Int32.cs:629)
ObjectsInfo.ReadInfo () (at Assets/Scripts/Custom/ObjectsInfo.cs:37)
ObjectsInfo.Awake () (at Assets/Scripts/Custom/ObjectsInfo.cs:15)

看字面意思是输入字符串的格式有问题,可是我找了很久都没发现是哪里的问题。

这是我完整的的代码

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

public class ObjectsInfo : MonoBehaviour
{
    public static ObjectsInfo _instance;
    public TextAsset objectsList;
    private Dictionary<int, ObjectInfo> objectInfoDict = new Dictionary<int, ObjectInfo>();//创建一个字典


    void Awake()
    {
        _instance = this;//单例模式
        ReadInfo();
        print(objectInfoDict.Keys.Count);
    }

    //根据id得到信息
    public ObjectInfo GetObjectInfoById(int id)
    {
        ObjectInfo info = null;
        objectInfoDict.TryGetValue(id, out info);
        return info;
    }

    //读取信息
    void ReadInfo()
    {
        string text = objectsList.text;//取得所有文本
        string[] strArray = text.Split('\n');//根据换行符进行拆分字符串并存储在数组里
        foreach (string str in strArray)
        {
            string[] proArray = str.Split(',');//以逗号进行拆分字符串并存储在数组里
            ObjectInfo info = new ObjectInfo();

            int id = int.Parse(proArray[0]);
            string name = proArray[1];
            string icon_name = proArray[2];
            string str_type = proArray[3];
            ObjectType type = ObjectType.Drug;
            switch (str_type)
            {
                case "Drug":
                    type = ObjectType.Drug;
                    break;
                case "Equip":
                    type = ObjectType.Equip;
                    break;
                case "Mat":
                    type = ObjectType.Mat;
                    break;
            }
            info.id = id;
            info.name = name;
            info.icon_name = icon_name;
            info.type = type;
            if (type == ObjectType.Drug)
            {
                int hp = int.Parse(proArray[4]);
                int mp = int.Parse(proArray[5]);
                int price_sell = int.Parse(proArray[6]);
                int price_buy = int.Parse(proArray[7]);
                info.hp = hp;
                info.mp = mp;
                info.price_sell = price_sell;
                info.price_buy = price_buy;
            }
            objectInfoDict.Add(id, info);//添加到字典中,根据id查找物品信息
        }
    }
}
//id
//名称
//icon名称
//类型(药品Drug、装备Equip、材料Mat)
//加血量值
//加法力值
//出售价
//购买价
public enum ObjectType
{
    Drug,
    Equip,
    Mat
}

//表示一条信息的类
public class ObjectInfo
{
    public int id;
    public string name;
    public string icon_name;//存储在图集中的名字
    public ObjectType type;
    public int hp;
    public int mp;
    public int price_sell;
    public int price_buy;
}

错误提示中问题所在的15行也是Awake()方法中调用ReadInfo(),37行是int id = int.Parse(proArray[0]);

记事本里既没有多余的空格也没有中文逗号,实在是没办法了,麻烦老师帮忙看下~

所有回复
  • siki 2018-05-22

    上面提示把字符串转换为int的时候出错,可能是你的txt里面有的数据应该是整数,你却给了一个字符串导致的

    也可能是由于你的txt最后多了一个空白航导致的

    • 杨与争 2018-05-22

      哇。。我把txt改了又改,终于惊奇的发现我这个unity2017.3.1f1还不如老师那个上古视频中的版本,竟然不支持中文。。把“小瓶血药”换成英文字符就没有异常了!搞不懂这是unity的问题还是转换函数的问题

      (0) 回复
    • siki 2018-05-23

      回复 @ 杨与争: 可以吧文本修改为utf8的编码格式试下

      (0) 回复
    • 杨与争 2018-05-24

      回复 @ siki: 果然改了编码格式就好了,我的默认是ANSI。谢谢老师~

      (0) 回复
    还有-2条回复,点击查看
    你还没有登录,请先登录注册
发表回复
你还没有登录,请先 登录或 注册!