UnityでHPが0からスタートする…?
Unityで敵キャラを配置してゲームを始めたところ、
「初期HPがいきなり0になっている」というバグに直面しました。
しかも発生する時としない時がある。
同じプレハブを使っているのに、再生ボタンを押すたびに動作が変わることも……。
原因を調べた結果…
結論から言うと、**初期化タイミングの競合(Scriptの実行順)**が原因でした。
詳しい状況
敵キャラは EnemyController
というスクリプトで管理されており、Start()
の中で初期HPを maxHP
に設定していました。
void Start()
{
stats = Instantiate(statsTemplate);
currentHP = stats.maxHP;
UpdateHPBars(currentHP, stats.maxHP, 0, false);
}
ですが、この Start()
よりも先に他のスクリプトが currentHP
を参照・表示していたため、currentHP = 0
の状態で HPバーが更新されていたのです。
解決策:Awake()での初期化に切り替え
Unityでは Awake()
の方が Start()
よりも早く呼ばれます。
インスタンス生成直後にデータを設定したい時は Awake()
を使うのが鉄則です。
void Awake()
{
stats = Instantiate(statsTemplate);
currentHP = stats.maxHP;
}
Start()
の中では表示系だけを更新するように分離しました。
学びポイント
ポイント | 内容 |
---|---|
Unityの実行順 | Awake() → OnEnable() → Start() の順 |
Start() の罠 | 他スクリプトから先に参照される可能性あり |
対策 | HPなどの状態値は Awake() で先にセットしておく |
対策の鉄則(まとめ)
- データの初期値のセットは
Awake()
に - 表示や外部アクセスなどの後続処理は
Start()
に - どうしても順序が重要な場合は
Script Execution Order
も活用する
関連記事・リソース
公開中のアプリ一覧はこちら!
▶ https://syunpp.com/公開中のアプリ一覧/
同じような現象に困ってる方の助けになれば!
コメント