[Unity3D]关于NaN(Not a Number)的问题
关于 not number Unity3D 问题 nan
2023-09-14 08:57:46 时间
在游戏运行时,代码若写得不安全很容易出现NAN的异常。一旦NAN出现整个游戏不崩溃也坏死掉了,游戏上了则是要被直接打回来的节奏,更是一个开发及测试人员每人都要扣3000块的大BUG。
一般表现为:
1.
transform.rotation assign attempt for "XXX" is not valid. Input rotation is {NaN, NaN, NaN, NaN}.
2.
Getting an error of rigidbody.force assign attempt for 'XXX' is not valid. Input position is { NaN, NaN, NaN }
3.
transform.localEulerAngles assign attempt for 'XXX' is not valid. Input localEulerAngles is { NaN, 0.000000, -0.000000 }
反正各种各样类似了,有些还不直接报你错,间接来搞你让你找半天。
NAN就是字母意思了,NOT A NUMBER,一般是由于一个数除0造成的,所以若设计有除就要留心去确保安全。
一些简单的计算可以让人更好理解:
1 / 0 = NaN
1 + NaN = NaN
2 * NaN = NaN
可以说任何数涉及到与NaN的计算都会被直接同化,极其强悍的超能力啊!
又例如(C#):
float A = 1.0f;
float B = 2.0f;
float C = float.NaN;
float result = A * B + C;//result则被同化成NaN了,因为C是NaN。
遇到NAN也可以抛出异常再处理,当然假设你就直接知道那里肯定会有NAN的了。NaN不等于任何数字,也不等于它自身。所以你可以用NaN这个变量与自己对等判断,若返回错误则是NaN,不过这些写编译器会提示你有傻逼代码,你可以不理它。
例:X为NaN
bool b_NaN = ( X == X );
if(b_NaN)
Debug.Log("X is a number .");
else
Debug.Log("X is not a number !");
一般来说尽量避免这个NAN的出现。
在UNITY3D中,其更多可能出现在当Time.timescale为0的时候,因为游戏过程中,很多运算都直接关联Time.deltaTime这个参数,一旦Time.timescale为0,那么Time.deltaTime的数值则为0.若不小心除了它又没有发现,那么则是喜闻乐见的事情了,哈哈。
若想要实现暂停(用Time.timeScale的方式暂停)而某部分东西又可以动的话,可以考虑自己去计算一个帧时间间隔。当然这个有可能会第一帧的时间间隔特别长。所以需要你来初始化这个地方,或者直接计算丢掉大的f_DeltaTime值。
float f_LastFrameRealtime;
void Start()
{
f_LastFrameRealtime = Time.realtimeSinceStartup ;
}
void Update()
{
float f_DeltaTime = Time.realtimeSinceStartup - f_LastFrameRealtime;
f_LastFrameRealtime = Time.realtimeSinceStartup ;
}
相关文章
- Java 关于重写compareTo方法
- 关于 K8s中Kube-apiserver 的一些总结
- 田渊栋:关于GPT-4的一些感想
- 关于分布式事务的理解
- ORA-22344: can not specify CONVERT TO SUBSTITUTABLE option for ALTER TYPE other than NOT FINAL change ORACLE 报错 故障修复 远程处理
- ORA-14293: Number of partitioning columns does not match number of subpartitioning columns ORACLE 报错 故障修复 远程处理
- 关于Redis你可能不了解的一些事
- 关于BAPI_TRANSACTION_COMMIT一点说明详解编程语言
- SAP中关于物料主数据里物料类型的修改详解编程语言
- 关于Pull Request的十个建议
- 关于运维派网站6月4日凌晨出现不可访问的情况说明
- 又一次 Mindcraft 事件?关于 Linux 内核安全性的批评
- acle not inOracle IN与NOT IN的比较(oraclein和or)
- MySQL中NOT操作的使用方法与实例分析(mysql中not)
- Redis常识一知半解不妨参考一下(关于redis的常识)
- 籍Redis开发与实战利用实践去深入理解(关于redis方面的书)
- 关于使用coreseek并为其做分页的介绍
- 关于C++中的友元函数的一些总结