如何在FixedUpdate中移动Rigidbody,但仍然会让我的角色受到重力的影响?

时间:2018-01-22 23:00:34

标签: c# unity3d unity5 game-physics

所以

下面你会看到我最初用来控制角色动作的内容。

_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;

这确实使重力发挥作用,但随后引力变得如此强烈以至于我无法移动。

我只尝试添加Physics.gravity并跳过新的矢量部分,但是引力仍然太强了。

TL; DR

我使用的移动脚本会影响玩家的向下重力,而不应该这样。我希望他四处走动但仍受重力影响。我尝试的想法没有用。

请注意,我宁愿将引力保持在-9.81。

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

2 个答案:

答案 0 :(得分:2)

您可以使用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);
    }
}

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

答案 1 :(得分:0)

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

你用输入覆盖物理引擎施加的任何速度(例如重力)。

_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;