Unity-#9.배경과 게임매니저

CHO WanGi·2024년 4월 10일

Unity

목록 보기
9/13

정렬 레이어

스프라이트 렌더러 컴포넌트 -> 앞뒤 정렬(순서)는 트랜스폼 컴포넌트와 노상관
정렬 레이어(Sorting Layer)가 결정

다만 유니티에선 가장 아래쪽 정렬 레이어가 가장 앞쪽에 그려짐을 유의하자.
즉 Player 와 Sky 컴포넌트가 존재한다면, 플레이어는 가장 아래쪽 레이어인 Foreground로, Sky 는 가장 위쪽인 Background 로 가야한다는 말.

배경 반복 스크롤링

CSS로 마치 Carousel을 만드는 원리와 비슷하다.
width 값을 부여하고,
x축 위치값(transform.position.x)과 width 값을 비교한다.
-width 값을 넘어가게되면, 너무 많이 왼쪽으로 이동했다고 판단,
2 * width 를 더하여 다시 등장할 수 있도록 한다.
(-width -> +width 로 변경하는 꼴)


public class BackgroundLoop : MonoBehaviour {
    private float width; // 배경의 가로 길이

    private void Awake() {
        // 가로 길이를 측정하는 처리
        BoxCollider2D backgroundCollider = GetComponent<BoxCollider2D>();
        width = backgroundCollider.size.x;
    }

    private void Update() {
        // 현재 위치가 원점에서 왼쪽으로 width 이상 이동했을때 위치를 리셋
        if (transform.position.x <= -width)
        {
            Reposition();
        }
    }

    // 위치를 리셋하는 메서드
    private void Reposition() {
        Vector2 offset = new Vector2(width * 2f, 0);
        transform.position = (Vector2) transform.position + offset;
    }

Vector2 Offset

현 위치에서 얼마만큼 오른쪽으로 밀어낼지 지정한 변수
offset은 Vector2 타입
transform.position은 Vector3 타입
이를 더하기 위해 Vector2로 형변환 하여 사용한 것 유의

UI-화면 크기에 따라 스케일

UI는 캔버스 게임 오브젝트 내에 두어야 함.

고정 픽셀 크기

캔버스의 크기는 게임을 실행중인 화면의 해상도로 결정,
고정 픽셀모드라면 게임을 실행하는 화면의 크기가 바뀌어도 캔버스의 크기는 고정

640 360 과 1280 720 화면에서 동일한 크기로 보여진다는 뜻

화면 크기에 따라 스케일


만약 640 360 크기에서 UI를 배치했다고 가정했을 때,
이 모드에선 게임을 실행하는 화면의 크기가 위 해상도보다 크거나 작아도
무조건 캔버스의 크기를 640
360 으로 취급하고,
다른 크기의 화면일 경우 캔버스 자체를 확대/축소함.
(즉 실제 크기와 inspector 에 뜨는 수치가 다름, 우리는 이 inspector에 뜨는 수치만 신경쓰면 알아서 조절된다는 뜻)

  • 방향 매치
    만약 실제 화면과 기준 해상도 사이 화면 비율이 다른경우
    일치(Match) 필드값이 높은 방향의 길이를 유지, 다른 방향을 조절

싱글톤 디자인

게임 매니저 처럼 관리자 역할을 하는 옵젝같은 경우 프로그램에 단 하나만 존재해야함.
즉 어떤 스크립트에서도 씬에 있는 게임 매니저에 쉽게 접근해야함.
-> 이게 바로 싱글턴 디자인 패턴

Static

변수를 static으로 선언하면, 즉 정적변수로 선언하면 여러 옵젝이 해당변수 하나를 공유함.

점 연산자(.)를 사용하여 클래스 외부에서 접근 가능

    public static GameManager instance; // 싱글톤을 할당할 전역 변수

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

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

instance 변수를 정적변수로 선언.
이 정적변수에 싱글턴 패턴이 될 GameManager를 담을 예정.

Awake() 메서드에 instance가 null 이라면,
자기 자신을 instance 자리에 할당하여, 게임 매니저를 하나만 유지하도록 함.

이를 통해 GameManager.instance 로 즉시 접근 가능.
else 문은 다른 GameManager 가 생성된 경우 이를 파기함.

현재 씬 로드

SceneManager.LoadScene(SceneManager.GetActiveScene().name);
  • SceneManager.GetActiveScene()
    현재 활성화된 씬의 정보를 가져오는 메서드
  • name
    씬의 이름을 변수 name으로 제공

즉 현재 씬의 이름을 가져오는 것.

profile
제 Velog에 오신 모든 분들이 작더라도 인사이트를 얻어가셨으면 좋겠습니다 :)

0개의 댓글