代码之家  ›  专栏  ›  技术社区  ›  Doh09

如何在FixedUpdate中移动刚体,但仍让角色受重力影响?

  •  1
  • Doh09  · 技术社区  · 7 年前

    所以

    下面是我最初用来控制角色移动的内容。

    _RigidBody.velocity = _ConstantWalkingSpeed * direction.normalized;
    

    这适用于在四个方向上走动。然而,如果我的角色摔倒在边缘,他会慢慢摔倒。如果我在半空中禁用行走脚本,重力就会恢复并以正常速度移动。

    这让我相信我的动作脚本在某种程度上影响了重力效果。

    因此,我尝试了以下解决方案:

    _RigidBody.velocity = _ConstantWalkingSpeed * direction.normalized + new Vector3(0f, _RigidBody.velocity.y, 0f);
    

    这也不管用,所以我试了一下:

    _RigidBody.velocity = _ConstantWalkingSpeed * direction.normalized + new Vector3(0f, _RigidBody.velocity.y, 0f) + Physics.gravity;
    

    这确实让重力起作用了,但后来重力变得如此强大,以至于我无法移动。

    我试着只加上物理。重力并跳过新的矢量部分,但重力仍然太强。

    TL;博士

    我使用的动作脚本会影响球员向下的重力,这是不应该的。我希望他四处移动,但仍然受到重力的影响。我尝试过的想法没有奏效。

    请注意,我更愿意将重力保持在-9.81。

    希望你们有一个有效的建议:-)

    2 回复  |  直到 7 年前
        1
  •  2
  •   AresCaelum    7 年前

    您可以使用 RigidBody.movePositon :

    下面是我编写的一个快速示例脚本:

    using UnityEngine;
    
    public class simpleMoveRB : MonoBehaviour {
        public Rigidbody myBody;
        public float _constantWalkSpeed = 3.0f;
    
        Vector3 moveDirection = Vector3.zero;
        // Use this for initialization
        void Start () {
    
        }
    
        // Update is called once per frame
        void Update() {
            if (Input.GetKey(KeyCode.A))
            {
                moveDirection.x = -1.0f;
            }
            else if(Input.GetKey(KeyCode.D))
            {
                moveDirection.x = 1.0f;
            }
            else
            {
                moveDirection.x = 0.0f;
            }
    
            if(Input.GetKeyDown(KeyCode.Space))
            {
                myBody.AddForce(Vector3.up * 500.0f);
            }
        }
    
        private void FixedUpdate()
        {
                myBody.MovePosition(transform.position + moveDirection * _constantWalkSpeed * Time.deltaTime);
        }
    }
    

    您可以使用此脚本处理移动,并且仍然可以在对象上使用重力。

        2
  •  0
  •   Draco18s no longer trusts SE    7 年前

    修改速度而不是设置速度。

    您正在用输入覆盖物理引擎应用的任何速度(例如重力)。

    _RigidBody.velocity += _ConstantWalkingSpeed * direction.normalized;
    

    您可能还希望将速度X和Z值限制为最大值:

    Vector3 vel = _RigidBody.velocity;
    vel.x = Mathf.Min(vel.x, ConstantWalkingSpeed);
    vel.z = Mathf.Min(vel.z, ConstantWalkingSpeed);
    _RigidBody.velocity = vel;