[Unity3D]关于NaN(Not a Number)的问题
生活随笔
收集整理的這篇文章主要介紹了
[Unity3D]关于NaN(Not a Number)的问题
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
在游戲運(yùn)行時(shí),代碼若寫得不安全很容易出現(xiàn)NAN的異常。一旦NAN出現(xiàn)整個(gè)游戲不崩潰也壞死掉了,游戲上了則是要被直接打回來的節(jié)奏,更是一個(gè)開發(fā)及測試人員每人都要扣3000塊的大BUG。 一般表現(xiàn)為: 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 } 反正各種各樣類似了,有些還不直接報(bào)你錯(cuò),間接來搞你讓你找半天。 NAN就是字母意思了,NOT A NUMBER,一般是由于一個(gè)數(shù)除0造成的,所以若設(shè)計(jì)有除就要留心去確保安全。 一些簡單的計(jì)算可以讓人更好理解: 1 / 0 = NaN 1 + NaN = NaN 2 * NaN = NaN 可以說任何數(shù)涉及到與NaN的計(jì)算都會(huì)被直接同化,極其強(qiáng)悍的超能力啊! 又例如(C#): float A = 1.0f; float B = 2.0f; float C = float.NaN;? float result = A * B + C;//result則被同化成NaN了,因?yàn)镃是NaN。 遇到NAN也可以拋出異常再處理,當(dāng)然假設(shè)你就直接知道那里肯定會(huì)有NAN的了。NaN不等于任何數(shù)字,也不等于它自身。所以你可以用NaN這個(gè)變量與自己對等判斷,若返回錯(cuò)誤則是NaN,不過這些寫編譯器會(huì)提示你有傻逼代碼,你可以不理它。 例:X為NaN bool b_NaN = ( X == X ); if(b_NaN) Debug.Log("X is a number ."); else Debug.Log("X is not a number !"); 一般來說盡量避免這個(gè)NAN的出現(xiàn)。 在UNITY3D中,其更多可能出現(xiàn)在當(dāng)Time.timescale為0的時(shí)候,因?yàn)橛螒蜻^程中,很多運(yùn)算都直接關(guān)聯(lián)Time.deltaTime這個(gè)參數(shù),一旦Time.timescale為0,那么Time.deltaTime的數(shù)值則為0.若不小心除了它又沒有發(fā)現(xiàn),那么則是喜聞樂見的事情了,哈哈。 若想要實(shí)現(xiàn)暫停(用Time.timeScale的方式暫停)而某部分東西又可以動(dòng)的話,可以考慮自己去計(jì)算一個(gè)幀時(shí)間間隔。當(dāng)然這個(gè)有可能會(huì)第一幀的時(shí)間間隔特別長。所以需要你來初始化這個(gè)地方,或者直接計(jì)算丟掉大的f_DeltaTime值。 float f_LastFrameRealtime; void Start() { f_LastFrameRealtime = ?Time.realtimeSinceStartup ; } void Update() { float f_DeltaTime = Time.realtimeSinceStartup - f_LastFrameRealtime; f_LastFrameRealtime = ?Time.realtimeSinceStartup ; }
轉(zhuǎn)載于:https://www.cnblogs.com/AaronBlogs/p/8024530.html
總結(jié)
以上是生活随笔為你收集整理的[Unity3D]关于NaN(Not a Number)的问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android开发学习 -------
- 下一篇: scrapy中的request对象