Unity Bug解决分析思路

前言

一般来说,新手遇到bug会很苦恼,而且打击自己的学习积极性。我在看完一套学习视频后,自己关掉,然后看自己能不能完完全全的再写出来,并且尽力让他趋于完美。其实这样的话,我相当于把代码写了两遍,看视频的时候跟着敲了一遍,自己又写了一遍。虽然苦,但是乐在其中

异常分类

  • 我将异常分为四种
  1. 在控制台上双击可以定位的异常
    • 这种异常也许是由于上下文引起的
    • 也有可能属于蝴蝶效应,间接引发的
  2. 无法定位的异常
    • 用二分法进行注释,然后排查是哪句话出现的错误,结合错误类型进行定位
  3. 没有任何报错,但就是实现不了想要的功能
    • 首先将功能所涉及的函数全部Log,查看是否全部执行
    • 将函数中所涉及的关键变量Log出来,查看其变化
    • 根据变量所显现出来的问题,进一步锁定出现问题的代码
    • 然后将代码打上断点,运行此处,查看变量的情况。做到这一步基本就可以解决问题了
  4. 逻辑错误
    • 这种错误最低级也最致命,没有解决办法,只能多思考
下面的异常我将按照不同种类给予不同的标志数字
1-空引用异常
  • 当时我对代码进行了重构,该删的删,该加的加,该移的移动
  • 当我运行的时候 ,果然出现了很多bug
  • 最常出现的是空引用异常
  • 双击定位到代码位置,打上断点,开始调试,然后查看这个语句的所有变量值,看哪个为null
  • 或者在语句的上面Log输出每一个变量值,查看哪一个为空
  • 结果是我定义了一个集合,错误的把初始化语句给删除了,所以为空
1-2 物品显示与隐藏异常
  • 这个出现的空引用异常是最匪夷所思的,但是明白原理之后发现情有可原
  • unity 是无法搜索被隐藏的对象的
  • 父对象由于切换功能的需要,在一开始实例化出来后就要全部禁用,这样的话它的子对象在查找自身或者子对象就会报错空引用
  • 代码如下:
     GameObject tempCenter = GameObject.Instantiate<GameObject>(myView.Center, myView.CenterParent);
        CenterController tempS = tempCenter.GetComponent<CenterController>();
        //进行数据传输
        tempS.InitData(mapId, myView.CenterSlot, myModel.GetCenterItem(mapId), myModel.GetMapNum(mapId), myView.CenterItemDic);
        //加入字典当中
        centerDic.Add(mapId, tempS);
        tempCenter.SetActive(false); //禁用语句
  • 这个异常并没有很复杂,关键是要知道有这么一个bug,并且怎么解决
  • 我在解决的时候,就在想要把SetActive(false)放在哪里
    • 我认为禁用语句属于自身控制语句,应该放置在它自己的脚本里,就放置在了Awake语句中,结果明显不行
    • 我又想,干脆在子对象的初始化语句后面加上启用语句,结果还是不行
2- 1KeyNotFound 异常
  • 这个异常几乎耗了我一个上午
  • 依然是重构完的事情,这个异常双击之后无法定位。所以我就很烦恼,到底是哪里出了问题
  • 在控制台下面,有关于这个语句的详细分析,是在哪个脚本里面
  • 我将在start里面执行的函数一一注释,最后确定问题是在哪个函数里面
  • 然后将函数里面的语句根据功能进行注释,然后运行,最后将问题锁定到其中一个语句上面
  • 最后发现,我将Model层的字典直接以属性的形式返回出来,在获取value的时候,没有进行key检查
  • 原因是,我以前一直将字典封装,根据key返回value,用tryGetValue方法,可以返回null,如果key不存在。所以没有在意这个问题
3 异常
  • 实时物品检测功能
  • 这个异常是我代码都全部写好了,控制台也没有报错,但没有实现我的功能。
  • 这种异常是最棘手的。
函数之间的关系
  • 函数之间有这么几种关系
  • A调用B
  • A调用上层B
  • A调用下层B
  • 单例模式之间的调用
注意事项
  • 在脚本内写新的功能代码的时候,每写完一个函数,需要对自身的输出进行Debug测试,是否输出自己想要的数据
  • 如果以上那几种函数调用关系,调用函数的签名确定以后,先在函数里面进行Debug,传递的参数是否正常,符合预期,函数是否运行到这里,
    • 每写一句代码都要思考,如果不这样的话会怎么样?
    • 例如SendMessaagesUp,我在子对象的方法构建完毕后,进行了测试,因为这时候父对象的方法还没有构思,因此里面的sendMessageUp没有测试,在后面的时候发现传递过去的参数不符合预期
感言
  • 良好的代码书写习惯很重要,可以避免浪费很多时间
  • 学习过程中需要适时的总结归纳
  • 以前在学校上课,这个过程被老师替代了,自学的话就需要自己来做
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值