本帖最后由 复读机读复读机 于 2023-8-29 14:37 编辑
这篇着重于讲关于类型检测报错,若出现函数变更以及UI重名或预制体内脚本报错导致的报错可以看看
类型检测报错
口袋方舟v0.26上增加了更严格的类型检测,目的是防止类型安全性问题,提高代码的可靠性和稳定性。
实际上在编写代码时,尤其是在进行业务逻辑的设计和实现时,应该尽量确保所有变量或对象的类型是确定的。这就需要每个变量都应该明确地声明为特定的数据类型。
通过指定变量的数据类型,可以让一起协作开发的搭档以及编译器获得更多变量的信息,包括变量可以存储哪些值?可用的操作?以及如何与其他变量交互等。这样可以减少潜在的错误,并提高代码的清晰度和稳定性。
所以在更新引擎版本之后,会出现一些由于类型不明确而出现的报错,具体情况有以下几种:
使用了类对象未定义的属性
在脚本中引用了对象的某个属性,但是这个属性不确定是否存在,在编译的时候就会导致报错,报错显示如图:
进入脚本中,可以看到在代码中引用了skinConfig中的fly属性,skinConfig由上方的或关系中得到,需要或关系中的每个结果都存在fly属性,skinConfig.fly才能正常运行:
进入SkinConfig类中发现,在default下不存在此属性,从而导致了前面的报错:
解决方案:
需要在类中加入引用的属性,可以用布尔值实现区分有无此属性
修改前如图:
修改后如图:
变量类型不明确时进行比较操作
在声明动态获取的变量时TS会将该值设为安全类型unknown。此时若进行比较运算则会导致报错,报错提示如下:
进入脚本,报错显示如图,无法将unknow类型与number类型做比较操作:
解决方案:
需要在做比较运算时明确变量的类型,在代码中有几种方式可以实现,例如:
报错的代码如图:
解决方案1:在比较操作前加入类型断言。修改后的代码如图:
解决方案2:在声明变量时定义好类型。修改后的代码如图:
解决方案3:使用“as”关键字转换变量类型。修改后的代码如图:
curStage as number;//curStage为后面用做对比的变量名
函数返回值的类型不明确
当函数返回值的类型不明确,并且使用返回值进行比较操作时会提示报错,报错信息如图:
进入脚本,报错位置显示函数返回值有number与boolean两种类型:
由于返回值有number和boolean两种,boolean无法与number进行比较操作从而导致报错
解决方法:需要确定函数返回值的类型,可以用以下几种方法
解决方法1:在函数声明时即确定好返回值的类型。在新声明函数时可以尝试确定返回值类型,这样能让代码扽可读性更强并且功能更稳定。但如果是改动现有代码的话可能会影响功能,可以使用方法2更改现有代码。
修改前GetTimeLeft函数如图:
修改后如图:
解决方法2:将函数返回值先定义变量保存,将保存的变量用上面的方法明确类型后,再进行比较操作
修改前如图:
修改后如图:
Gameplay成员报错
Gameplay的一部份成员与GameObject功能类似。为了方便大家的代码管理,现在将Gameplay.Prefab等成员统一为Gameplay.Gameobject。
在升级到v0.26时会出现命名空间Gameplay下找不到成员的情况,报错如图:
进入脚本,报错显示Gameplay命名空间下没有XXX,图中情况就是在命名空间下没有Prefab这个类:
解决方案:
用Gameplay.GameObject替换一系列报错的Gameplay.XXX
Gameplay.GameObject //将一系列报错的Gameplay.XXX直接替换为Gameplay.GameObject
修改前如图:
修改后如图:
其他需要替换的代码块
有些代码块现在编辑器里已经有了新方法可以替代了,可以选择性替换。
将(puerts.argv.getByName("Proxy") as any).ProjectDir.indexOf(":") < 0 替换为 SystemUtil.isMobile()
SystemUtil.isMobile()
替换后如图:
|