zoukankan      html  css  js  c++  java
  • [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 ;
    }
  • 相关阅读:
    398. Random Pick Index
    382. Linked List Random Node
    645. Set Mismatch
    174. Dungeon Game
    264. Ugly Number II
    115. Distinct Subsequences
    372. Super Pow
    LeetCode 242 有效的字母异位词
    LeetCode 78 子集
    LeetCode 404 左叶子之和
  • 原文地址:https://www.cnblogs.com/AaronBlogs/p/8024530.html
Copyright © 2011-2022 走看看