MargaretChen
记录一个打包bug

记录一个打包bug

前言

一开始这个项目是准备build在ios设备上的,当我进行测试的时候我以为是ios打包的时候出的问题,所以准备晚一点再解决这个问题。由于制作网络模块需要多个exe同时运行,我必须要build出来测试,所以我将这个项目build在windows平台上,没想到也发生了一样的bug, 我才意识到是代码的问题,此篇文章详细记录了Debug过程。

  • 错误一: 如下图所示,当我打开背包,并未拖拽背包内Item时,就出现了拖拽时候才应该被SetActive的UI

Untitled

  • 错误二: 如下图所示, 可见构建后的exe程序中,胶囊浮动的射线检测出现了问题

Untitled

查看Unity生成exe的Debug信息

在看遍了Google所有和构建, 射线失效相关文章无果后,意识到应该是自己写的代码问题

参考链接

打开windows系统中的AppData文件,此文件默认隐藏,需要在资源管理器显示隐藏的项目

Untitled

Appdata-LocalLow-DefaultCompany-UnityDemo-Player.txt文件为exe的调试信息

Untitled

Untitled

其中DefaultCompany和UnityDemo为UnityEditor中用户设定的

可以在Project Setting-Player中设定

Untitled

打开后可以看到和Editor Console中类似的输出信息

解决问题一

经过一番调试,最终定位到这句语句

1
item = GetComponentInChildren<UIInventoryItem>();

根据Unity官方文档,至今也没有思考出来为什么编辑器模式下正常, build成exe就报错

Untitled

修改如下后正常运行

1
item = transform.find("Item").GetComponent<UIInventoryItem>();

解决问题二

根据exe的输出信息定位到FloatCapsule() , 起初一直认为是射线检测的问题,经过一番调试后(一个参数一个参数判断是否为null), 定位到 ColliderUtility.CapsuleColliderData.Collider.bounds.center

Untitled

最后发现是由于 OnValidate() 函数只在Editor中执行, 修改到 Awake() 中解决此问题

Untitled

Untitled

为什么会在代码中用到这个函数呢?

我的浮动胶囊参考了这个视频教程

作者当时使用这个函数可能是为了测试过实际高度后,把高度记录下来,后续直接使用测试出来的数值,所以就放在OnValidate()中。但是我希望这个脚本文件可以适应不同的角色模型,所以我选择把他放在OnAwake()中,仅在游戏开始的时候计算一次。以后使用OnVlidate() 需要加FIXME,提醒自己打包前写成固定值!

Author:MargaretChen
Link:http://margaret-chen217.github.io/2023/07/29/记录一个打包bug/
版权声明:本文采用 CC BY-NC-SA 3.0 CN 协议进行许可