사생활 보호 설정
https://gamjia.tistory.com
Updated News
Mini Rooms
답글수 [0]
What Friends Say
한마디로 표현해봐~
1촌평 관리
[Day 6] Flappy Bird Tutorial 5
GamJia 2024. 11. 12. 20:01
오블완 챌린지 6일차
Cocos Creator의 Post Process 설정을
건드렸다가 갑자기 일어난 버그 파티
때문에 멘붕했던 GamJia 입니다
오늘 드디어 Flappy Bird 강의의
마지막 날입니다!
UI는 이렇게 Lobby(시작 화면) /
In Game(게임 중 화면) / Game Over(게임 오버 화면)
으로 분리했습니다!
왼쪽부터 Lobby / In Game / Game Over
로비에 있는 start 버튼에
Lobby를 비활성화하고
In Game을 활성화 하는
On Click Event를 연결해줄게요
using System.Collections; using System.Collections.Generic; using UnityEngine; using TMPro; // TextMeshPro 사용을 위해 추가 using UnityEngine.SceneManagement; // SceneManager 사용을 위해 추가 public class UIManager : MonoBehaviour { [SerializeField] GameObject gameover; [SerializeField] TextMeshProUGUI[] currentScore; [SerializeField] TextMeshProUGUI bestScoreText; private int score = 0; private int bestScore = 0; public static UIManager Instance => instance; private static UIManager instance; private void Awake() { if (instance == null) { instance = this; DontDestroyOnLoad(gameObject); // Singleton이 파괴되지 않도록 설정 } else { Destroy(gameObject); // 다른 인스턴스가 있으면 새로 생성된 것을 삭제 } LoadBestScore(); } public void UpdateScore() { score++; for (int i = 0; i < currentScore.Length; i++) { currentScore[i].text = score.ToString(); } } public void GameOver() { gameover.SetActive(true); Time.timeScale = 0f; if (score > bestScore) { bestScore = score; bestScoreText.text = bestScore.ToString(); SaveBestScore(); } } public void ResetGame() { Time.timeScale = 1f; Scene currentScene = SceneManager.GetActiveScene(); // 현재 Scene 가져오기 SceneManager.LoadScene(currentScene.name); // 현재 Scene 이름으로 다시 로드 } private void SaveBestScore() { PlayerPrefs.SetInt("BestScore", bestScore); PlayerPrefs.Save(); } private void LoadBestScore() { if (PlayerPrefs.HasKey("BestScore")) { bestScore = PlayerPrefs.GetInt("BestScore"); bestScoreText.text = bestScore.ToString(); } } }
UI를 관리할 UI Manager를 하나 만들어주겠습니다
일단 여기에는 다른 코드에는 없던
Instance 관련 내용이 있는데요
이거는 싱글톤 패턴(Singleton Pattern)을 구현한 부분입니다.
싱글톤 패턴을 사용하면 클래스의 인스턴스
애플리케이션 전체에서 오직 하나만 존재하게 됩니다.
UI Manager 클래스가 싱글톤 패턴으로 설정되었으므로,
게임 내에서 UI Manager 인스턴스를 여러 개
만들지 않고 하나만 유지하려는 목적을 가지고 있습니다.
3강에서 Pipe에 연결한 Trigger Collider 기억하시나요?
Instance가 있으면 UI와 멀리 떨어진 객체인
Pipe가 멀리서 UI Canvas에 명령 하는게
가능해지는겁니다!
현재 점수를 표시하는 Text Mesh Pro는
In Game / Game Over에 각각 있어서
관리하기 쉽게 배열로 선언했습니다
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Pipe : MonoBehaviour { private float speed=1.5f; void Update() { transform.position+=Vector3.left*speed*Time.deltaTime; // 현재 객체의 위치를 왼쪽으로 speed 속도로 이동 시킵니다 } private void OnTriggerEnter2D(Collider2D other) { UIManager.Instance.UpdateScore(); } }
전에 작성한 Pipe를 열어서
OnTriggerEnter2D(2D 꼭 붙어야함)를 추가하고
Pipe의 Trigger Collider에 Collider가 닿으면
UI Manager의 UpdateScore를 호출하겠습니다
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Player : MonoBehaviour { private Rigidbody2D rigidbody; private float velocity = 5f; private float speed=4f; void Start() { rigidbody=GetComponent<Rigidbody2D>(); } void Update() { if (Input.GetMouseButton(0)) { if (this.rigidbody.bodyType == RigidbodyType2D.Kinematic) { this.rigidbody.bodyType = RigidbodyType2D.Dynamic; // Kinematic이면 Dynamic으로 변경 } rigidbody.velocity=Vector2.up*velocity; } } void FixedUpdate() { transform.rotation=Quaternion.Euler(0,0,rigidbody.velocity.y*speed); } private void OnCollisionEnter2D(Collision2D other) { UIManager.Instance.GameOver(); } }
Player(새)도 같은 방식으로
바닥이나 Pipe에 물리적 충돌이 일어났을 때
UI Manager의 GameOver를 불러서
gameover UI창을 띄워주겠습니다
private void LoadBestScore() { if (PlayerPrefs.HasKey("BestScore")) { bestScore = PlayerPrefs.GetInt("BestScore"); bestScoreText.text = bestScore.ToString(); } }
그리고 Unity에는 Local Data를
저장할 수 있는 기능이 있답니다
저장할 수 있는 Data Type은
Int, Float, String Type이며
GetInt 옆에 붙은건 Data 이름입니다!
https://docs.unity3d.com/ScriptReference/PlayerPrefs.html
Unity - Scripting API: PlayerPrefs
Unity stores PlayerPrefs in a local registry, without encryption. Do not use PlayerPrefs data to store sensitive data. Unity stores PlayerPrefs data differently based on which operating system the application runs on. In the file paths given on this page,
docs.unity3d.com
마지막으로 현재 Scene을 다시
불러옴으로써 Scene을 Reset하는 기능의
ResetGame을 Restart Button에
연결해주면 게임 완성입니다!
GIF용이라 영상 속도를 좀 빠르게 한겁니다^_^;;
현업에서는 게임 시작-과정-끝
이 과정을 한 사이클이라고 부르는데요
저랑 함께 Flappy Bird의
사이클을 만든 소감이
어떨지 궁금합니다!
사실 이런식의 강의는 처음이라
부족한 부분이 많았을텐데
그래도 끝까지 봐주셔서 감사합니다!
오늘은 여기까지 하고
GitHub에 Commit하는걸로
마무리 하겠습니다!
원래 다음 게임은
인피니티런, 흔히 공룡게임이라고 아는
그 게임 강의를 올리려고 하다가
너무 금방 끝날거 같아서;;
방금 게임을 좀 바꾼 참입니다..
사실 저도 만들어본적 없는데
그냥 해보는겁니다.........
감사합니다!!