#1. Flappy Bird 게임이란?

위와 같은 게임을 본 적이 있을 것이다. 내가 만들 Flappy Bird Style 게임 방법은 아래와 같다.
새를 조정하여 가능한 많은 장애물을 피하는 게임
새는 기본적으로 아래로 떨어짐
마우스 왼쪽 버튼을 누르면 새는 날갯짓을(flap)하여 위로 떠오름
새가 땅에 닿거나 장애물에 닿으면 게임 종료
게임종료 후 마우스 왼쪽 버튼을 누르면 게임 재시작
#2. 개발 환경
위의 게임을 만들기 위해 아래와 같이 프로젝트를 생성해준다.
그런 다음 프로젝트가 만들어지는 동안 개발에 사용할 Flappy Bird의 asset을 미리 다운로드하여 놓는다.
프로젝트가 완성되고, asset도 다운로드하였다면 project뷰에 다운로드한 asset을 넣어 준다.
#3. 캐릭터 설정
위와 같은 캐릭터 png가 있을것이다. 이를 사용하기 위해 Project뷰에서 위의 png파일을 클릭한다. 그다음 인스펙터 창에서 sprite Mode를 Multiple로 설정해 준다. 그다음 Sprite Editor 버튼을 클릭하여 slice를 해준다. 이제 만들어진 캐릭터 png를 하이어라키 창에 넣어준 뒤 이름을 Bird라고 해준다.
그다음 해야 할 것들은 생략한다. 혹시나 어떤 과정을 거쳐서 게임이 만들어지는지 궁금하거나 혼자 개발하다 모르는 부분이 생기면 언제든지 댓글을 남겨주시면 답변해드리겠습니다.
#4. Bird 소스코드
Bird.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Bird : MonoBehaviour
{
public bool isDead;
public float upForce = 150f;
private Rigidbody2D rb2d;
public Animator anim;
// Start is called before the first frame update
void Start()
{
isDead = false;
rb2d = GetComponent<Rigidbody2D>();
}
// Update is called once per frame
void Update()
{
Debug.Log(isDead);
if (isDead == false)
{
if (Input.GetMouseButtonDown(0))
{
rb2d.velocity = Vector2.zero;
rb2d.AddForce(new Vector2(0, upForce));
anim.SetTrigger("Flap");
}
}
}
private void OnCollisionEnter2D(Collision2D collision)
{
rb2d.velocity = Vector2.zero;
isDead = true;
anim.SetTrigger("Die");
GameControl.instance.BirdDied();
}
}
#5. GameControl 소스코드
GameControl.cs
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
public class GameControl : MonoBehaviour
{
public bool gameOver;
public GameObject GameOverText;
public GameObject ScoreText;
public Text scoreText;
public static GameControl instance;
public float scrollSpeed = -1.5f;
int count = 0;
// Start is called before the first frame update
void Start()
{
}
void Awake()
{
GameControl.instance = this;
}
internal void BirdScored()
{
ScoreText.SetActive(true);
count = count + 1;
// SCORE 문자와 정수를 문자열로 변환한 후 더해준다
scoreText.text = "SCORE: " + count.ToString();
}
// Update is called once per frame
void Update()
{
if (gameOver == true && Input.GetMouseButton(0))
{
SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);
}
}
public void BirdDied()
{
GameOverText.SetActive(true);
gameOver = true;
}
}
#6. 완성된 플레이 사진
#7. 한마디
위의 게임을 만들면서 가장 어려웠던 부분이 바로 기둥이 계속해서 생겨야 하는데 미리 만들어 놓기에는 너무나 오래 걸리는 작업이기에 어떻게 하면 자동으로 기둥이 생길까 라는 생각을 하게 되었다. 위의 문제를 해결하는 방법으로 나는 기둥을 Prefab으로 만들어 Bird의 좌표를 계산하여 일정 시간이 지나면 Bird의 일정 거리 앞에 기둥이 생기도록 설정해 주었다. 또한 계속해서 게임을 플레이하면 기둥의 수가 매우 늘어나게 되므로 기둥이 일정 시간이 지나면 사라지는 설정도 같이 만들어 주었다.