[Unity3D]关于NaN(Not a Number)的问题

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

}

时间: 2024-10-05 15:20:42

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

NaN(Not a Number)问题

Terminating app due to uncaught exception 'CALayerInvalidGeometry', reason: 'CALayer position contains NaN: [80 nan]' 本来好好的突然出现了这个问题  累半天终于找到了原因   原来是做除0操作了  感谢http://www.cocoachina.com/bbs/read.php?tid=261837 另外拓展: NaN,是Not a Number的缩写. NaN 用于处理计算中出

JS中六种数据类型(四)——Number (转)

Number类型应该是ECMAScript中最令人关注的数据类型了,这种类型使用IEEE754格式来表示整数和浮点数值(浮点数值在某些语言中也被称为双精度数值).为支持各种数值类型,ECMA-262定义了不同的数值字面量. 最基本的数值字面量格式是十进制整数,十进制整数可以像下面这样直接在代码中输入: var  item =55;   //整数 除了以十进制表示外,整数还可以通过八进制(以8为基数)或十六进制(以16为基数)的字面值来表示.其中,八进制字面值的第一位必须是零(0),然后是八进制数

R: NULL, NA, and NaN

NaN (“Not a Number”) means 0/0 NA (“Not Available”) is generally interpreted as a missing value and has various forms – NA_integer_, NA_real_, etc. Therefore, NaN ≠ NA and there is a need for NaN and NA. is.na() returns TRUE for both NA and NaN, howe

JQ中的NaN问题

js提供了parseInt()和parseFloat()两个转换函数.前者把值转换成整数,后者把值转换成浮点数.只有对String类型调用这些方法,这两个函数才能正确运行:对其他类型返回的都是NaN(Not a Number). 比如 parseInt("1234blue"); //returns 1234 par... new Date在不同浏览器中支持的写法都不同,最兼容的写法是yyyy/MM/dd 其他写法在部分浏览器中无法解析 如,IE7不支持(yyyy-MM-dd,只支持/分

javascript之Number

一.构造函数 Number(value) new Number(value) 二.Number属性 1.Number.MAX_VALUE 返回能表示的最大数字. 2.Number.MIN_VALUE 能表示的最小数字. 3.Number.NAN 非数字值. 4.Number.NEGATIVE_INFINITY 负无穷,当溢出时返回. 5.Number.POSITIVE_INFINITY 正无穷,当溢出时返回. 三.Number方法 1.toString() 使用指定进制,将一个数字转换为字符串.

JS魔法堂:再识Number type

Brief 本来只打算理解JS中0.1 + 0.2 == 0.30000000000000004的原因,但发现自己对计算机的数字表示和运算十分陌生,于是只好恶补一下.以下是恶补后的成果: 基础野:细说原码.反码和补码(http://www.cnblogs.com/fsjohnhuang/p/5060242.html) 基础野:细说无符号整数(http://www.cnblogs.com/fsjohnhuang/p/5078290.html) 基础野:细说有符号整数(http://www.cnbl

flex NaN

如果该值为NaN(非数字),则返回true:否则返回false.public function isNaN(num:Number):Boolean 举例:NaN值不是int或uint数据类型的成员.flex开始的时候,有时会遇到NaN类型的number数据,如果放任NaN不管,程序可能就会出错退出.这时需要判断是否为NaN来确定是否要执行下一步操作.在flex的顶级函数中,有一个isNaN函数,专门来做这个事情.抄录api文档的说明如下:public function isNaN(num:Num

Number()、parseInt()、parseFloat()的区别

最近在一个项目中遇到:需要在前台页面用javascript去处理很数值的计算. 各种用法都有,为了统一且保证处理方式正确,特地总结了一下相关的数值转换的用法: 作用: Number():可以用于任何数据类型转换成数值: parseInt().parseFloat():专门用于把字符串转换成数值: 转换规则: Number(): 1)如果是Boolean值,true和false将分别转换为1和0. 2)如果是数字值,只是简单的传入和返回. 3)如果是null值,返回0. 4)如果是undefine

2016.8.01 "" null undefined NaN 0 特殊比较是true还是false

在javascript的世界里,无论是函数,还是数组,还是对象,亦或是字符串,数字,布尔类型,在这些数据类型中,总有这么几个特立独行,然后造成一些可有可无的讨厌bug. 而这些讨厌bug出现的原因就是由于比较时产生的错误,而且最不易查出错误. 在这里我们整理了这几个特殊数据类型的比较.直接上代码. 上代码前,普及一个知识: ==内容比较,数据类型不比较. ===内容比较,数据类型也比较. 上代码: ==比较代码: // "" null undefined NaN 0 console.l