ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Unity 2D] Fly Bird 대기화면 UI 구현하기 (Animation조금 활용)
    Unity 2D 2023. 3. 26. 15:54

    bird가 start 하기 전 제자리에서 날고 있을 때의 화면을

    UI와 Animation을 이용해서 좀 꾸며보자.

    이번 작업은 꽤 간단하다...!

     

    이렇게 원래 기본 화면에서 텍스트를 2개 추가해서 만들었다.

    이제 이 Tap 부분이 깜빡깜빡 거리게 애니메이션 효과를 조금 넣을 예정이다.

     

     

     

    Window → Animation → Animation 클릭

    원하는 곳에 애니메이션 컨트롤러를 위치시키면 된다.

    애니메이션을 구현할 오브젝트를 클릭해보면 create 버튼이 활성화가 된다.

    Create를 클릭한다.

     

    애니메이션과 애니메이터를 저장할 경로를 선택할 수 있는데,

    Asset에 애니메이션 폴더를 추가한 뒤 그 곳에 저장하면 된다. (본인 마음대로 하면 됨)

    애니메이션 이름은 Text 라고 저장하겠다.

     

    TapText에 Animator가 자동으로 생성된 것을 확인할 수 있다.

    Controller 이름은 TapText인데, 이건 애니메이션들을 컨트롤 해주는 전체 컨트롤러라고 생각하면 된다.

    우린 TapText 컨트롤러를 이용해서 Text 라는 애니메이션을 구현하는 것이다.

     

    TapText오브젝트를 클릭 후 애니메이션 툴을 확인해보면 녹화 버튼이 활성화가 된 것을 볼 수 있다.

     

    애니메이션 창에 오른쪽 상단 메뉴를 클릭해보면

    눈금을 초 단위와 프레임 단위 둘 중 하나 선택할 수 있게 되어 있다.

    초 단위가 익숙한 나니까 초 단위로 선택해서 만든다.

    보통 초 단위로 애니메이션을 만들 때 60초를 디폴트로 두고 만든다고 한다.

     

     

    하지만 나는 삐뚤은 어른이니까 60초 말고 40초를 디폴트로 둘 거다.

    위에 숫자 입력하는 곳은

    어느 위치로 이동하고 싶을 때 숫자를 입력해서 해당 범위로 이동할 수 있게 한다.

     

    0에서 Text를 활성화시킨다.

    20초 때 Text를 비활성화한다.

    40초 때 다시 Text를 활성화 시키면 된다.

    끝..^^

    애니메이션 녹화 후 변화가 있는 곳은 보는 것 처럼 미세하게 빨간 색으로 표시가 된다.

    이제 녹화 버튼을 끈다.

     

    플레이 해보면 Tap이 깜빡깜빡 거리는 걸 알 수 있다.

    (플레이 하고 보니 Tap 속도가 너무 빨라서 다시 60초 디폴트로 바꾼 건 안 비밀)

     

     

     

     

    이제 이 Ready UI가 게임이 시작되면 비활성화 될 수 있게 해보자.

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class Player : MonoBehaviour
    {
        // Ready 구현
        [SerializeField] private float readyPower = 0.3f;
    
        // 게임오버 UI
        public GameObject GameOverUI;
    
        // 레디 UI
        public GameObject ReadyUI;
    
        void Update()
        {
            
            InputBird();
    
            if(GameManager.isStart == false)
            {
                ReadyBird();
                return;
            }
            
            RotateBird();
            MoveBird();
        }
    
        void InputBird()
        {
            if(GameManager.isDeath == true)
            {
                return;
            }
            // 스페이스바 혹은 마우스 좌버튼을 눌렀을 때
            keyJump |= Input.GetKeyDown(KeyCode.Space);
            keyJump |= Input.GetMouseButtonDown(0);
    
            // Bird가 시작했을 때 내려오지 않는 버그 수정
            if(GameManager.isStart == false && keyJump == true)
            {
                GameManager.isStart = true;
                ReadyUI.SetActive(false);
            }
        }

    Ready UI 를 선언하고 오브젝트를 인스펙터 창에 끌어온다.

    Bird가 시작을 인지함과 동시에 ReadyUI 는 SetActive(false)가 된다.

     

     

     


    전체 코드

    더보기

    Player.cs

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class Player : MonoBehaviour
    {
        // Jump 구현
        Rigidbody2D rb;
        [SerializeField] float Speed = 5f;
        private bool keyJump = false;
    
        // Rotate 구현
        [SerializeField] private float upRotate = 5f;
        [SerializeField] private float downRotate = -5f;
        private Vector3 birdRotation;
    
        // Move 구현
        [SerializeField] private float moveSpeed = 5f;
    
        // Ready 구현
        [SerializeField] private float readyPower = 0.3f;
    
        // 게임오버 UI
        public GameObject GameOverUI;
    
        // 레디 UI
        public GameObject ReadyUI;
    
        void Start()
        {   // RigidBody2D 컴포넌트를 rb라는 변수를 통해 가져온다
            rb = this.GetComponent<Rigidbody2D>();
        }
    
        void Update()
        {
            
            InputBird();
    
            if(GameManager.isStart == false)
            {
                ReadyBird();
                return;
            }
            
            RotateBird();
            MoveBird();
        }
    
        private void FixedUpdate()
        {
            // 게임 물리 연산은 FixedUpdate 메서드 안에서 진행한다 
            // 입력받은 Jump값이 true라면
            if (keyJump == true)
            {
                // JumpBird메서드 받기
                JumpBird();
                // 그리고 다시 keyJump값은 false로 만들어준다
                keyJump = false;
            }
        }
    
        void ReadyBird()
        {
            if (rb.velocity.y < 0)
            {
                rb.velocity = Vector2.up * readyPower;
            }
        }
    
        void JumpBird()
        {   // Rigidbody의 velocity 는 Speed 만큼 올라간다 
            rb.velocity = Vector3.up * Speed;
        }
    
        void InputBird()
        {
            if(GameManager.isDeath == true)
            {
                return;
            }
            // 스페이스바 혹은 마우스 좌버튼을 눌렀을 때
            keyJump |= Input.GetKeyDown(KeyCode.Space);
            keyJump |= Input.GetMouseButtonDown(0);
    
            // Bird가 시작했을 때 내려오지 않는 버그 수정
            if(GameManager.isStart == false && keyJump == true)
            {
                GameManager.isStart = true;
                ReadyUI.SetActive(false);
            }
        }
    
        void RotateBird()
        {
            // upRotate와 downRotate를 누적해서 저장할 변수 degree 초기화
            float degree = 0;
            if(rb.velocity.y > 0)
            {
                // upRotate 누적
                degree = upRotate;
            }
            else if(rb.velocity.y < 0)
            {
                // downRotate 누적
                degree = downRotate;
            }
    
            // birdRotation을 오일러각으로 변환하여 최댓값 30, 최솟값 -90을 받는다 
            birdRotation = new Vector3(0, 0, Mathf.Clamp((birdRotation.z + degree), -90, 30));
            transform.eulerAngles = birdRotation;
        }
    
        void MoveBird()
        {
            if(GameManager.isDeath == true)
            {
                return;
            }
            // Bird가 앞으로 이동하는 것 구현하기
            transform.Translate(Vector3.right * moveSpeed * Time.deltaTime, Space.World);
        }
    
        void GetScore()
        {
            GameManager.score++;
        }
    
        void ShowDeathUI()
        {
            GameManager.isDeath = true;
            GameOverUI.SetActive(true);
        }
    
        void OnTriggerEnter2D(Collider2D coll)
        {
            if(coll.gameObject.tag == "Score")
            {
                GameManager.isDeath = false;
                GetScore();
            }
        }
    
        void OnCollisionEnter2D(Collision2D coll)
        {
            if(coll.gameObject.tag == "Pipe" || coll.gameObject.tag == "Ground")
            {
                ShowDeathUI();
            }
        }
    }
Designed by Tistory.