프로젝트/[조코딩] 플래피버드 클론 게임 개발

[조코딩] 플래피버드 클론 게임 개발 - C3 : 점수 UI와 게임 종료

순정법사 2023.02.16
더보기

강의 목차

 

A. 게임 엔진 소개

B. 유니티 설치 및 세팅 (+ VS Code)

👉 C. 플래피버드 클론 게임 개발 

D. 스마트폰 테스트

E. 플래피버드 앱 생성

F. google play 스토어 등록

G. 애드 네트워크의 개념과 애드몹(Admob)

 

C. 플래피버드 클론 게임 개발 -3

7. 점수 표시하는 UI 만들기

a. UI > Canvas(ScoreCanvas) 생성하기

생성완료

 

🧡 Rect Transform의 개념과 활용

✔ 일반적인 오브젝트 = Transform :  GameObject의 상대 위치, 회전 및 크기를 정의하기 위한 구성 요소를 가짐

 

✔ UI = Rect Tansform : Transform이지만 개체를 ​​UI 요소로 관리하기 위한 추가 정보를 가지고 있음
아래 보면 Anchors / Pivot 이 추가되있는데, 각각의 정의는 아래와 같다
즉, 큰화면 / 작은화면 상관없이 동일하게 제작하기 위해 기준점을 가지고 포지션을 정한다고 할 수 있음


앵커와 피벗의 정의 (공식문서)


출처 : https://answers.unity.com/questions/1626018/what-is-the-difference-between-transform-and-rectt.html

 

b. ScoreText에서 Text(UI) 생성하고 Anchor 등 설정하기

0) Text를 생성하기

 

 

1) Anchor을 맞추기

 

min 0, 0.8 / max 1, 1

 

2) 크기 및 설정하기

 

left, top, right, bottom, position Z 0

 

 

🧡 Anchor / Anchor에 따른 Stretch 이해하기

캔버스 전체 맞추기 = 최소값 0, 최대값 1

위와같이 최소값 0, 최대값 1로 맞춘다면 캔버스 가득 앵커가 맞춰지게 됨

위의 상태에서 객체의 크기를 0으로 맞춰줘서 앵커와 동일하게 하면 아래와 같이 앵커와 크기가 동일해짐!

 

C. Text에 Score 스크립트 만들기

 

🧡 static의 개념

간단하게만 적자면, static 을 클래스 밖에서도 클래스에 접근해서 조작할 수 있음

 

[코드설명]

 

a) 제어가능한 숫자 score을 선언해 주기

b) 업데이트 함수에 score을 텍스트로 받기

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class Score : MonoBehaviour
{
    public static int score = 0;    // a) 
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        GetComponent<Text>().text = score.ToString(); // b) 스코어의 텍스트를 받기
    }
}

 

d. 파이프를 지나갈 때 점수 올려주는 기능 구현하기

1) 파이프 프리팹 안에 CreateEmpty(ScoreUp) 생성하기 

 

 

삭제해서 Hierarchy에 없다면 프리팹에서 끌어다 가져오면 됨

 

2) 충돌을 감지할 Box Collider 2D를 생성하고 위치를 잡아주기

 

Is Trigger 체크하기

 

 

🧡 Collision, Trigger 차이점

✔ Collision 충돌해서 지나가지 못함

✔ Trigger 관통 가능

 

3) 변경된 프리팹을 Apply 하고 Hierarchy에서 삭제하기

 

 

4) ScoreUp에 ScoreUp 스크립트 생성하기

 

 

[코드설명]

 

a) OnTriggerEnter2D: 트리거에 진입 했을 떄 발동

b) 위에서 Text에 Score스크립트에서 전역으로 선언한 score 변수를 1점씩 올림 

 

public class ScoreUp : MonoBehaviour
{
    private void OnTriggerEnter2D(Collider2D other) {   // a) 
        Score.score++;  // b) 
    }
}

 

5) 여기까지의 결과물

 

파이프가 중간부터 나오는건 이후에 수정했다 (왜 몰랐지..)

 


8. GameOver Scene 만들기

a. SampleScene 을 PlayScene으로 rename

 

 

b. File -> New Scene (Basic 2D) 으로 새로운 씬 생성 

  • 이름 : GameOverScene
  • 폴더 경로 : PlayScene  

 

 

c. GameOverScene 설정하기

0) Canvas 추가하기

