无论是萌新还是Dalao,遇到Bug总是难免的(拒绝反驳)
所以一些好的Debug方法就显得尤为重要
这篇文章既写给自己,也给看到文章的大家一个参考
内容主(quan)要(bu)是脚本的Debug方法
首先(我)用的频率最高的东西,毫无疑问是Unity
的Inspector
可以看到有很多组件,因为这个是我拿来测试各种功能的GameObject
在上面可以查看到很多组件的公开字段
比如我在Tester里面加上:
public float testNumber = 0.1f;
保存 切回Unity就可以看到:
注意到了吗?首字母大写之外,第二个单词Number因为我首字母N大写了,所以Unity自动划成两个单词了
初始值也显示了出来。
除了能够在运行时显示、修改之外,编译出来的场景中也会使用你在Inspector里写的值
然而有人可能会说,这是我的一个私有变量,又想通过Inspector的方式修改、保存怎么办?
一般来讲可以:
[SerializeField] private float testNumber = 0.1f;
在你想要显示的变量前面加上[SerializeField]就可以强制Unity在Inspector显示它。
然而某些情况下甚至连代码都不想改,怎么办呢?
这里就要用到Inspector的黑科技了
可以看到Inspector里面立马多出了一大堆东西
比如我的Tester里面就有:
Instance ID:不知道是什么
Local Identfier In File:好像跟.meta有关?
Script:就是我的脚本了
Test Number:这个是我在Tester里面写的一个私有变量,也被显示出来了。但是灰色表明处于无法编辑的状态
再来看看左上角的这个橙色的球球,不知道你们有没有点开看过呢?
一开始我根本不知道这个花里花俏的是什么鬼玩意儿,直到我随便点了一个,看到了:
Amazing!这样我就能够在场景中准确找到连模型都没有的物体了!岂不美哉?
各位看官没事随便点点,总有一个适合你的图标///
这是我目前能找到的全部Inspector的神奇用法了
接下来看看代码部分的方法
先科普一下
if (Input.GetKeyDown(KeyCode.T))
{
//这一段能检测是否按下了T键
}
然后捧出神器:
Debug类
这个怎么用呢?还是用Update来演示吧
private void Update()
{
if (Input.GetKeyDown(KeyCode.T))
{
//这一段能检测是否按下了T键
Debug.Log("你按下了T键.");
}
}
运行一下可以看到:
1、按下T键之后,屏幕左下角显示了一条我写的文字
2、点击这个文字发现有一个弹窗(Console)
3、我按了30次T,右边也计数30次了
然而Debug的神奇之处还不止这个
再来看看这一堆代码:
private void Update()
{
//把刚刚的代码剪切到ABC里面了
ABC();
}
private void ABC()
{
if (Input.GetKeyDown(KeyCode.T))
{
//这一段能检测是否按下了T键
Debug.Log("你按下了T键.");
}
}
你按下了T键.======这一行不用解释
UnityEngine.Debug:Log(Object)======表示调用了Log
Tester:ABC() (at Assets/Scipts/Tester.cs:22)======调用了ABC(),在Tester的第22行
Tester:Update() (at Assets/Scipts/Tester.cs:14)======Update()中调用了ABC()(第14行)
也就是说,Debug甚至能告诉你从哪个函数调用到哪个函数,在哪一行使用了Log
现在再来试试别的:
private void Update()
{
SaySomeThing();
}
private void SaySomeThing()
{
if (Input.GetKeyDown(KeyCode.T))
{
//这一段能检测是否按下了T键
Debug.Log("你按下了T键.");
Debug.LogWarning("你竟然按下了T键!");
Debug.LogError("你本不该按下T的。。。");
}
}
除了能输出Log信息之外,Debug这个类还允许你:
在场景上画一条线
private void Update()
{
//对 我就是喜欢在Update测试
//注意这里是GetKey(),意思是键盘保持按下的状态就会返回true
if (Input.GetKey(KeyCode.T))
{
//a,b是两个向量
Debug.DrawLine(a, b, Color.blue, 1f, false);
}
}
第一、二个参数(a,b)分别是起点、终点
第三个参数(Color.blue)是颜色
第四个参数(1f)是画出来的线停留的时间
第五个参数(false)为true代表会被物体遮挡,false代表不会(默认好像是false)
可以在Scene看到这条蓝色的线
类似的还有:
Debug.DrawRay(a, b, Color.red, 1f);
要注意的是,这里的第二个参数不是坐标,而是带长度的方向
或者说,以起始点为原点的终点坐标
所以其实是DrawLine的另一种形式,并不是数学意义上的射线
由于使用Unity的时间并不长,C#也是接触Unity才开始用的,至今也就研究出了一个方法
首先不知道访问器是啥的同学先去看一下这个
在某些情况下
你可能需要监测一个变量
但是……
某个类里有一个float number
可是有十几行都调用了它啊!我总不能每一行都加一个Debug.Log()吧!总不能修好之后又十几行地去掉吧!
于是我这样写:
private float _number;//加一个变量
private float number
{
get
{
Debug.Log("number被读了"); //读取打个log
return _number;
}set
{
Debug.Log("number被写了");//写入打个log
_number = value;
}
}
是不是很机智!这样改的话,我不用改后面的代码,因为访问器的调用和变量的调用是一模一样的,却能实现每一次读/写都能Log一次!而且Debug结束之后可以把Debug用的代码全部删掉,留下
private float number;
就可以保证代码正常运行了
妙哇 (p≧ V ≦q)
今天就写到这里了,希望大家都能有所收获哈