【问题标题】:Is it right to use FixedUpdate in my case?在我的情况下使用 FixedUpdate 是否正确?
【发布时间】:2021-03-19 02:55:27
【问题描述】:

我希望我的问题不是太愚蠢,我对 FixedUpdate 不是很熟悉。 我知道 FixedUpdate 通常用于物理,但在我的游戏中,我有以下问题:当它以低 fps 速率运行时,敌人会跳过检查点(因为它们在一帧中移动太多)。 动作方法:

    void FixedUpdate()
    {
        TestIfCloseToOtherZombie();
        //chopper la direction dans laquelle aller
        Vector3 dir = target.position - transform.position;
        //déplacer l'enemy
        transform.Translate(dir.normalized * enemy.speed * Time.fixedDeltaTime, Space.World);
        Vector3 rotDir = new Vector3(dir.x, 0, dir.z);
        if(rotDir != Vector3.zero)
        {
            Quaternion lookRotation =  Quaternion.LookRotation(rotDir);
            transform.rotation = Quaternion.Lerp(transform.rotation, lookRotation, turnSpeed*Time.fixedDeltaTime);
        }

        //marge d'erreur pour éviter qu'il bug dans le waypoint (+ de speed = + de  marge sinon bug)
        if(Vector3.Distance(transform.position, target.position) <= enemy.wayPointPrecision){
            GetNextWaypoint();
        }

        if(!isToClose)
        {
            enemy.speed = enemy.baseSpeed;
        }
        
        GetCurrentPosition();
    }

目标是敌人要去的检查点。 以前,我使用了 wayPointPrecision 值来解决问题。但是当 fps 太低时,这还不够。

我只想知道是否可以使用 FixedUpdate 来确保独立于帧速率计算运动,即使它不使用物理。

【问题讨论】:

    标签: c# unity3d


    【解决方案1】:

    在您的情况下,FixedUpdate 无法解决问题,但是您可以使用MoveTowards() 来代替不会超出目标,在您的示例中,它可能很简单:

    transform.position = Vector3.MoveTowards(transform.position, target.position, Time.deltaTime * 2);
    

    【讨论】:

    • 实际上,它似乎可以与 FixedUpdate 一起使用。但是,我尝试了您的解决方案,它也适用于运动,但是调用 TestIfCloseToOtherZombie 函数(它计算敌人之间的距离)不够。该功能还可以修改敌人的速度,在这里使用(如果有帮助的话)。
    • 实际上,我正在尝试调用重复那些而不是使用更新,也许它会起作用。
    • 很难说没有看到函数 TestIfCloseToOtherZombie() 究竟做了什么以及它的目标是什么,但是只要在同一个循环中调用它就应该调用相同数量的次。然而,在应用更新的位置之前调用它(我不知道它是否打算这样做)但你可能因此而“错过呼叫”,或者因为我可以看到 TestIfCloseToOtherZombie 没有返回任何东西对于您的移动函数,无论 TestIfCloseToOtherZombie 的结果如何,都会执行移动函数。
    • 它向前射线投射,如果有其他僵尸太近,它会减慢速度。我设法使用 invokeRepeating 完成了所有工作。
    【解决方案2】:

    尝试了一些不同的方法后,使用 InvokeRepeating() 而不是 update 或 fixedupdate 一切正常。

    【讨论】:

      【解决方案3】:

      FixedUpdate 的目的不是“物理”本身 - FixedUpdate 的目的确定性。如果您以一种具有机械意义的方式移动对象(也就是说,该对象的移动会影响游戏的运行方式,而不仅仅是游戏的外观或感觉),那么该行为可能属于 FixedUpdate。这始终适用于物理学,但基本上也适用于可能涉及任何类型的碰撞检查的任何事物。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-08-11
        相关资源
        最近更新 更多