我有一个Endless Runner播放器,在任何状态下都可以跳跃。当按下空格键时,我的播放器将无限地向天空飞行。
它具有动画和角色控制器,但没有Rigidbody
。我改为在脚本中使用它。
在动画制作器中,我添加了bool ground
和跳跃触发器。
在从任何状态过渡到跳跃的过程中,我将条件grounded
设置为true。
这是下面的代码
private CharacterController controller;
private float jumpForce = 4.0f;
private float gravity = 12.0f;
private float verticalVelocity;
void Update()
{
Vector3 moveVector = Vector3.zero;
moveVector.x = (targetPosition - transform.position).normalized.x * speed;
bool isGrounded = IsGrounded();
animator.SetBool("jumping", isGrounded);
//Calculate Y
if (isGrounded) //if grounded
{
verticalVelocity = -0.1f;
if(Input.GetKeyDown(KeyCode.Space))
{
//jump
animator.SetTrigger("jumping");
verticalVelocity = jumpForce;
}
else
{
verticalVelocity -= (gravity * Time.deltaTime);
//fast faling mechanic
if(Input.GetKeyDown(KeyCode.Space))
{
verticalVelocity = -jumpForce;
}
}
}
}
private bool IsGrounded()
{
Ray groundRay = new Ray(new Vector3(
controller.bounds.center.x,
(controller.bounds.center.y - controller.bounds.extents.y) + 0.2f,
controller.bounds.center.z),
Vector3.down);
return (Physics.Raycast(groundRay, 0.2f + 0.1f));
}
非常感谢任何想法!
答案 0 :(得分:0)
如果您希望Unity系统处理您的physics,那么您将不得不在其中使用Rigidbody
组件。
否则,您需要模拟加速度。通过提高FixedUpdate
float gravityVelocity = 0f;
float gravityFactor = 0.5f;
float gravityAcceleration = 9.2f * gravityFactor;
void FixedUpdate()
{
gravityVelocity += gravityAcceleration * Time.fixedDeltaTime;
gameObjectToUpdate.transform.position +=
new Vector3(0, gameObjectToUpdate.transform.position.y - gravityVelocity, 0);
}