Awake()랑 Start() 둘 다 비슷해 보이지만 무엇이 가장 다를지 너무 궁금해서 찾아보았다.
찾아보니 실행순서가 가장 차이가 난다고 한다.
Awake()는 Unity에서 MonoBehaviour 클래스의 생명주기 함수 중 하나
게임 오브젝트가 활성화될 때 자동으로 한 번만 호출되며
Start()보다 먼저 실행된다.
컴포넌트가 비활성화(enabled = false)되어도 실행된다.
그래도 SetActive(false) 이 경우 Awake()는 실행되지 않는다.
1) 싱글톤(Singleton) 패턴 설정
(게임에서 한 개만 존재하는 관리 클래스)
public static GameManager Instance;
void Awake()
{
if (Instance == null)
Instance = this;
else
Destroy(gameObject);
}
2) 다른 스크립트보다 먼저 초기화하고 싶을 때
void Awake()
{
myData = LoadDataFromFile(); // 먼저 데이터를 로드해둬야 Start()에서 사용 가능
}
3) 컴포넌트나 오브젝트 참조 연결(GetComponent, FindObjectOfType 등)
-다른 컴포넌트보다 먼저 연결하고 싶을 때
void Awake()
{
rigid = GetComponent<Rigidbody2D>();
}
Start()는 Unity에서 게임 오브젝트가 활성화된 후 첫 프레임이 시작되기 전에 자동으로 호출되는 메서드
즉, 게임이 시작하자마자 실행되는 준비 코드를 넣는 곳.
Awake 다음에 실행
모든 Awake가 끝난 후, 첫 프레임 전에 실행
오브젝트가 활성 상태일 때만 호출됨
1) 초기 로직 실행
void Start()
{
SpawnEnemies(); // 게임 시작하자마자 몬스터 생성
}
2) UI 표시, 사운드 재생 등 초기 연출
void Start()
{
titleText.text = "게임 시작";
backgroundMusic.Play();
}
3) 다른 오브젝트와 상호작용
이때는 Awake()보다 늦게 호출되기 때문에, 상호 참조하기 적합
void Start()
{
GameManager.Instance.StartGame();
}
실행 시점 : 오브젝트가 씬에 활성화될 때 제일 먼저
실행 순서 : 먼저
주 용도 : 데이터 준비, 참조 연결, 게임 로직 시작, 상호작용
호출 횟수 : 한 번
실행 시점 : 모든 Awake()가 끝나고 첫 프레임 시작 전
실행 순서 : 나중에
주 용도 : 게임 로직 시작, 상호작용
호출 횟수 : 한 번