-
[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(); } } }
'Unity 2D' 카테고리의 다른 글
[Unity 2D] Fly Bird 메뉴 타이틀 씬 만들기 (+ 스코어 초기화) (0) 2023.03.26 [Unity 2D] Fly Bird 게임오버 UI 구현하기 (Best Score 저장, Button 구현) (0) 2023.03.26 [Unity 2D] Fly Bird 스코어 누적 count 하기 (+ 간단 버그 수정) (0) 2023.03.25 [Unity 2D] Fly Bird 충돌체와 충돌했을 때 Death 처리하기 (0) 2023.03.25 [Unity 2D] Fly Bird 파이프 프리팹 Spawn하기 (2) 2023.03.23