Awake と Start
CoddyのUnityジャーニー「Unityスクリプティングの基礎」セクションの一部。レッスン 55/67。
Unity はオブジェクトが読み込まれるとすぐに Awake() を呼び出し、その後に Start() を呼び出します。これが便利なのは、オブジェクト間で共通するルールがあるためです。シーンが開始すると、どのオブジェクトの Start() よりも先に、すべてのオブジェクトの Awake() が実行されます。各ラウンドでどのオブジェクトが先になるかは Unity が決めるため、それを当てにすることはできません。
この Player スクリプトは、P1(startLives 3)と P2(startLives 5)の 2 人のプレイヤーに設定されており、それぞれがもう一方を 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;
}最初のバージョンでは、lives を Start() で設定していました。そのため、先に開始したプレイヤーは、相手が残りライフを設定する前に相手に尋ね、0 をログに出力していました。Awake() で初期化することで、どちらかの Start() が尋ねる前に両方のプレイヤーの残りライフが設定されるため、P1 は 5、P2 は 3 をログに出力します。ここから得られる習慣は、自分自身のフィールドは Awake() で設定し、ほかのオブジェクトとのやり取りは Start() で行うことです。
チャレンジ
中級2つの蜂の巣、HiveAとHiveBは、同じHiveスクリプトを実行します。それぞれの蜂の巣は、蜂(beeCountから取得した3匹と5匹)をリストに追加し、ライバルの蜂の数をログに出力します。HiveA counts 5 rival beesとHiveB counts 3 rival beesです。
Playを押すと、ライバルがリストを作る前にライバルのリストを取得しようとするため、片方の蜂の巣でNullReferenceExceptionが発生して停止します。すべての蜂の巣でリストと蜂が用意されてから、どの蜂の巣もライバルの数を数えるようにスクリプトを修正してください。数を数える処理の位置は変えないでください。その後、Checkを押します。
自分で試してみよう
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;
}
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。