본문 바로가기
Hello, World!/Unity

유니티 2D 런게임을 만들자(5)

by 27일 낮 2022. 3. 8.
728x90

Canvas!

Render Mode - Screen Space - Camera 개념으로 사용을 했다

3d에선 보기가 어렵다! 3d입체공간이기 때문에 Screen Space - Camera / Overlay 상관 없다

 


점수를 구현하는 텍스트!
Canvas - UI - Text 추가

 

 

Rect Transform : 텍스트 상자의 사이즈임! 2D에서 적용되는 애

 

Width 300, Height 80으로 만들어줌

 

앵커 프리셋 : 기존 위치를 잡아주는 거

alt + shift (bottom + center)

 

 

 

그리고 텍스트도 써주자

사이즈, 정렬 변경두!

 

 

근데 폰트도 바꾸고 싶다!

어떻게 바꾸죠?

 

 

공식 홈페이지를 잘 봐줘야한다

 

유니티 홈페이지 - 기술 자료 (링크)

Unity Editor Manual Read More을 눌러주자!

 

 

폰트! (링크)

지원되는 폰트의 포맷은 TrueType 폰트(.ttf 파일)와 OpenType 폰트(.otf 파일)입니다.

 

 

폰트 할당해주고,

Horizontal Overflow, Vertical Overflow를 Overflow로 변경

 

 

와 폰트 예쁘다~

색도 바꿔주자~

 

시인성 : 눈에 확 띄는 것!

을 고려해주자~

Outline 또는 Shadow 컴포넌트를 추가해주면 좋다

 

 

GameOver 문구도 써줄건데, 지난번엔 텍스트를 썼으니 이번엔 이미지로 가져와보자!

GameOver 이미지 파일을 준비하고 Project뷰의 Sprites 안에 끌어오기

 

 

Canvas에 UI - Image추가

 

 

Image의 Source Image에 연결해주면 된다

크기가 요상하네요

 

 

Set Native Size를 눌러주면 기존 이미지를 유지함!

 

 

근데 짱커졌음

스케일 조정 ㄱㄱ

앵커 프리셋 설정까지 해주면 됨

Alt + Shift (middle+ center)

Y값도 조정해서 살짝 올려줌

 

 

 

텍스트보다 이미지로 했을 때 장점? -> 다양한 효과 주기에 좋다

 

 

 

Restart Text 라는 이름의 Text 생성

Jump To Restart! 이라고 작성해주고, 폰트, 크기 조절, 색상 변경 등 해주고

GameOver_Image의 자식 안에 넣어주기

 

 

디자인 패턴 : 개념을 가지고 풀이를 하는 것.. 알고리즘..

 

 

게임 매니저 만들기

1. 점수 저장

2. 게임오버 상태 표현

3. 플레이어의 사망을 감지해 게임오버 처리 실행

4. 점수에 따라 점수 UI  텍스트 갱신

5. 게임오버 되었을 때 게임오버 UI 활성화

 

위 부분을 구현 위해 싱글톤 패턴을 사용

 

싱글톤 패턴? 디자인 패턴의 일종임

  1. 프로그램에 단 하나만 존재해야 함 (단일 오브젝트)
    1. 게임 매니저처럼 관리자 역할을 하는 것들,, 일반적으로 프로그램에 단 하나에 존재해야 함
    2. 예를 들어 점수를 저장하는 오브젝트가 단독이 아니라 두 개라면..? -> 점수가 두번 저장됨.. 오류
  2. 누구나 쉽게 언제든지 어디서든지 즉시 접근 가능해야 됨

이 개념을 가지고 있는게 싱글톤 패턴임! 

 

=> 단일, 손쉬운 접근

 

이걸 코드로 해야한다! 어떻게 하나요?

손쉬운 접근 = 한정자 = static : 정적

 

 

스크립트를 구현하면서 배워보자~!!!

 

 

GameManager.cs 생성

 

 

프로그래밍 언어적으로 접근해보자

 

 

static이 머죠?

  • 메서드나 필드가 클래스의 인스턴스가 아닌 클래스 자체에 소속되도록 지정하는 한정자임
  • 인스턴스를 만들지 않고도 바로 호출이 가능하다
class MyClass
{
	public static void StaticMethod()
    {
    	...
    }
}
...
MyClass.StaticMethod();

 

 

(인스턴스 메소드일 경우 - 인스턴스를 만들어야 호출이 가능하다)

class MyClass
{
	public void InstanceMethod()
    {
    	...
    }
}
...
MyClass obj = new MyClass();
obj.InstanceMethod();

 

 

 

스크립트 파일을 할당해주는 것..

그것이 인스턴스라는 작업이 대신 처리가 되었던것임

 

하나의 스크립트 파일은 설계도임

붕어빵 틀이라고 생각하세오

붕어빵 틀을 가지고 실제 붕어빵을 만들어야함! 이 붕어빵이 인스턴스임

 

 

C# Script = 클래스 = 설계도 = 붕어빵 틀

붕어빵 틀을 가지고 만든 실제 붕어빵 = 객체! 인스턴스라고 함!

이러한 일련의 과정을 인스턴스화라고 함

 

static 처리를 하게 되면 붕어빵틀을 만들지 않아도 붕어빵을 만들 수 있다!!

 

 

 

 

GameManager 빈 게임오브젝트 만들고 GameManager 할당

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

// 게임오버 상태를 표현하고, 게임 점수와 UI를 관리하는 매니저
// 씬에는 단 하나의 게임 매니저만 존재할 수 있음 
public class GameManager : MonoBehaviour
{
    public static GameManager instance; // 싱글턴을 할당할 전역 변수

    public bool isGameover = false; // 게임오버 상태
    public Text scoreText; // 점수를 출력할 UI 텍스트
    public GameObject gameoverUI; // 게임오버시 활성화할 UI 오브젝트

    private int score = 0; // 게임 점수

    // 게임 싲가과 동시에 싱글턴을 구성
    private void Awake()
    {
        // 싱글턴 변수 instance가 비어 있나요?
        if (instance == null)
        {
            // instance가 비어 있다면 그곳에 내 자신을 할당해줘
            instance = this;
        }
        else
        {
            // instance에 이미 다른 GameManager 오브젝트가 할당되어 있다면...

            // 씬에 두 개 이상의 GameManager 오브젝트가 존재한다는 의미.
            // 싱글턴 오브젝트는 하나만 존재해야 하므로
            // 자신의 게임 오브젝트를 파괴
            Destroy(gameObject);
        }
    }

    // 게임오버 상태에서 게임을 재시작할 수 있게 하는 처리
    void Update()
    {
        // 게임오버 상태에서 마우스 왼쪽 버튼을 클릭한다면
        if (isGameover && Input.GetMouseButtonDown(0))
        {
            SceneManager.LoadScene(SceneManager.GetActiveScene().name);
            // 현재 활성화 되어 있는 씬의 이름을 가져와~
            
            // SceneManager.LoadScene("Main");
        }
    }

    // 점수를 증가시키는 메서드
    public void AddScore(int newScore)
    {
        // 게임오버가 아니라면
        if (!isGameover)
        {
            // 점수를 증가
            score += newScore;
            scoreText.text = "Score : " + score;
        }

        // 같은 의미
        //if (isGameover) return;

        //score += newScore;
        //scoreText.text = "Score : " + score;
    }

    // 플레이어 캐릭터가 사망 시 게임오버를 실행하는 메서드
    public void OnPlayerDead()
    {
        isGameover = true;
        gameoverUI.SetActive(true);
    }
}

댓글