问题描述
我可以使用Axis.RawInput使我的精灵跳跃。当RawInput大于0时,此输入还用作触发跳跃动画的参数。此问题是当您释放键时,子画面会立即回落。一次按下或按住该键,然后让精灵以固定的速率下降,同时又触发动画,如何执行固定的跳动?
这就是我现在的PlayerMover脚本中的内容。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerMover : MonoBehavIoUr
{
public Animator anim;
public Vector3 veLocity = Vector3.zero;
public float runSpeed = 0f;
public float jumpSpeed = 0f;
private SpriteRenderer sp;
public float maxJump = 4f;
private void Awake()
{
sp = GetComponent<SpriteRenderer>();
}
void Update()
{
runSpeed = Input.GetAxisRaw("Horizontal");
jumpSpeed = Input.GetAxisRaw("Vertical");
anim.SetFloat("Jump",jumpSpeed);
anim.SetFloat("Speed",Mathf.Abs(runSpeed));
}
private void FixedUpdate()
{
Move(runSpeed,jumpSpeed*4);
}
void Move(float horizontal,float vertical)
{
if(horizontal > 0 || horizontal > 0 && vertical >0)
{
anim.SetBool("Idle",false);
sp.flipX = false;
}
else if(horizontal < 0 || horizontal <0 && vertical >0)
{
anim.SetBool("Idle",false);
sp.flipX = true;
}
else
anim.SetBool("Idle",true);
veLocity.x = horizontal;
veLocity.y = vertical;
transform.position += veLocity * Time.fixedDeltaTime;
}
}
我已经读过关于使用类似的东西
if(Input.GetKeyDown(GetKeyCode("Space"){
rigidbody2D.AddForce(new Vector2(0,10),ForceMode2D.Impulse);
}
为了移动,但是每当按下空格键时,它都允许其他跳跃。
解决方法
如果您想使用类似的东西:
if(Input.GetKeyDown(GetKeyCode("Space"))){
rigidbody2D.AddForce(new Vector2(0,10),ForceMode2D.Impulse);
}
,但是当他们已经在空中时,需要阻止玩家跳下去,只允许他们已经在地面上时才做。所以:
if(Input.GetKeyDown(GetKeyCode("Space")) && isOnFloor()){
rigidbody2D.AddForce(new Vector2(0,ForceMode2D.Impulse);
}
isOnFloor()
的某个功能可以检查您的角色是否在地板上。根据您的游戏实现,可以通过几种方法来完成此操作,但是最常见的一种方法是检查玩家角色是否与任何物体碰撞,如果存在,则该碰撞对象是否在其下方。 This stackexchange thread提供了一些有关如何实现此目标的代码示例。
为了使用它
if (Input.GetKeyDown(GetKeyCode("Space"))
{
rigidbody2D.AddForce(new Vector2(0,ForceMode2D.Impulse);
}
您需要检查玩家是否与地面相撞,因此,您将拥有bool isGrounded
之类的笨蛋来检查您是否触地,为此您可以在{{1 }}以确认它在与地面碰撞时为真。您可以使用标签来检查与之碰撞的对撞机是否为地面。然后,当您跳下时,您需要说OnCollisionStay()
,直到您再次降落在地面上时,它才会成立
isGrounded = false;