玩家在 Update() 中移动,但在 Unity 中没有 FixedUpdate()

Posted

技术标签:

【中文标题】玩家在 Update() 中移动,但在 Unity 中没有 FixedUpdate()【英文标题】:Player moves in Update() but not FixedUpdate() in Unity 【发布时间】:2021-06-22 18:41:56 【问题描述】:

我统一做了一个汽车控制器来开车。我读过FixedUpdate 更适合用于物理对象而不是Update,但是当我切换到Fixed 更新时,我的汽车不再行驶。有谁知道这可能是为什么?非常感谢您提供的任何帮助!

    public float speed;
    public float turnSpeed;
    private RigidBody rb;

    void Start()
    
        rb = GetComponent<Rigidbody>();
    

    // Update is called once per frame
    void FixedUpdate()
    
        Move();
        Turn();
    

    void Move()
        // moves the car
        if (Input.GetKey(KeyCode.W))
            rb.AddRelativeForce(new Vector3(Vector3.forward.x, 0, Vector3.forward.z) * speed);
         
        else if (Input.GetKey(KeyCode.S))
            rb.AddRelativeForce(new Vector3(Vector3.forward.x, 0, Vector3.forward.z) * -speed);
        
        // maintains forward velocity relative to car.
        Vector3 localVelocity = transform.InverseTransformDirection(rb.velocity);
        localVelocity.x = 0;
        rb.velocity = transform.TransformDirection(localVelocity);
    

    void Turn()
        // turns the car.
        if (Input.GetKey(KeyCode.D))
            rb.AddRelativeTorque(Vector3.up * turnSpeed);
            Debug.Log("TURNING CAR");
        
        else if (Input.GetKey(KeyCode.A))
            rb.AddRelativeTorque(-Vector3.up * turnSpeed);
            Debug.Log("TURNING CAR");
        

这是代码。按 W 或 S 可增加力,按 A 或 D 可增加扭矩。当我尝试打开 FixedUpdate 时,控制台将按应有的方式写入“TURNING CAR”,这表明它正在通过 AddRelativeTorque 线,但它仍然不会转动,所以我不太确定发生了什么。再次感谢,非常感谢任何帮助。

【问题讨论】:

你试过增加力量吗?由于更新比固定更新运行得更频繁,因此在同一时间段内更新的累积力将比固定更新多得多。 @hijinxbassist much more 有点夸张,虽然.. 假设 60fps 然后 Update 被调用 60 次,而 FixedUpdate 默认情况下每秒调用 50 次 .. 这不是一个巨大的差异 ;) 但总的来说是的您应该在两者中都考虑Time.deltaTime,然后不应该注意到差异 哦,有趣。我会尝试并很快回来 成功了!!太感谢了。很高兴这是一个简单的修复。 太棒了,很高兴听到这是一个简单的修复(那些是最好的!)。我在下面发布了我的评论作为答案。干杯 【参考方案1】:

尝试增加使用的力量。

固定更新的运行频率低于更新(在大多数情况下使用默认设置)。由于代码运行的频率要低得多,因此在同一时间段内积累的力也较小。

考虑一个以 100fps 运行的游戏。默认的固定时间步长为 0.02 秒(每秒 50 帧)。由于更新以 100 fps 的速度运行,因此更新所施加的力是固定更新所施加的两倍。

如果你让你的力量值独立于自上次更新发生的时间,你就不必担心这个。

对于更新使用 myForceValue * Time.deltaTime。

对于 FixedUpdate 使用 myForceValue * Time.fixedDeltaTime。

【讨论】:

以上是关于玩家在 Update() 中移动,但在 Unity 中没有 FixedUpdate()的主要内容,如果未能解决你的问题,请参考以下文章

Unity/Pun2:2个玩家互相控制

Unity 消灭病毒(98K)—2

unity移动视角开始飞

Unity 2D:玩家角色移动脚本

Unity 掷骰子后让玩家的棋子轮流移动

弹丸不移动,也不从玩家开始(Unity 2D / C#)