c# - Unity3D Rigidbody 播放器在运行时跳跃受限

标签 c# unity3d

我正在尝试使用Rigidbody 对主要 FPS 角色的 Action 进行编程。

相机和 ZQSD 位移效果很好,但移动时跳跃非常受限:

  • 固定跳跃:Y(分钟)= 1; Y(最大)= 2.7;
  • 移动跳跃:Y(分钟)= 1; Y(最大值)= 1.9;

这非常令人沮丧,尤其是对于平台游戏而言。 Personnaly,我希望这两个操作得到相同的结果。

这是我的 C# 代码:

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

public class FPSMovement : MonoBehaviour {

    public float walkAcceleration = 150f;
    public float maxWalkSpeed = 10f;
    public float jumpVelocity = 500f;
    public float maxSlope = 45f;

    private Rigidbody rb;
    private Vector2 horizontalMovement;
    private bool isGrounded = false;
    private bool doubleJumped = false;

    // Use this for initialization
    void Start () {
        rb = GetComponent<Rigidbody> ();
    }

    // Update is called once per frame
    void Update () {
        if(rb.velocity.magnitude > maxWalkSpeed){
            rb.velocity = Vector3.ClampMagnitude(rb.velocity, maxWalkSpeed);
        }

        transform.rotation = Quaternion.Euler (0, GetComponentInChildren<FPSCamera>().currentYRotation, 0);

        // Entrées clavier ZQSD déplaçant le joueur
        float x = 0, y = 0, z = 0;
        if (Input.GetKey (KeyCode.Z)) {
            x += 1f;
        }
        if (Input.GetKey (KeyCode.S)) {
            x -= 1f;
        }
        if (Input.GetKey (KeyCode.Q)) {
            z -= 1f;
        }
        if (Input.GetKey (KeyCode.D)) {
            z += 1f;
        }
        // Arrêt prompt du glissement
        if ((!Input.GetKey (KeyCode.Z) && !Input.GetKey (KeyCode.S) && !Input.GetKey (KeyCode.Q) && !Input.GetKey (KeyCode.D))
        && isGrounded) {
            rb.velocity /= 1.1f;
        }
        // Saut du joueur
        if (Input.GetKey (KeyCode.Space) && isGrounded) {
            rb.AddForce (0, jumpVelocity, 0);
        // Deuxième saut
        }
        if (Input.GetKey (KeyCode.Space) && !doubleJumped) {
            rb.AddForce (0, jumpVelocity, 0);
            doubleJumped = true;
        }

        rb.AddRelativeForce (z * walkAcceleration, 0, x * walkAcceleration);
    }

    void OnCollisionStay(Collision other) {
        foreach (ContactPoint contact in other.contacts) {
            if (Vector3.Angle (contact.normal, Vector3.up) < maxSlope) {
                isGrounded = true;
                doubleJumped = false;
            }
        }
    }

    void OnCollisionExit() {
        isGrounded = false;
    }


}

我也有印象,玩家在空中移动时会悬停,但这不是主要问题,最重要的只是印象。

一个简单的问题,需要用几句话来解释,但对于这类游戏来说却是一个真正需要解决的问题!

我可以请你,Stackoverflow 的人温柔地帮助我,先行伙伴的一千个感谢。

PS:我的母语是法语,所以请不要在语法或其他英语微妙之处浪费太多时间:)

最佳答案

这是因为您限制了玩家的总速度,而您应该只限制水平速度。如果你以最大速度行走并跳跃,你的跳跃速度会加到总速度中,你的角色实际上应该以比最大行走速度更高的速度行进。要修复它,您可以这样做:

// Isolate the horizontal component
Vector3 horizontalVelocity = rb.velocity;
horizontalVelocity.y = 0;

if (horizontalVelocity.magnitude > maxWalkSpeed) {
    // Clamp the horizontal component
    Vector3 newVelocity = Vector3.ClampMagnitude(horizontalVelocity, maxWalkSpeed);
    // Keep the original vertical velocity (jump speed)
    newVelocity.y = rb.velocity.y;
    rb.velocity = newVelocity;
}

关于c# - Unity3D Rigidbody 播放器在运行时跳跃受限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43933962/

相关文章:

c# - 使用属性上的总和验证集合

c# - Roslyn 脚本 - 没有 "System"的脚本

c# - 如何以编程方式为 DataGrid 设置 RowHeaderTemplate?

c# - Unity iOS - 无法从 .Bundle 导入函数

c# - unity3D错误: Parser error

c# - Unity VectorN变量是否重新计算?

c# - 弹丸统一

c# - User.Identity.Name 在 asp.net core + Angular 客户端应用程序中为 null

c# - 将 null 传递给 Interop 方法时,它会抛出 "Generic types cannot be marshaled."异常

c# - unity : Remove The selected object from random.范围