统一中空运动与速度变化

问题描述 投票:0回答:1

我做了一个脚本,用于在Unity中的3D游戏中的玩家移动.我喜欢运动的工作方式,但当我在移动时跳跃时,玩家一直以相同的速度向那个方向移动,直到它落到地面上,这是这个脚本的预期行为.但我希望能够在空中稍微移动玩家(不完全可控。

任何改进这段代码的建议都将得到极大的赞赏。

这是我的代码。


using System.IO;
using UnityEngine;

public class VelocityMovement : MonoBehaviour
{

    #region Variables

    public float speed;
    public float gravity;
    public float maxVelocityChange;
    public float jumpHeight;
    public float raycastDistance;
    public Rigidbody rb;

    #endregion

    private void Awake()
    {
        //gets rigidbody, freezes rotation of the rigidbody, disables unity's built in gravity system on rigidbody.
        rb = GetComponent<Rigidbody>();
        rb.freezeRotation = true;
        rb.useGravity = false;
    }

    private void Update()
    {
        //Jump system 
        if(Grounded())
        {
            if (Input.GetKeyDown(KeyCode.Space))
            {
                rb.velocity = new Vector3(rb.velocity.x, CalculateJumpSpeed(), rb.velocity.z);
            }
        }
    }

    private void FixedUpdate()
    {

        //Moves the player when on the ground.
        if (Grounded())
        {
            //Calculate how fast the player should be moving.
            Vector3 targetVelocity = new Vector3(playerInputs.hAxis, 0, playerInputs.vAxis); 
            targetVelocity = transform.TransformDirection(targetVelocity);
            targetVelocity *= speed ;

            //Calculate what the velocity change should be
            Vector3 velocity = rb.velocity;
            Vector3 velocityChange = (targetVelocity - velocity);
            velocityChange.x = Mathf.Clamp(velocityChange.x, -maxVelocityChange, maxVelocityChange);
            velocityChange.z = Mathf.Clamp(velocityChange.z, -maxVelocityChange, maxVelocityChange);
            velocityChange.y = 0f;

            //applies a force equal to the needed velocity change
            rb.AddForce(velocityChange, ForceMode.VelocityChange);

        }

        //Adds gravity to the rigidbody
        rb.AddForce(new Vector3(0, -gravity * rb.mass, 0));
    }

    //Checks if player is on the ground
    private bool Grounded()
    {
        return Physics.Raycast(transform.position, Vector3.down, raycastDistance);
    }

    //calculates how high the player should be jumping
    private float CalculateJumpSpeed()
    {
        return Mathf.Sqrt(2 * jumpHeight * gravity);
    }
}

c# unity3d 3d
1个回答
0
投票

如果我理解正确的话,你想放慢你的动作,而半空中.至少是左右的情况。如果我没理解错的话,你可以在if(Grounded())后面做一个else{},然后从那里开始,可能会做一些浮动变量,作为你在空中控制leftright的乘数,以及另一个向前和向后的浮动变量。在那里面,你可以只是乘以你的速度与变量(取决于轴),你应该得到一些形式的较慢的运动有。

我希望这至少能帮助你解决一点问题。


0
投票
private void FixedUpdate()
{
    //check how big the movement is. Swap SomeSmallValue with a float like 0.1f
    float actualSpeed;
    Vector3 velocity;
    if(Grounded())
    {
         actualSpeed = speed;
         //HERE IT IS NOT, THIS DOESN'T MATTER
         velocity = rb.velocity
    }
    else{
         actualSpeed = speed * SomeSmallValue;
         //WITH THIS rb KEEPS THE SPEED IF ANY BUTTON IS PRESSED
         velocity = 0;
    }

    //Moves the player ALWAYS.
        //Calculate how fast the player should be moving.
        Vector3 targetVelocity = new Vector3(playerInputs.hAxis, 0, playerInputs.vAxis); 
        targetVelocity = transform.TransformDirection(targetVelocity);
        //if Grounded == true the movement is exactly the same than before, because actualSpeed = speed. 
        //If Grounded == false, the movement is so light
        targetVelocity *= actualSpeed;

        //Calculate what the velocity change should be
        //I'VE PLACED THIS UP IN ORDER TO CALL Grounded() ONLY ONE TIME
        //Vector3 velocity = rb.velocity;
        Vector3 velocityChange = (targetVelocity - velocity);
        velocityChange.x = Mathf.Clamp(velocityChange.x, -maxVelocityChange, maxVelocityChange);
        velocityChange.z = Mathf.Clamp(velocityChange.z, -maxVelocityChange, maxVelocityChange);
        velocityChange.y = 0f;

        //applies a force equal to the needed velocity change
        rb.AddForce(velocityChange, ForceMode.VelocityChange);



    //Adds gravity to the rigidbody
    rb.AddForce(new Vector3(0, -gravity * rb.mass, 0));
}

如果你的代码工作正常,可以试试这样的东西。只是移动了接地的条件。现在运动在空气时间也能工作。我们用那个接地的bool来检查运动的大小。

© www.soinside.com 2019 - 2024. All rights reserved.