您的位置:首页 > 移动开发 > Unity3D

Unity3d 学习与应用之 DEBUG

2014-11-26 17:58 134 查看
程序不会犯错,人却经常犯错。

  程序错误(英语:Bug),在程序设计中的术语,是指在软件运行中因为程序本身有错误而造成的功能不正常、死机、数据丢失、非正常中断等现象。

  早期的计算机由于体积非常庞大,有些小虫子可能会钻入机器内部,造成计算机工作失灵。史上的第一个隐错是因为一只飞蛾意外飞入一台电脑内部而引起的故障(如图所示),因此用“Bug”(原意为“虫子”)来称隐错。

  一些有趣的隐错有时也会成为一种乐趣。在电脑游戏中,假如一些隐错不令游戏出现大错误的话,经常会变成一种玩游戏时的秘技(秘技有时是游戏设计人故意造成的)。

  Bug能解决,称之Fix。

  Bug不能解决,但能避开问题的替代方法,称之Workaround。

  Severity是Bug造成的严重性。

  Debug指解决Bug的过程(排错)。

  ——维基百科

  用我同事金老师常说的话来说就是有Bug?踹一脚。

  最简单的纠错方法 MonoBehaviour.print(object);

  官方教程中用来输出hello world就是用的这个函数。简单易用,只要把数输出到控制台就能跟踪到变化,找出错误的步骤。debug信息后面还会跟上出错的脚本和调用过程。

  实际上这个函数就是Debug.Log函数。专门用来输出信息的。跟这个函数类似的还有LogWorning和LogError函数,可以用不同的颜色来表明信息的重要程度。比如一个函数的输入值不应该为0,因为它要作为除数。如果你自己用估计不会出错,但是合作开发时这个函数可能会被你的同事或客户调用,那你就应该进行响应的检查并在输入值为0时用LogError提示这个错误,方便他们改正。LogWorning我通常会用在不是错误的输入,但不应该出现这个值的情况,比如计算飞机飞行距离,但是飞机的输入飞行速度是0,这显然是忘记赋值了。有时候我更新了一个函数的签名,也会在旧函数上加上worning让别人记得调用新函数。大部分人都懒得看更新日志:p。Log系列还有一个用法
Debug.Log(object message,unityEngine.Object
context), 后面那个 context可以填上出错的物体, 如果有多个物体有这个脚本而其中一个出错了,可以用这个在hierarchy面板里高亮出来。

  还有一个函数我也很常用,Debug.DrawLine(Vector3 from, Vector3 to, Color color=Color.white)。这个函数可以在scenes场景里画出一条两点之间指定颜色的线,最早我用来学习和研究Vector3和Quaternion类里面函数的作用,后来主要用来验证一些距离或旋转的运行结果,以及Raycast函数的返回值。

  Debug.Break()也很有用,当某些错误发生时可以用这个函数从运行状态下暂停,方便在场景中研究错误的原因, 比如因为物理碰撞计算造成的穿插等,很可能只有一帧会出现,用这个暂停就能观察到。其他Debug.DrawRay就很少用了。

  用过VS的都喜欢里面的设断点功能,可以跟踪数值的变化。在unity项目中,需要用软件自带的MonoDevelop才可以实现这个功能。不过我一次都没有用过,因为这个功能使用过程太繁琐了,需要额外编译。(顺便说下我还是在用那个笔记本差不多的UniSciTE)跟我接下来说的技巧比起来,简直就是渣。

  没错,就是GUILayout。Unity的GUI类作为界面工具来讲,简直烂暴了。不过作为Debug工具却相当好用(囧)。只要把相关的便利写成全局的然后在OnGUI里用GUILayout。Label打印就好了,自动排列,一次可以显示好多。 可以通过GUILayout.BeginArea(Rect) GUILayout.Space()
GUILayout.BeginVirtical()等排版比对。步进的话,暂停然后用unity的下一帧功能就好了......灵活高效,vs mono 什么的统统可以扔掉了。

  最后,就是踹一脚这个必杀技了^_^。

  Debug终极必杀技之 try...catch。 以前不知道,直到有同事调用我的函数却没有try才发现原来直接throw的异常unity会自动用Debug.LogError进行处理。so, 从此以后我的代码几乎到处都是throw,自带跳出和打印,方便快捷不用管函数返回类型什么的,真是居家旅行,杀人...错了
debug必备的神器。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: