AwakeとStart
CoddyのUnityジャーニー「Unityスクリプトの基礎」セクションの一部。レッスン 70/85。
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() で行うことです。
チャレンジ
中級まだ作成されていないリストをどちらの巣も数えないように修正しましょう。
Hiveにvoid Awake()を追加します。bees = new List<GameObject>();の行とforループをStart()からAwake()に移動します。Start()の2つのカウント行はそのままにします。どのAwake()も、すべてのStart()より先に実行されます。
「プレイ」を押します。各巣がライバルのハチの数をログに出力し、HiveAはライバルのハチを5匹と数え、エラーは発生しません。その後、「確認」を押します。
自分で試してみよう
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;
}
}
Unityスクリプトの基礎のすべてのレッスン
自分で練習してみよう: Unityプレイグラウンド