오늘 프로젝트 진행 중에 MainScene에서 발생한 점수를
ScoreScene으로 가져오기 위해 public float Score를 선언하고
ScoreScene에서 가져오려고 하자 NullExceptionError가 발생했다.
Score값이 담겨있는 Hierachy가 씬이 이동하면서 같이 넘어오지 않기 때문에
발생한 문제로 보인다
이에 대한 해결법은 대충 4가지 정도가 생각나는데
정적변수인 public static float Score로 선언하여 접근하기
싱글톤 패턴을 가진 GameManager를 통해 값을 넘겨주기
DontDestroyOnLoad를 통해 씬이 이동될 때 같이 넘어가게 만들어주기
PlayerPrefs를 통해 값을 하드웨어에 저장해서 넘겨주기
이번에 선택한 방법은 정적변수로 넘겨주기이다.
각각의 특징을 아는 선에서 적어보자면
정적변수는 메모리에 값을 직접 저장하고
해당 어플리케이션의 시작 부터 종료까지 사용되기에
많은 양의 값을 저장하기에는 메모리에 부담이 간다.
싱글톤 패턴도 마찬가지로 정적 변수인 Instance를 통해 메모리에 저장하고 참조할 수 있게 해준다.
하지만 이 변수 저 변수 다 집어넣는다면 코드 사이의 결합도가 증가하는 단점이 있다.
DontDestroyOnLoad는 씬 전환 시 해당 오브젝트가 파괴되지 않게 해준다.
고작 Score float값 넘기기 위해 사용하기에는 쓸데없는 정보가 함께 넘어오게 된다.
PlayerPrefs를 사용하면 사용자의 하드웨어에 직접 데이터를 저장하게 된다.
쓸데없는 파일이 생겨서 내 드라이브 용량을 잡아먹게 하고 싶지 않다.
적은 용량이라 메모리에 부담이 적기도 해서 정적변수로 넘겨주었다.
사용법은 간단하다.
우선 두 개의 씬과 두 개의 스크립트 두 개의 빈 오브젝트를 생성했다.
SampleScene안에는 SampleSceneInput을
NewScene안에는 NewSceneOutput을 각각의 게임 오브젝트에 넣어주었다.
아 씬 이동을 위해 버튼을 하나 추가해주자.
각각의 코드는 이렇다.
SampleSceneInput
public class SampleSceneInput : MonoBehaviour
{
public int a = 10;
public void MoveScene()
{
SceneManager.LoadScene("NewScene");
}
}
NewSceneOutput
public class NewSceneOutput : MonoBehaviour
{
private SampleSceneInput _input;
void Start()
{
for (int i = 0; i < _input.a; i++)
{
Debug.Log(i);
}
}
}
실행 후 버튼을 눌러 씬을 이동해보자.
널 참조 에러가 발생한다.
샘플 신에서 게임오브젝트가 뉴 신으로 넘어오면서 파괴되었기에 아무런 값도 가지지 못한다.
정적 변수로 선언해보자.
public class SampleSceneInput : MonoBehaviour
{
public static int a = 10;
}
정적 변수로 선언했으니 NewScene에서도 받는 값이 살짝 달라진다.
public class NewSceneOutput : MonoBehaviour
{
void Start()
{
for (int i = 0; i < SampleSceneInput.a; i++)
{
Debug.Log(i);
}
}
}
객체를 선언할 필요가 없어진다. 클래스 이름만으로도 접근할 수 있게 된다.
다시 해보자.
잘 작동되는 걸 볼 수 있다.
TTE
1030 TIL - C# 제네릭 싱글톤 (0) | 2024.10.30 |
---|---|
1025 TIL - 오브젝트 풀을 활용한 효과음 구현 (1) | 2024.10.25 |
1016 TIL - Unity InputSystem 심화 (5) | 2024.10.16 |
1015 TIL - 유니티 입문 팀 프로젝트 주차 돌입 (3) | 2024.10.15 |
1014 TIL - Unity 애니메이터 갈아끼우기 (0) | 2024.10.14 |