메인프로젝트를 시작하기 전, 우리의 실력을 객관적으로 평가하기 위해 간단한 게임을 하나 제작했다.
그야말로 처참한 수준인데,,,,,
앞으로 생길 난관을 잘 헤쳐나갈 수 있을까..?
저번에 제작한 게임은 주먹구구식으로 짠 코딩들이 많았다.
하긴 기획, 설계, 메카닉적인 부분들을 하나도 토의해본 적이 없으니(ㅋㅅㅋ)
그런데 의외로 실력은 많이 향상된 느낌이다?? 실제로 다들 그렇게 느끼기도 했고.
이번에는 완성도 높은 게임을 제작하기 위해 기획. 스토리, 설계, 트릭, 컨셉 등등 모든 전반적인 게임 구성에 관한 것들을
싹 다!! 확정해놓고 진행하려 한다. 물론 바뀔 수도 있겠지만, 어느정도의 윤곽은 필요하다는 것을 전작을 통해 뼈저리게 깨달았기 떄문에..
전작에서 사용되지 않았던 유니티의 기능들을 연습해 보려고 한다.
그 중 첫번째로 유니티의 scene에 대해 알아보자.
scene이란, 게임 오브젝트가 포함되어있는 최상위 개념이다.
이를 통해 메뉴 창 또는 단계별 스테이지를 구현할 수 있는 것이다!
그렇다면 scene을 만들어봐야겠지?

먼저 메인 씬이다.
유니티는 새 프로젝트를 만들면 기본적으로 SampleScene이 있다. 이는 좌측의 Assets 폴더 하위에 있는 Scenes폴더 안에 저장이 되어있다.
우클릭 - rename을 통해 MainScene으로 이름을 바꾸고,
다시 우클릭 - create - Scene으로 AnotherScene을 만들어주었다.
각각을 구별하기 위해 Main Scene에는 TMP오브젝트를 만들어 Main Scene이라 타이핑해주었고,
AnotherSCene에는 마찬가지로 Another Scene이라 타이핑해주었다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class SceneChanger : MonoBehaviour
{
// Start is called before the first frame update
void Awake()
{
}
// Update is called once per frame
void Update()
{
if (Input.GetKeyDown(KeyCode.S))
{
SceneManager.LoadScene("AnotherScene");
}
}
}
그리고 Maine Scene의 TMP에 위의 스크립트를 컴포넌트 해주었다.
여기서 중요한건 씬을 넘어가기 위해서는 스크립트의 가장 위에 UnityEngine이라는 네임스페이스에서
SceneManagement를 사용(using)하겠다고 선언을 해야 SceneManager를 사용할 수 있다.

드래그앤 드랍으로 어떤 씬을 빌드할 지 선택할 수 있다.
우리는 두개 다 필요하므로 둘다 넣어주도록 하자.


여기서 간략하게 씬의 전환에 대해 설명하자면, 씬은 전환될 때 그 이전의 모든 게임오브젝트들을 파괴(Destroy)하고 넘어갈 씬에 저장되어있는 게임오브젝트들을 load하는 형식이다.
이렇게 되면 씬이 넘어갈 때 모든 기록들이 날아간다는 것이다(!)
그렇다면 씬 간에 상호작용하는 방법은 무엇이 있을까?
1. 변수를 static으로 선언한다.
2. DontDestroyOnLoad()를 작성해서 파괴되지 않도록한다.
1번은 변수가 선언된 메서드나 스크립트를 벗어나더라도 메모리에서 휘발되지 않도록 하여 전역으로 사용할 수 있는 정적변수이다.
2번은 이번에 알게된 지식인데, 씬이 전환되어도 DontDestroyOnLoad()를 호출한 객체는 파괴되지 않는다.
이는 일반적으로 GameManager급의 오브젝트에 호출하는 듯 하다.(그래야 파괴되지 않고 게임을 계속 관리할 수 있으니)
그렇기에 저 메서드를 호출하는 객체는 최상위에 있어야 한다.
누군가의 자식오브젝트라면, 누군가가 파괴될 때 같이 파괴가 되버리니 유의하도록 하자 ㅇ.ㅇ
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class DontDestroy : MonoBehaviour{
void Start()
{
DontDestroyOnLoad(gameObject);
}
}
DontDestroyOnLoad(gameObject);를 start나 awake에서 호출하고 실린더 오브젝트를 하나 만들어 컴포넌트해준 뒤,
유니티에서 실행해보았다.

좌측 hierarchy에 보면 실린더가 DontDestroyOnLoad로 묶여있는 것을 볼 수 있다.
여러 개의 객체에 저 메서드를 호출한다면, 여러개가 묶여있을 것이다.
파괴되지 않는 지도 테스트하기 위해 build and run해보자.


파괴되지 않고 그대로 남아있는 모습을 확인할 수 있다.
요약
scene이란, 게임오브젝트들을 하나로 묶는 커다란 단위이다.
씬 전환할 때 이전의 게임오브젝트들은 파괴가 된다.
파괴되지 않고 상호작용하기 위해선 static이나 DontDestroyOnLoad()를 호출해야한다.
싱글톤패턴을 사용하는 매니저는 상황에 따라 DontDestoryOnLoad()를 꼭 넣어주도록 하자.
활용성
level design을 scene으로 구별한다.
플랫포머 장르를 예로 들자면
점수나 목숨, 캐릭터 등 맵이 바뀌어도 유지되어야 하는 정보들은 DontDestroyOnLoad를 사용하자.
끝.
'코딩 > 연습' 카테고리의 다른 글
| 혼자 만든 테스트씬 (0) | 2023.09.23 |
|---|---|
| 유니티 : 해상도와 사운드 조절 (2) | 2023.04.14 |
| 유니티 : 키 바인딩 (2) | 2023.04.13 |
| 유니티 : 캔버스로 메뉴 만들기 (0) | 2023.04.11 |