1) Canvas -> Panel 생성하고 Panel 에 배경이미지 넣어주기

2) Color로 살짝 어둡게 설정

 

 

3) Panel안에 Image 추가해서 GameOver 생성하기

     Preserve Aspect 로 비율 맞춰주기

 

 

4) Anchor로 크기 맞추기

  • Anchor : min 0.1, 0.8 / max 0.9, 1
  • Left, Top , posX 등 모두 0으로 맞추기

 

 

5) Score(text) 생성 후 Anchor, 크기 맞추기

  • Anchor : min 0.1, 0.7 / max 1, 0.8
  • Left, Top , posX 등 모두 0으로 맞추기
  • 색상, 내용, 크기, 정렬 맞춰주기

 

 

6) 위 Score 복사 후 BestScore 생성하기

 

Anchor 알맞게 조절해주기

 

7) Button(UI) 생성하기 

  • Anchor : min 0, 0.4 / max 1, 0.5
  • Left, Top , posX 등 모두 0으로 맞추기

 

안에 자동으로 생성되는 Text는 삭제하기

 

 

위까지 했으면 잘 저장하고 PlayScene으로 넘어가기 

 

9. Scene 전환하기

a. Scene 전환 타이밍 알기

기본적으로, 파이프와 새가 부딪혔을때 게임이 종료되어야 함으로, 새가 가지고 있는 스크립트에 충돌 함수를 넣어주면 됨!

 

b. BirdJump 충돌 구현하기

public class BirdJump : MonoBehaviour
{
	...

    private void OnCollisionEnter2D(Collision2D other) {
        SceneManager.LoadScene("GameOverScene");
    }
}

 

c. Build Setting 에 추가되어있지 않은 GameOverScene을 추가해주기

 

여기까지 진행상황 

 

Text에 Score 스크립트가 빠져서 점수가 안올라감 (수정완료)

 

 

10. GameOverScene 기능 구현하기 

a. Button 기능 구현하기

0) createEmpty로 Replay 객체 생성

 

1) Replay 객체에 Replay Script 생성하기

 

 

2) Replay Script 작성하기

 

버튼을 누르면 플레이 씬이 로드되게 하기

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;

public class Replay : MonoBehaviour
{
   
   public void ReplayGame(){
       SceneManager.LoadScene("PlayScene");
   }
}

 

3) Button에 있는 On Click()에 위에서 작성한 Replay 객체를 넣어주기

 

4) Replay 객체가 가지고 있는 속성 ReplayGame()을 설정하기

 

 

b. CurrentScore 스크립트 만들기

1) Score에 CurrentScore Script를 생성함

 

 

2) CurrentScore 작성

 

[코드설명]

 

a) 현재 사용하고 있는 텍스트를 올라가고 잇는 점수로 넣어줌

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class CurrentScore : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        GetComponent<Text>().text = "Score : " + Score.score.ToString(); // a)
    }
}


c. Score 초기화, Best Score 생성하기

1) 시작할 때 점수가 유지되어서 실행되니, Start() 함수에 점수를 초기화 하는 코드를 넣어줌

2) bestScore 변수를 생성해줌

 

public class Score : MonoBehaviour
{
    public static int score = 0;   		
    public static int bestScore = 0;   // 2) 
    
    void Start()
    {
        score = 0;		// 1) 
    }

	...
}

 

d. Best Score 갱신하기

새가 부딪히는 순간 게임이 끝나고, 거기서 점수를 비교해야 하니 BirdJump.cs에서 구현

 

public class BirdJump : MonoBehaviour
{

    ...

    private void OnCollisionEnter2D(Collision2D other) {
        if(Score.score > Score.bestScore){
            Score.bestScore = Score.score;
        }

        SceneManager.LoadScene("GameOverScene");
    }
}

 

e. BestScore 객체에 BestScore.cs 생성하기 

 

 

b. Score 표시 스크립트 생성하기와 거의 동일하게 작성

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class BestScore : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        GetComponent<Text>().text = "BestScore : " + Score.bestScore.ToString(); // a)
    }

}


f. 너무 높이 날았을때 GameOver 전환

1) playScene에서 CreateEmpty로 Upside라는 객체를 생성

2) 후 Collider 달아준 후 위치와 크기를 잡아줌

 

 

g. 진행과정

여기까지 진행됐다!

 

 

 


출처 : 조코딩 유튜브