Awake와 Start
Coddy Unity 여정의 Unity 스크립팅 기초 섹션에 포함된 레슨. 67개 중 55번째.
Unity는 객체가 로드되는 즉시, 해당 객체의 Start()가 호출되기 전에 Awake()를 호출합니다. 이 기능이 유용한 이유는 객체 전반에 적용되는 규칙 때문입니다. 씬이 시작되면 모든 객체의 Awake()가 어떤 객체의 Start()보다도 먼저 실행됩니다. 각 단계에서 어떤 객체가 먼저 실행될지는 Unity가 결정하므로, 그 순서를 믿고 의존해서는 안 됩니다.
이 Player 스크립트는 두 플레이어 P1(startLives 3)과 P2(startLives 5)에 연결되어 있으며, 각 플레이어의 rival은 다른 플레이어입니다.
public int startLives = 3;
public GameObject rival;
int lives;
void Awake()
{
lives = startLives; // 이 객체를 설정합니다
}
void Start()
{
int theirs = rival.GetComponent<Player>().Lives(); // 다른 객체에 물어봅니다
Debug.Log(name + " sees a rival with " + theirs + " lives");
}
public int Lives()
{
return lives;
}첫 번째 버전에서는 Start()에서 lives를 설정했습니다. 먼저 시작한 플레이어는 상대 플레이어가 목숨 수를 설정하기 전에 상대에게 물어보게 되어 0을 기록했습니다. Awake()에서 설정하면 어느 한쪽의 Start()가 물어보기 전에 두 플레이어 모두 목숨 수를 설정하므로, P1은 5를, P2는 3을 기록합니다. 여기서 기억할 원칙은 다음과 같습니다. 객체 자신의 필드는 Awake()에서 설정하고, 다른 객체와는 Start()에서 상호작용하세요.
챌린지
중급두 벌집인 HiveA와 HiveB는 같은 Hive 스크립트를 실행합니다. 각 벌집은 벌들을 (beeCount에서 가져온 3마리와 5마리) 목록에 생성한 다음, 상대 벌집의 벌 수를 기록합니다. 결과는 HiveA counts 5 rival bees와 HiveB counts 3 rival bees입니다.
플레이를 누르면 한 벌집에서 NullReferenceException이 발생하며 멈춥니다. 상대 벌집이 목록을 만들기도 전에 그 목록을 요청하기 때문입니다. 모든 벌집이 상대의 벌 수를 세기 전에 목록과 벌들을 갖도록 스크립트를 수정하세요. 세는 코드는 현재 위치에 그대로 두세요. 그런 다음 확인을 누르세요.
직접 해보기
using System.Collections.Generic;
using UnityEngine;
public class Hive : MonoBehaviour
{
public GameObject beePrefab;
public GameObject rival;
public int beeCount = 3;
List<GameObject> bees;
void Start()
{
bees = new List<GameObject>();
for (int i = 0; i < beeCount; i++)
{
Vector3 spot = transform.position + new Vector3(i * 0.6f - 1.2f, 1.5f, 0);
bees.Add(Instantiate(beePrefab, spot, Quaternion.identity));
}
int theirs = rival.GetComponent<Hive>().BeeCount();
Debug.Log(name + " counts " + theirs + " rival bees");
}
public int BeeCount()
{
return bees.Count;
}
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.