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

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


Inspector

好像不只是一个Debug方法

首先(我)用的频率最高的东西,毫无疑问是Unity

的Inspector

unity 调试无法进入断点symbol unity怎么debug_调试

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

public float testNumber = 0.1f;

保存 切回Unity就可以看到:

unity 调试无法进入断点symbol unity怎么debug_调试_02


注意到了吗?首字母大写之外,第二个单词Number因为我首字母N大写了,所以Unity自动划成两个单词了

初始值也显示了出来。

除了能够在运行时显示、修改之外,编译出来的场景中也会使用你在Inspector里写的值

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

[SerializeField] private float testNumber = 0.1f;

在你想要显示的变量前面加上[SerializeField]就可以强制Unity在Inspector显示它。

然而某些情况下甚至连代码都不想改,怎么办呢?

这里就要用到Inspector的黑科技了

Inspector->Debug


可以看到Inspector里面立马多出了一大堆东西比如我的Tester里面就有:

unity 调试无法进入断点symbol unity怎么debug_脚本_04


Instance ID:不知道是什么

Local Identfier In File:好像跟.meta有关?

Script:就是我的脚本了

Test Number:这个是我在Tester里面写的一个私有变量,也被显示出来了。但是灰色表明处于无法编辑的状态再来看看左上角的这个橙色的球球,不知道你们有没有点开看过呢?

unity 调试无法进入断点symbol unity怎么debug_ci_05

一开始我根本不知道这个花里花俏的是什么鬼玩意儿,直到我随便点了一个,看到了:

unity 调试无法进入断点symbol unity怎么debug_私有变量_06


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 调试无法进入断点symbol unity怎么debug_unity_07


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 调试无法进入断点symbol unity怎么debug_unity_08


仔细看下面的信息:

你按下了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 调试无法进入断点symbol unity怎么debug_私有变量_09

顺便再提提上面几个按钮的用处

unity 调试无法进入断点symbol unity怎么debug_unity_10

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 调试无法进入断点symbol unity怎么debug_调试_11


类似的还有:

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

要注意的是,这里的第二个参数不是坐标,而是带长度的方向

或者说,以起始点为原点的终点坐标

所以其实是DrawLine的另一种形式,并不是数学意义上的射线

unity 调试无法进入断点symbol unity怎么debug_脚本_12

这个图里的红色线就是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)




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