怎样在Unity里面进行代码的查错

本文详细介绍了在Unity中编写代码时可能出现的两种错误类型:编译错误和逻辑错误,并提供了排查这些错误的有效方法,包括使用断点和打印输出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

继续讲一下在Unity写代码的查错问题,面对新手,老鸟请自动跳过。
对于程序基础比较薄弱的部分Unity使用者,经常会遇到某个项目不能运行,或者运行的时候没有出现自己想要得到的结果。这时候,很有可能是项目里面的代码报错了,或者代码写错了。代码报错的最直接表现是有错误打印,一般在Unity窗口最下面会出现错误打印,不过只会出现一行,我们可以打开Unity的打印输出窗口来确定有没有报错。
这里写图片描述
从Window标签页下面打开Console,就可以打开输出窗口:
比如这样的:
这里写图片描述
Console窗口也有一些操作的选项,比如左边有几个选项:
Clear:点击一下,可以把现有的所有打印清除掉
Collapse:可以把同一个地方输出的打印折叠起来,同类型打印只显示一条
Clear on Play:在每次运行项目的时候清除上一次输出的打印
Error Pause:当出现error级别的错误打印时,项目会暂停运行。

右边也有三个小按钮,一个是白色的气泡图标,一个是黄色的三角形图标,一个是红色的气泡图标,后面还跟着数字。
这三个按钮分别对应Unity的三个打印级别:Log、Warning和Error。后面的数字是该类型的打印的条数。如果想隐藏某个级别的打印,可以在这里操作。

介绍完打印输出窗口之后,接下来就说一下代码发生错误的2种类型。第一种,是编译错误。第二种是运行错误
1、编译错误:
这是指项目内的代码存在语法错误,导致了在编译的时候编不过。
这里写图片描述
很多新手可能都会问过别人,上图出现的提示是什么意思?为什么自己的项目不能运行?
这里所表达的意思,就是你的代码里面有编译级别的错误,需要先把报错的地方解决掉了,才能继续运行。
这时候我们需要打开Console窗口去看看究竟是哪里的代码写错了:
这里写图片描述
这里很清楚的说明了错误出现在哪一个类的哪一行,比如上面这个例子就是出现在DebugTest类的第9行。
这里写图片描述
我这样写代码,没用声明变量param1,就直接使用了,那么代码在编译的时候找不到param1的声明,所以报错了。只需要改成int param1 = 1+2;就不会报错了。编译级别的报错还有可能是因为你少打了个分号、少输入了一个括号之类导致的,所以需要小心。

另外一种错误,是逻辑错误,也就是运行时才会出现的错误。
比如我这样写代码:
这里写图片描述
然后编译通过了,但在运行时报错了:
这里写图片描述
我这个报错是特意模拟了跨越了很多个方法调用的报错,所以报错的时候会出现堆栈,显示出报错的方法调用的每一个过程,报错堆栈如红色箭头所示,是从下到上的。

上面已经说出了错误出现的2种常见的情况,针对于编译错误,其实很好查了,还没运行的时候就出现,哪里错了就查哪里的代码来修改。不好查的一般是逻辑错误。我们需要在运行的时候,知道某个方法在调用的时候的变量变化情况、输入输出的参数有没有异常之类的,才能定位到问题出在哪里。

这时候一般就有2种方法去查错,第一种是程序断点,另外一种是加打印输出。
怎样在Unity里断点查问题,我在2013年的时候已经写过文章说明了,过程大同小异,也就不再重复,可以跳转来看看:
http://liweizhaolili.blog.163.com/blog/static/162307442013214485190/
需要说的是,很多朋友不知道什么是断点,这一点很重要。在可以断点的环境下,断点是查问题最快的手段,是程序员最基本的技能之一。断点具体的含义可以自行百度一下,我简单的概括就是,可以在你写代码的地方的某一行点一下,然后程序运行到那一行的时候,自动停下来,让你去看看当前程序运行时,每个参数的具体的值是什么。然后你可以逐行代码继续往下运行,继续观察变量改变的情况,最后定位到出问题的地方。

能断点是一件很幸福的时候,但某些时候是不能断点的,比如你发布了release版本的安装包之后,你就不能再连接编辑器去断点了,或者写lua脚本的时候虽然也能通过一些特别的方法去断点,但我还是觉得麻烦于是也习惯用打印来定位问题。
刚才说过,Unity有三种打印级别,在代码里面可以主动的进行打印:
这里写图片描述
比如我这样写,得出的结果是:
这里写图片描述
Unity就会根据我指定的打印级别,把内容打印出来了。

有些情况下,由于打印的数量很多,你会发现没有办法很容易的找到你想打印的内容。这里我推荐一个插件,叫做ConsolsE。
这里写图片描述
这个插件的界面和一般的Console界面类似,不过多了一个过滤框,然后右边三种打印类型的最大数量不再是999+,而是实际打印的条数。

当我想查看某个关键字的打印内容时,我就可以在过滤框里面输入:
这里写图片描述

这里写图片描述
这时候,显示的内容就只会是包含我输入的关键字的打印结果了。

说了这么长,其实内容很少,总结一下,出现代码错误有2种情况,第一种是编译错误,第二种是逻辑错误。编译错误哪里报错改哪里,逻辑报错有2种查错手段,断点和打印。

### Unity 中实现漫游系统的自动寻路功能 #### 使用 NavMesh 系统构建基础环境 在 Unity 开发环境中,要实现场景内的自动寻路功能,通常会依赖于引擎自带的 Navigation System 或者第三方插件。对于初学者来说,推荐先掌握官方提供的 NavMesh 工具集[^1]。 - **设置导航网格**:首先,在编辑器中选择 `Window` -> `AI` -> `Navigation` 打开导航窗口。接着,标记出哪些对象是可以行走的地表(Walkable Area),这些区域会被烘焙成 navmesh 数据用于后续路径规划。 - **配置代理物体**:为需要执行移动逻辑的游戏对象添加 Character Controller 组件以及 Nav Mesh Agent 组件。前者负责处理碰撞检测;后者则是与 navmesh 进行交互的关键组件,它能够接收目的地坐标并据此调整角色位置[^3]。 ```csharp using UnityEngine; using UnityEngine.AI; public class SimpleMover : MonoBehaviour { private NavMeshAgent agent; void Start() { agent = GetComponent<NavMeshAgent>(); // 设置初始目标点 Vector3 targetPosition = new Vector3(0f, 0f, 10f); SetDestination(targetPosition); } public void SetDestination(Vector3 destination){ if (agent != null && NavMesh.SamplePosition(destination, out var hit, 2.0f, NavMesh.AllAreas)){ agent.SetDestination(hit.position); } } } ``` 此段代码展示了如何初始化一个简单的控制器类,并为其指定前往的目标地点。注意这里使用了 `NavMesh.SamplePosition()` 方法确保所选的目的地确实位于有效的可通行区域内。 #### 提升性能与灵活性 当面对更复杂的需求时,如多人在线游戏中的实时路径查询或是动态障碍物规避等问题,则可能要考虑引入更为高效的解决方案。例如 A* Pathfinding Project 就是一个广受好评的选择,该库不仅提供了丰富的特性支持,还允许开发者自定义算法参数以适应特定应用场景的要求[^4]。 通过上述介绍可以看出,无论是采用内置工具还是外部扩展包,都能有效地帮助开发者快速搭建起具备基本功能性的漫游系统框架。随着经验积累和技术进步,还可以进一步探索更多高级特性和优化手段来增强用户体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值