[Unity]各种Debug方法笔记

无论是萌新还是Dalao,遇到Bug总是难免的(拒绝反驳)
所以一些好的Debug方法就显得尤为重要
这篇文章既写给自己,也给看到文章的大家一个参考
内容主(quan)要(bu)是脚本的Debug方法

ps:如有出错漏记得以我能看到的方式指出www


Inspector

好像不只是一个Debug方法

首先(我)用的频率最高的东西,毫无疑问是Unity
的Inspector
[Unity]各种Debug方法笔记_第1张图片

可以看到有很多组件,因为这个是我拿来测试各种功能的GameObject
在上面可以查看到很多组件的公开字段
比如我在Tester里面加上:

public float testNumber = 0.1f;

保存 切回Unity就可以看到:
public的float
注意到了吗?首字母大写之外,第二个单词Number因为我首字母N大写了,所以Unity自动划成两个单词了
初始值也显示了出来。
除了能够在运行时显示、修改之外,编译出来的场景中也会使用你在Inspector里写的值

然而有人可能会说,这是我的一个私有变量,又想通过Inspector的方式修改、保存怎么办?
一般来讲可以:

[SerializeField] private float testNumber = 0.1f;

在你想要显示的变量前面加上[SerializeField]就可以强制Unity在Inspector显示它。
然而某些情况下甚至连代码都不想改,怎么办呢?
这里就要用到Inspector的黑科技了
[Unity]各种Debug方法笔记_第2张图片
可以看到Inspector里面立马多出了一大堆东西

比如我的Tester里面就有:
Tester
Instance ID:不知道是什么
Local Identfier In File:好像跟.meta有关?
Script:就是我的脚本了
Test Number:这个是我在Tester里面写的一个私有变量,也被显示出来了。但是灰色表明处于无法编辑的状态

再来看看左上角的这个橙色的球球,不知道你们有没有点开看过呢?
[Unity]各种Debug方法笔记_第3张图片

一开始我根本不知道这个花里花俏的是什么鬼玩意儿,直到我随便点了一个,看到了:
[Unity]各种Debug方法笔记_第4张图片
Amazing!这样我就能够在场景中准确找到连模型都没有的物体了!岂不美哉?
各位看官没事随便点点,总有一个适合你的图标///

这是我目前能找到的全部Inspector的神奇用法了

UnityEngine.Debug

这里的「Debug」是名词 大概吧

接下来看看代码部分的方法
先科普一下

if (Input.GetKeyDown(KeyCode.T))
{
    //这一段能检测是否按下了T键
}

然后捧出神器:
Debug类
这个怎么用呢?还是用Update来演示吧

private void Update()
{
    if (Input.GetKeyDown(KeyCode.T))
    {
        //这一段能检测是否按下了T键
        Debug.Log("你按下了T键.");
    }
}

运行一下可以看到:
[Unity]各种Debug方法笔记_第5张图片
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键.");
    }
}

再试一次可以看到:
[Unity]各种Debug方法笔记_第6张图片
仔细看下面的信息:

你按下了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的。。。");
    }
}

这三个的区别很明显,就不多说了
[Unity]各种Debug方法笔记_第7张图片

顺便再提提上面几个按钮的用处
[Unity]各种Debug方法笔记_第8张图片

ps:善用Debug.Log()系列能带来很多意想不到的结果呢www

UnityEngine.Debug:可视化调试

除了能输出Log信息之外,Debug这个类还允许你:
在场景上画一条线

private void Update()
{
    //对 我就是喜欢在Update测试
    //注意这里是GetKey(),意思是键盘保持按下的状态就会返回true
    if (Input.GetKey(KeyCode.T))
    {
        //a,b是两个向量
        Debug.DrawLine(a, b, Color.blue, 1f, false);
    }
}

DrawLine:顾名思义,画线

第一、二个参数(a,b)分别是起点、终点
第三个参数(Color.blue)是颜色
第四个参数(1f)是画出来的线停留的时间
第五个参数(false)为true代表会被物体遮挡,false代表不会(默认好像是false)
可以在Scene看到这条蓝色的线
[Unity]各种Debug方法笔记_第9张图片
类似的还有:

Debug.DrawRay(a, b, Color.red, 1f);

要注意的是,这里的第二个参数不是坐标,而是带长度的方向
或者说,以起始点为原点的终点坐标
所以其实是DrawLine的另一种形式,并不是数学意义上的射线
[Unity]各种Debug方法笔记_第10张图片

这个图里的红色线就是DrawRay画出来的线,b=(10,0,0)

杂项

自己鼓捣出来的不知道什么鬼玩意儿

由于使用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)




今天就写到这里了,希望大家都能有所收获哈

你可能感兴趣的:([Unity]各种Debug方法笔记)