在游戏运行时,代码若写得不安全很容易出现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 ;
}

[Unity3D]关于NaN(Not a Number)的问题的更多相关文章

  1. NaN(Not a Number)问题

    Terminating app due to uncaught exception 'CALayerInvalidGeometry', reason: 'CALayer position contai ...

  2. 为什么 NaN 不等于自身?

    NaN 即Not a Number , 不是一个数字, 那么NaN到底是什么呢? 话说在JavaScript中,有6大数据类型,分别包括string,number,boolean,undefined, ...

  3. Python NaN

    NaN, Not a Number, 非数. 它即不是无穷大, 也不是无穷小, 而是python/numpy/... 觉得无法计算时返回的一个符号(自己的推测, 未考证(TODO)). import ...

  4. JavaScript 中 Number()、parseInt()、parseFloat()的区别

    Number(): 概述:Number 对象由 Number() 构造器创建,是经过封装的能让你处理数字值的对象.在非构造器上下文中 (如:没有 new 操作符),Number 能被用来执行类型转换. ...

  5. 常用API——Math对象型、Number型

    Math.abs(num) : 返回num的绝对值 Math.acos(num) : 返回num的反余弦值 Math.asin(num) : 返回num的反正弦值 Math.atan(num) : 返 ...

  6. 你可能不知道的 NaN 以及 underscore 1.8.3 _.isNaN 的一个 BUG

    这篇文章并不在我的 underscore 源码解读计划中,直到 @pod4g 同学回复了我的 issue(详见 https://github.com/hanzichi/underscore-analy ...

  7. Javascript学习笔记:2种其他类型转换为数字Number类型的方式

    ①使用parseInt()/parseFloat()(在ECMAScript6中是Number.parseInt()/Number.parseFloat()) console.log(parseInt ...

  8. javascript类型系统——Number数字类型

    × 目录 [1]定义 [2]整数 [3]浮点数[4]科学记数[5]数值精度[6]数值范围[7]特殊数值[8]转成数值[9]实例方法 前面的话 javascript只有一个数字类型,它在内部被表示为64 ...

  9. JS魔法堂:再识Number type

    Brief 本来只打算理解JS中0.1 + 0.2 == 0.30000000000000004的原因,但发现自己对计算机的数字表示和运算十分陌生,于是只好恶补一下.以下是恶补后的成果: 基础野:细说 ...

随机推荐

  1. [转]java中参数" ..."的用法和意思

    原文地址:https://blog.csdn.net/lycit/article/details/78809625 如这个jdbc中封装的绑定参数的方法: /** * 绑定参数 * @param ps ...

  2. HTTP 响应头信息(Http Response Header) Content-Length 和 Transfer-Encoding

    Tomcat 中响应头信息(Http Response Header) Content-Length 和 Transfer-Encoding 客户端(PC浏览器或者手机浏览器)在接受到Tomcat的响 ...

  3. 根据时间获取最新数据 SQL(每一个人或者每一项)

    -- 方法1 select a.* from table1 a from table1 b where b.name=a.name and b.gdtime>a.gdtime) -- 方法2 s ...

  4. 微信中关闭网页输入内容时的安全提示 [干掉 “防盗号或诈骗,请不要输入QQ密码”]

    未设置之前: 需要把域名加入白名单 设置方法:微信公共平台后台-->公众号设置--->功能设置--->填写业务域名即可.

  5. Sword protobuf学习三

    #include <iostream> #include <sys/types.h> /* See NOTES */ #include <sys/socket.h> ...

  6. 摄像头驱动OV7725学习笔记连载(二):0V7725 SCCB时序的实现之寄存器配置

    上一篇博客主要介绍了OV7725的电气特性以及SCCB接口的时序和输出一帧图像的时序图以及数据的拼接.输出一帧图像与输出时钟PCLK有关. 上图是OV7725实现的整体框架,有点丑.FPGA描述SCC ...

  7. html传值及接收传值

    传值:url?para1=value1&para2=value2 接收传值: <script type="text/javascript"> function ...

  8. 关于Unity中的刚体和碰撞器的相关用法(二)

    在关于Unity中的刚体和碰撞器的相关用法(一)的基础上 有一个plane平面,一个ball球体,都挂了碰撞器,ball挂了刚体Rigidbody,写了一个脚本ball挂载在球体上,球体从空中落下装机 ...

  9. Ubuntu之网易云音乐无法启动

    官方最新版(1.1)有这个问题,似乎改成0.9版就可以了 deepin15(32位):http://s1.music.126.net/download/pc/netease-cloud-music_0 ...

  10. mxnet与tensorflow的卷积实现细节比较

    mxnet的卷积 kernel = 3  pad=1边界补充0后,不管stride是否1还是2,imgw = 奇数或者偶数, 都是从图像位置(0,0)开始卷积 tensorlfow的卷积 kernel ...