繁体   English   中英

Unity使用addforce限制特定方向的刚体速度?

[英]Unity limit rigidbody velocity in specific direction with addforce?

我正在创建第三人称玩家移动脚本。 该运动会相对于相机的方向向刚体施加力。 我想在前进方向(cForward)设置一个最大速度限制,并在水平/右方向(cRight)设置一个单独的最大速度限制。 通常我可以直接设置速度,但是这会增加玩家的重力。 有没有办法通过使用 addforce 来实现这一点,或者有没有办法在直接设置速度时让重力正常工作? 到目前为止,这是我所做的(我对解决方案的其他一些尝试已被注释掉):

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerMovement : MonoBehaviour
{
    public Camera mainCamera;
    public float horizontalWalkSpeed = 500.0f;
    public float verticalWalkSpeed = 500.0f;
    public float horizontalSprintSpeed = 1000.0f;
    public float verticalSprintSpeed = 1000.0f;
    public bool isSprinting = false;
    public bool cannotMove = false;
    public float accelerationSpeed = 0.2f;

    private Rigidbody pRigidBody;
    private Vector2 currentInputVector;
    private Vector2 smoothInputVelocity;

    // Start is called before the first frame update
    void Start()
    {
        pRigidBody = GetComponent<Rigidbody>();
    }

    // Update is called once per frame
    void Update()
    {
        HandleInput();
    }

    private void FixedUpdate()
    {
        Vector3 cForward = mainCamera.transform.forward;
        Vector3 cRight = mainCamera.transform.right;

        cForward.y = 0.0f;
        cRight.y = 0.0f;
        cForward.Normalize();
        cRight.Normalize();

        

        if (!cannotMove && !isSprinting)
        {
            Vector3 vForce = cForward * currentInputVector.y * verticalWalkSpeed;
            Vector3 hForce = cRight * currentInputVector.x * horizontalWalkSpeed;
            //Vector3 gravity = Vector3.up * -9.8f;
            Vector3 force = vForce + hForce;

            //float verSpeed = Vector3.Dot(pRigidBody.velocity, cForward);
            //float horSpeed = Vector3.Dot(pRigidBody.velocity, cRight);

            //if (verSpeed >= 0 && verSpeed <= verticalWalkSpeed)
            //{
            //    pRigidBody.AddForce(vForce, ForceMode.VelocityChange);
            //}

            //if(horSpeed < horizontalWalkSpeed)
            //{
            //    pRigidBody.AddForce(hForce, ForceMode.VelocityChange);
            //}


            //float velocityInDirection = Vector3.Dot(pRigidBody.velocity, cForward);

            //if(velocityInDirection > verticalWalkSpeed)
            //{
            //    pRigidBody.AddForce(-vForce, ForceMode.VelocityChange);
            //}

            //pRigidBody.velocity = force;

            pRigidBody.AddForce(force, ForceMode.VelocityChange);
            
        }
        else if (!cannotMove && isSprinting)
        {
            pRigidBody.velocity = cForward * currentInputVector.y * verticalSprintSpeed * Time.fixedDeltaTime + cRight * currentInputVector.x * horizontalSprintSpeed * Time.fixedDeltaTime;
        }


    }

    private void HandleInput()
    {
        isSprinting = Input.GetButton("Sprint");

        Vector2 input = new Vector2(Input.GetAxis("Horizontal"), Input.GetAxis("Vertical"));
        currentInputVector = Vector2.SmoothDamp(currentInputVector, input, ref smoothInputVelocity, accelerationSpeed);
    }
}

我认为这个线程可能有帮助——https://answers.unity.com/questions/9985/limiting-rigidbody-velocity.html。 基本上,有两种方法。

  1. 反方向加力,随着object超出极限的程度增加。 这需要额外的计算和测试。
  2. 当速度值超过限制时,只需将速度值归一化即可。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM