我刚开始使用Unity时,正在尝试制作一个简单的3D平台程序,然后才能开始工作。我的问题出在玩家跳跃时。当他们跳跃时,他们可以随意跳到空中。我希望它只跳一次。有人可以帮忙吗?
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Playermovement : MonoBehaviour
{
public Rigidbody rb;
void Start ()
}
void Update()
{
bool player_jump = Input.GetButtonDown("DefaultJump");
if (player_jump)
{
rb.AddForce(Vector3.up * 365f);
}
}
}
}
最佳答案
您可以使用标志来检测播放器何时触地,然后仅跳过播放器触地。可以在true
和false
功能中将其设置为OnCollisionEnter
和OnCollisionExit
。
创建一个名为“ Ground”的标签,并使GameObjects使用此标签,然后将下面的修改代码附加到进行跳跃的玩家上。
private Rigidbody rb;
bool isGrounded = true;
public float jumpForce = 20f;
void Start()
{
rb = GetComponent<Rigidbody>();
}
private void Update()
{
bool player_jump = Input.GetButtonDown("DefaultJump");
if (player_jump && isGrounded)
{
rb.AddForce(Vector3.up * jumpForce);
}
}
void OnCollisionEnter(Collision collision)
{
if (collision.gameObject.CompareTag("Ground"))
{
isGrounded = true;
}
}
void OnCollisionExit(Collision collision)
{
if (collision.gameObject.CompareTag("Ground"))
{
isGrounded = false;
}
}
有时,使用
OnCollisionEnter
和OnCollisionExit
可能不够快。这很少见,但有可能。如果遇到此问题,则将Raycast与Physics.Raycast
一起使用来检测地面。确保仅将射线投射到“地面”层。private Rigidbody rb;
public float jumpForce = 20f;
void Start()
{
rb = GetComponent<Rigidbody>();
}
private void Update()
{
bool player_jump = Input.GetButtonDown("DefaultJump");
if (player_jump && IsGrounded())
{
rb.AddForce(Vector3.up * jumpForce);
}
}
bool IsGrounded()
{
RaycastHit hit;
float raycastDistance = 10;
//Raycast to to the floor objects only
int mask = 1 << LayerMask.NameToLayer("Ground");
//Raycast downwards
if (Physics.Raycast(transform.position, Vector3.down, out hit,
raycastDistance, mask))
{
return true;
}
return false;
}
关于c# - 仅跳一次,直到角色着陆,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50788074/