public class PlayerMovement : MonoBehaviour
{
// Start is called before the first frame update
private Rigidbody2D rb;
private BoxCollider2D coll;
private SpriteRenderer sp;
private Animator anim;
public float v;
[SerializeField]private LayerMask jumpableGround;
[SerializeField]private float movespeed;
[SerializeField]private float jumpspeed;
private enum MovementState
{ idle,
runing,
jumping,
falling,
}
[SerializeField] private AudioSource jumpSoundEffect;
private void Start()
{
rb = GetComponent<Rigidbody2D>();
coll = GetComponent<BoxCollider2D>();
sp = GetComponent<SpriteRenderer>();
anim = GetComponent<Animator>();
}
// Update is called once per frame
void Update()
{
float v = Input.GetAxisRaw("Horizontal");
rb.velocity = new Vector2(v * movespeed, rb.velocity.y);//竖直方向速度
//if (Input.GetKeyDown("space"))//GetKey可以一直上升,GetKeyDowm效果类似二段跳
//{
//GetComponent<Rigidbody2D>().velocity = new Vector3(0,7,0);
//}
if (Input.GetButtonDown("Jump")&&IsGrounded())//设定只能从地上跳一次
{
jumpSoundEffect.Play();
rb.velocity = new Vector2(rb.velocity.x, jumpspeed);
}
UpdateAnimationState();
}
private void UpdateAnimationState()
{
MovementState state;
if (v > 0f)
{
state = MovementState.runing;
sp.flipX = false;//画布翻转,让后退和前进保持一致
}
else if (v < 0f)
{
state = MovementState.runing;
sp.flipX = true;
}
else
{
state = MovementState.idle;
}
if (rb.velocity.y > .1f)
{
state = MovementState.jumping;
}
else if(rb.velocity.y < -.1f)
{
state = MovementState.falling;
}
anim.SetInteger("state", (int)state);
}
private bool IsGrounded()
{
return Physics2D.BoxCast(coll.bounds.center,coll.bounds.size,0f,Vector2.down,jumpableGround);
}
}
下面是动画机控制
public class PlayerLife : MonoBehaviour
{
// Start is called before the first frame update
private Rigidbody2D rb;
private Animator anim;
[SerializeField]private AudioSource deathSoundEffect;
void Start()
{
rb = GetComponent<Rigidbody2D>();
anim = GetComponent<Animator>();
}
// Update is called once per frame
private void OnCollisionEnter2D(Collision2D collision)
{
if (collision.gameObject.CompareTag("Trap"))
{
deathSoundEffect.Play();
Die();
}
}
private void Die()
{
rb.bodyType = RigidbodyType2D.Static;
anim.SetTrigger("death");//配合动画控制器的Trigg类型使用,播放动画
}
private void RestartLevel()
{
SceneManager.LoadScene(SceneManager.GetActiveScene().name);
}
}