인프런 커뮤니티 질문&답변

강승연님의 프로필 이미지
강승연

작성한 질문수

[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진

섹션 8.Scene SceneManager(1) 관련하여 질문이 있습니다

해결된 질문

작성

·

210

0

강의 영상 7분 경 씬 UI인 UI_Inven를 화면에 띄우는 코드를 PlayerController.cs 에서 GameScene.cs로 옮겼는데 Null 오류가 발생했습니다. PlayerController.cs 에 위 코드가 있을 때는 정상적으로 작동하는데 옮기면 계속 오류가 발생합니다.

오류로그


hierachy 창

인스펙터창

코드(GameScene.cs)

public class GameScene : BaseScene
{
void Start()
{
Init();
}

protected override void Init()
{
base.Init();
SceneType = Define.Scene.Game;
GameManager.UI.ShowSceneUI<UI_Inventory>();
}

public override void Clear()
{

}
}

코드(GameManager.cs)

using System.Collections;
using System.Collections.Generic;
using System.Runtime.InteropServices.WindowsRuntime;
using UnityEngine;

public class GameManager : MonoBehaviour
{
static GameManager instance;
static GameManager Instance { get { Init(); return
instance; } }

InputManager input = new InputManager();
public static InputManager Input { get { return Instance.
input; } }

ResourceManager resources = new ResourceManager();

public static ResourceManager Resources { get { return Instance.
resources; } }

private DataManager data = new DataManager();

public static DataManager Data { get { return
instance._data; } }

private UIManager ui = new UIManager();

public static UIManager UI { get { return
instance._ui; } }

void Start()
{
Init();
instance.data.Init();
}

void Update()
{
input.OnUpdate();
}

static void Init()
{
if(
instance == null)
{
GameObject go = GameObject.Find("@GameManager");
if (
go == null)
{
go = new GameObject { name = "@GameManager" };
go.AddComponent<GameManager>();
}

DontDestroyOnLoad(_go);
instance = go.GetComponent<GameManager>();
}
}
}

답변 1

1

Rookiss님의 프로필 이미지
Rookiss
지식공유자

public static UIManager UI { get { Init(); return instance._ui; } }

이렇게 수정해보세요.
여러 GameObject끼리 Start 호출 순서는 알 수가 없는데
운이 나쁘게 PlayerController가 먼저 Start되어
아직 Managers의 Start가 호출되지 않아 매니저가 초기화되지 않은 상태로 보입니다.

코드에 따라 저런 식으로 Init() 코드를 넣어두기도 합니다.

강승연님의 프로필 이미지
강승연

작성한 질문수

질문하기