상세 컨텐츠

본문 제목

1017 TIL - 씬 전환 시 정보 이동

스파르타 코딩캠프/'24 Today I Learned

by lucar 2024. 10. 17. 21:36

본문

오늘 프로젝트 진행 중에 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

 

관련글 더보기