首页 > 解决方案 > 如何让物体向前跳跃?

问题描述

我一直无法让我的角色向前跳跃。我已经让它跳到位,但我似乎无法JumpFor()让它在跳跃时向前移动。我已经尝试过Vector3,但它只在 1 个方向上起作用,而且transform.forward似乎根本不起作用。

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

public class PlayerMovement : MonoBehaviour
{
    //VARIABLES
    [SerializeField] private float moveSpeed;
    [SerializeField] private float walkSpeed;
    [SerializeField] private float runSpeed;
    private Vector3 moveDirection;
    private Vector3 velocity;
    [SerializeField] private bool isGrounded;
    [SerializeField] private float groundCheckDistance;
    [SerializeField] private LayerMask groundMask;
    [SerializeField] private float gravity;
    [SerializeField] private float jumpHeight;
    
    //REFERENCES
    private CharacterController controller;
    private Animator anim;
    private Collider Collider;
    
    private void Start()
    {
        controller = GetComponent();
        anim = GetComponentInChildren();
        Collider = GetComponent(); ;
    }
    
    private void Update()
    {
        Move();
    }
    
    private void Move()
    {
        isGrounded = Physics.CheckBox(Collider.bounds.center, Collider.bounds.extents, transform.rotation, groundMask);
        
        if (isGrounded && velocity.y < 0)
            velocity.y = -2f;
        
        float moveZ = Input.GetAxis("Vertical");
        moveDirection = new Vector3(0, 0, moveZ);
        moveDirection = transform.TransformDirection(moveDirection);

        if (isGrounded)
        {
            
            if (moveDirection != Vector3.zero && !Input.GetKey(KeyCode.LeftShift))
            {
                Walk();
            }
            else if (moveDirection != Vector3.zero && Input.GetKey(KeyCode.LeftShift))
            {
                Run();
            }
            else if (moveDirection == Vector3.zero)
            {
                Idle();
            }
        
            moveDirection *= moveSpeed;
        
            if (isGrounded && Input.GetKeyDown(KeyCode.Space) && moveDirection == Vector3.zero )
            {
                Jump();
            }
        
            if (isGrounded && Input.GetKeyDown(KeyCode.Space) && Input.GetKey(KeyCode.W) && moveDirection != Vector3.zero)
            {
                JumpFor();
            }
        
            anim.SetBool("Jump", false);
            anim.SetBool("JumpUp", false);
        }

        if (!isGrounded)
            anim.SetBool("Jump", true);

        controller.Move(moveDirection * Time.deltaTime);
        
        velocity.y += gravity * Time.deltaTime;  
        controller.Move(velocity * Time.deltaTime);
    }
    
    private void Idle()
    {
        anim.SetFloat("Speed", 0, 0.02f, Time.deltaTime);
    }
    
    private void Walk()
    {
        moveSpeed = walkSpeed;     
        anim.SetFloat("Speed", 0.6f, 0.1f, Time.deltaTime);
    }
    
    private void Run()
    {
        moveSpeed = runSpeed;
        
        anim.SetFloat("Speed", 1, 0.1f, Time.deltaTime);
    }
    
    private void Jump()  
    {
        velocity.y = Mathf.Sqrt(jumpHeight * -2 * gravity);
    }

    private void JumpFor()
    {
        velocity.y = Mathf.Sqrt(jumpHeight * -2 * gravity);
    }
}

标签: c#unity3d

解决方案


我解决了。我最终在 JumpFor() 中使用了速度向量并给了它一个新的 Vector3 然后我输入了 velocity= transform.TransformDirection(velocity) 所以它使用局部轴而不是全局轴。在那之后,当玩家接地时,速度 = Vector3.zero。

块引用

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

public class PlayerMovement : MonoBehaviour
{
    //VARIABLES
    [SerializeField] private float moveSpeed;
    [SerializeField] private float walkSpeed;
    [SerializeField] private float runSpeed;
    [SerializeField] private float JumpDist;

    private Vector3 moveDirection;
    private Vector3 velocity;

    [SerializeField] private bool isGrounded;
    [SerializeField] private float groundCheckDistance;
    [SerializeField] private LayerMask groundMask;
    [SerializeField] private float gravity;

    [SerializeField] private float jumpHeight;

    //REFERENCES
    private CharacterController controller;
    private Animator anim;
    private Collider Collider;
    private Rigidbody rb;
    private Transform tran;
    


    private void Start()
    {
        controller = GetComponent<CharacterController>();
        anim = GetComponentInChildren<Animator>();
        Collider = GetComponent<BoxCollider>(); ;
        rb = GetComponent<Rigidbody>();
        tran = GetComponent<Transform>();
    }

    private void Update()
    {
        Move();
    }

    private void Move()
    {
        isGrounded = Physics.CheckBox(Collider.bounds.center, Collider.bounds.extents, transform.rotation, groundMask);

        if (isGrounded && velocity.y < 0)
        {
            velocity.y = -2f;
        }
        float moveZ = Input.GetAxis("Vertical");


        moveDirection = new Vector3(0, 0, moveZ);
        moveDirection = transform.TransformDirection(moveDirection);

        if (isGrounded)
        {
            velocity = Vector3.zero;
            if (moveDirection != Vector3.zero && !Input.GetKey(KeyCode.LeftShift))
            {
                Walk();

            }
            else if (moveDirection != Vector3.zero && Input.GetKey(KeyCode.LeftShift))
            {
                Run();
            }
            else if (moveDirection == Vector3.zero)
            {
                Idle();
            }

            moveDirection *= moveSpeed;
            if (isGrounded && Input.GetKeyDown(KeyCode.Space) && moveDirection == Vector3.zero )
            {
                Jump();
            }

            if (isGrounded  && Input.GetKeyDown(KeyCode.Space) && Input.GetKey(KeyCode.W) && moveDirection != Vector3.zero)
            {
                JumpFor();
            }

            anim.SetBool("Jump", false);
            anim.SetBool("JumpUp", false);
        }

        if (!isGrounded)
        {
            anim.SetBool("Jump", true);
        }

        controller.Move(moveDirection * Time.deltaTime);

        velocity.y += gravity * Time.deltaTime;
        controller.Move(velocity * Time.deltaTime);
    }

    private void Idle()
    {
        anim.SetFloat("Speed", 0, 0.02f, Time.deltaTime);
    }

    private void Walk()
    {
        moveSpeed = walkSpeed;
        anim.SetFloat("Speed", 0.6f, 0.1f, Time.deltaTime);
    }

    private void Run()
    {
        moveSpeed = runSpeed;
        anim.SetFloat("Speed", 1, 0.1f, Time.deltaTime);
    }

    private void Jump()
    {
        velocity.y = Mathf.Sqrt(jumpHeight * -2 * gravity);
    }

    private void JumpFor()
    {
        velocity = new Vector3(0, Mathf.Sqrt(jumpHeight * -2 * gravity), Mathf.Sqrt(jumpHeight * -2 * gravity));
        velocity= transform.TransformDirection(velocity);
    }
}

Blockquote


推荐阅读