zoukankan      html  css  js  c++  java
  • [Unity3D]关于NaN(Not a Number)的问题

    原地址:[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 ;
    }
  • 相关阅读:
    Linux内存管理 -- /proc/{pid}/smaps讲解
    link hub(other)
    牛客项目平台管家 | xie_note 学习笔记整理📚 项目来源:https://github.com/Making-It/note ,已获得授权转载
    【Linux】C++后台开发面试
    C++ 后台开发面试时一般考察什么?
    Linux C/C++ 学习路线(已拿腾讯、百度 offer)2
    C++路线图
    【转】C++后台开发校招面试常见问题
    【转】Linux C/C++ 学习路线(已拿腾讯、百度 offer)
    学习经验总结|C++后台开发/云计算方向,offer收割机的学习路线
  • 原文地址:https://www.cnblogs.com/123ing/p/3789078.html
Copyright © 2011-2022 走看看