모범 답:
모범 답:
모범 답:
모범 답:
모범 답:
Start
와 Awake
의 차이점은 무엇이며, 이를 적절히 사용하는 방법에 대해 설명해주세요.Start와 Awake의 차이점 및 사용 방법:
• Awake는 스크립트 인스턴스가 로딩될 때 호출되어, 변수 초기화와 같은 초기 설정에 사용됩니다. Awake는 게임 오브젝트가 활성화되지 않아도 호출됩니다.
• Start는 Awake 이후, 첫 번째 Update 호출 전에 한 번만 호출됩니다. 다른 오브젝트들과의 상호작용이 필요한 초기화 작업에 적합합니다.
• Awake를 사용하여 스크립트의 내부 상태를 설정하고, Start에서는 다른 오브젝트들이 이미 Awake를 통해 초기화된 상태에서 필요한 작업을 수행합니다.
모범 답:
모범 답:
모범 답:
Awake 호출 순서에 상관 없이 작동하는 JobQueue를 만들어봅시다.
여러분은 현재 스테이지의 모든 적이 죽었을 경우 다음 스테이지로 넘어가는 기능을 만들고 싶습니다.
먼저 싱글톤 패턴의 StageManager를 선언하여 적들의 정보를 한 군데에 모으려 합니다.
그런데 문제가 있습니다!
씬에 StageManager와 Enemy 오브젝트가 있는데,
Scene 구조
StageManager의 초기화 전에 Enemy 오브젝트의 Awake가 먼저 호출되어버려
NullReferenceException
오류가 발생합니다!
그래서 StageManager에 JobQueue를 추가하여
Enemy의 Awake가 먼저 불려도 그 작업을 Queue에 저장해놓고 StageManager 초기화 시 차례대로 불러오려고 합니다.
JobQueue를 이용한 StageManager의 코드를 완성해주세요.
using System;
using System.Collections.Generic;
using UnityEngine;
public class StageManager : MonoBehaviour
{
public static StageManager Instance { get; private set; }
[SerializeField] private List<GameObject> enemies = new List<GameObject>();
private static Queue<Action> jobQueue = new Queue<Action>();
private void Awake()
{
Debug.Log("StageManager Awake");
if (Instance == null)
{
Instance = this;
ProcessJobQueue();
}
else
{
Destroy(gameObject);
}
}
public static void AddEnemy(GameObject enemy)
{
//TODO: Awake가 호출되기 전에 함수가 호출된 경우 Job Queue에 추가하는 코드를 작성하세요.
}
private void AddEnemyInternal(GameObject enemy)
{
enemies.Add(enemy);
}
public void RemoveEnemy(GameObject enemy)
{
enemies.Remove(enemy);
}
private void ProcessJobQueue()
{
// TODO: Job Queue를 처리하는 코드를 작성하세요.
// JobQueue가 빌 때까지 JobQueue에 있는 작업을 빼내서 실행
}
public bool IsStageClear()
{
return enemies.Count == 0;
}
}
using UnityEngine;
public class Enemy : MonoBehaviour
{
private void Awake()
{
Debug.Log("Enemy Awake");
// 적을 StageManager에 등록
StageManager.AddEnemy(gameObject);
}
// 적이 죽었을 때 호출되는 메서드
public void OnEnemyDeath()
{
// 적이 죽었을 때 StageManager에서 적을 제거
StageManager.Instance.RemoveEnemy(gameObject);
}
}