20210510 유니티 2D 런 - 싱글턴패턴

NOAH·2021년 5월 9일
0

TIL

목록 보기
50/179
post-thumbnail

TIL

레트로 2D 유니런

DONE

* 2D스프라이트가 그려지는 순서 조정하기

: 게임오브젝트가 그려지는 순서는 sprite renderer의 정렬레이어가 결정한다.

  • 반복되는 배경을 만드는 방법

  • static의 개념

* 여러 해상도에서 일관된 UIfmf 유지하는 방법

: Canvas scaler 컴포넌트 이용하기!

  • UI scale mode : Scale with screen size
  • reference resolution (640 360)

싱글턴 패턴

게임 매니저처럼 관리자 역할을 하는 오브젝트(파일 매니저, 몬스터 매니저, 점수 매니저,)는 일반적으로 프로그램에 단 하나만 존재해야 한다(단일 오브젝트). 그리고 언제든지 즉시 접근 가능해야 한다.(손쉬운 접근).

싱글턴을 사용하는 이유

  • 게임 매니저 오브젝트는 단 하나만 존재
  • 어떤 곳에서도 손쉽게 게임 매니저 오브젝트에 접근 가능

싱글턴 코드 예시

using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;

// 게임 오버 상태를 표현하고, 게임 점수와 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; // 게임 점수

    // 게임 시작과 동시에 싱글톤을 구성
    void Awake() {
        // 싱글톤 변수 instance가 비어있는가?
        if (instance == null)
        {
            // instance가 비어있다면(null) 그곳에 자기 자신을 할당
            instance = this;
        }
        else
        {
            // instance에 이미 다른 GameManager 오브젝트가 할당되어 있는 경우

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

    void Update() {
        // 게임 오버 상태에서 게임을 재시작할 수 있게 하는 처리
    }

    // 점수를 증가시키는 메서드
    public void AddScore(int newScore) {
        
    }

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

정적(static)


싱글턴 패턴을 구현할 때는 정적(static) 변수의 특징을 활용한다
클래스에 선언된 변수들은 해당 클래스 타입의 오브젝트가 생성되면 함께 생성된다.
이것은 메모리 상에 멤버 변수가 오브젝트 수만큼 존재한다는 의미.

발판구현

시작 지점 이후의 일반 발판은 플레이어 캐릭터가 밟을 경우 점수가 올라가는 기능과
발판 위에 장애물을 생성하는 기능을 가집니다.

  • 프리팹 배치

OnEnable() 메서드를 사용하여 발판 생성


OnEnble() 메서드는 Awake()나 Start()같은 유니티 이벤트 메서드입니다.
OnEable() 메서드는 컴포넌트가 활성화될 때마다 매번 다시 실행 됩니다. 따라서
컴포넌트를 끄고 다시 켜는 방식으로 재실행할 수 있습니다.

발판생성기

오브젝트를 파괴하는 대신에 비활성화시켜 풀에 반환

오브젝트 풀링(Object pulling)으로초기에 필요한 만큼 오브젝트를 미리 만들어 풀(pool)에 쌓아두는 방식

풀에 오브젝트를 생성해둔 이후에는 새로운 오브젝트가 필요할 때 새로운 오브젝트를 생성하지 않고 풀에 있는 오브젝트를 가져다 씁니다.

Instantiate()메서드처럼 오브젝트르 실시간으로 생성하거나, Destroy()메서드로 실시간으로 파괴하느 처리기능은 메모리를 정리하는 GC(가비지 컬렉션)을 유발하기 쉬워 게임 끊김(프리즈)현상을 겪에 됩니다.

Instantiate()메서드처럼 오브젝트르 실시간으로 생성하거나, Destroy()메서드로 실시간으로 파괴하느 처리기능은 메모리를 정리하는 GC(가비지 컬렉션)을 유발하기 쉬워 게임 끊김(프리즈)현상을 겪에 됩니다.

interesting

0개의 댓글