c# - 如何让物体向前跳跃?
问题描述
我一直无法让我的角色向前跳跃。我已经让它跳到位,但我似乎无法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);
}
}
解决方案
我解决了。我最终在 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
推荐阅读
- vba - 检查文件名中的日期
- php - 基于用户登录的表中的Mysql数据库连接查询
- rust - 在 Rust 中,我如何才能最好地构建项目以使用包含公共可调用函数的文件?
- selenium - 使用 Selenium 从动态网页中抓取内容会返回错误的内容
- jquery - 如何将日期选择器的日历图标放在 div 或 table 中
- reactjs - 带有 React Router 的 MUI 面包屑 - 自定义面包屑标签
- java - 如何在 Spring Framework 中使用 RestTemplate 解析数组?
- java - JSON序列化 - 如何不使用整个结构序列化一个类属性
- python - Maya (PySide2) - 重新打开窗口而不是新窗口
- vue.js - 我无法在 vue.js 中使用 datalist 的更改事件,更改事件不起作用