유니티/유니런(2D 러닝 게임)

유니런(2) - 애니메이션

무직백수취업준비생 2021. 8. 7. 10:06
728x90
반응형

 

애니메이터 탭을 열어줍니다.

 

저번 Run 애니메이션을 만들 때 실수로 중복해서 Run_anim과 Run 이렇게 두 개 만들었는데

 

Run_anim을 지웠었지만 애니메이터에 저장되어버린 모습입니다.

 

애니메이터에서 Run_anim을 지우고 Run을 기본으로 설정해줍니다.

 

이제 전이를 구성해보겠습니다.

 

캐릭터는 기본적으로 Run상태이지만

 

사용자가 점프키를 입력하면 Jump애니메이션을 출력합니다.

 

캐릭터가 다시 바닥에 닿으면 Run을 출력해야하기에 Run과 Jump는 양방향으로 연결됩니다.

 

어느 상황이든 캐릭터가 죽으면 Die를 출력하기위해 Any State에서 Die로 전이를 연결합니다.

 

이제 피라미터를 추가합니다.

 

캐릭터가 바닥에 닿았을땐 true로 Run을

 

바닥에 닿지 않았을땐 False로 Jump를 출력하기 위해 

 

바닥에 접촉했는지 여부를 Grounded 피라미터가 bool타입으로 판별합니다.

 

Die 피라미터는 trigger타입입니다.

 

이제 전이들을 설정해줍니다.

 

전이 설정이 끝나면 PlayerController 스크립트를 작성합니다.

 

using UnityEngine;

// PlayerController는 플레이어 캐릭터로서 Player 게임 오브젝트를 제어한다.
public class PlayerController : MonoBehaviour {
   public AudioClip deathClip; // 사망시 재생할 오디오 클립
   public float jumpForce = 700f; // 점프 힘

   private int jumpCount = 0; // 누적 점프 횟수
   private bool isGrounded = false; // 바닥에 닿았는지 나타냄
   private bool isDead = false; // 사망 상태

   private Rigidbody2D playerRigidbody; // 사용할 리지드바디 컴포넌트
   private Animator animator; // 사용할 애니메이터 컴포넌트
   private AudioSource playerAudio; // 사용할 오디오 소스 컴포넌트

   private void Start() {
        //게임 오브젝트로부터 사용할 컴포넌트들을 가져와 변수에 할당
        playerRigidbody = GetComponent<Rigidbody2D>();
        animator = GetComponent<Animator>();
        playerAudio = GetComponent<AudioSource>();
   }

   private void Update() {
        if(isDead)
        {
            //사망 시 처리를 더 이상 진행하지 않고 종료
            return;
        }

        //마우스 왼쪽 버튼을 눌렀으며 &&최대 점프 횟수(2)에 도달하지 않았다면
        if(Input.GetMouseButtonDown(0) &&jumpCount<2)
        {
            //점프 횟수 증가
            jumpCount++;
            //점프 직전에 속도를 순간적으로 제로(0, 0)로 변경
            playerRigidbody.velocity = Vector2.zero;
            //리지드바디에 위쪽으로 힘 주기
            playerRigidbody.AddForce(new Vector2(0, jumpForce));
            //오디오 소스 재생
            playerAudio.Play();
        }
        else if(Input.GetMouseButtonUp(0) &&playerRigidbody.velocity.y>0)
        {
            //마우스 왼쪽 버튼에서 손을 떼는 순간&&속도의 y값이 양수라면(위로 상승 중) 현재 속도를 절반으로 변경
            playerRigidbody.velocity = playerRigidbody.velocity * 0.5f;
        }

        //애니메이터의 Grounded피라미터를 isGrounded값으로 갱신
        animator.SetBool("Grounded", isGrounded);
   }

   private void Die() {
        //애니메이터의 Die 트리거 파라미터를 셋
        animator.SetTrigger("Die");

        //오디오 소스에 할당된 오디오 클립을 deathClip으로 변경
        playerAudio.clip = deathClip;
        //사망 효과음 재생
        playerAudio.Play();

        //속도를 제로(0,0)로 변경
        playerRigidbody.velocity = Vector2.zero;
        //사망 상태를 true로 변경
        isDead = true;
   }

   private void OnTriggerEnter2D(Collider2D other) {
        if(other.tag == "Dead"&&!isDead)
        {
            //충돌한 상대방의 태그가 Dead이며 아직 사망하지 않았다면 Die() 실행
            Die();
        }
   }

   private void OnCollisionEnter2D(Collision2D collision) {
        //어떤 콜라이더와 닿았으며 충돌 표면이 위쪽을 보고 있으면
        if(collision.contacts[0].normal.y>0.7f)
        {
            //isGrounded를 true로 변경하고 누적 점프 횟수를 0으로 리셋
            isGrounded = true;
            jumpCount = 0;
        }
   }

   private void OnCollisionExit2D(Collision2D collision) {
        //어떤 콜라이더에서 떼어진 경우 isGrounded를 false로 변경
        isGrounded = false;
   }
}

 

deathClip에 오디오 클립을 할당해줍니다.

 

플레이해보면 클릭시 점프, 2단 점프, 점프 시 오디오 출력, 마우스 클릭을 짧게 유지하면 체공시간 단축 등

 

여러 기능들이 정상적으로 작동하는걸 확인할 수 있습니다.

728x90
반응형