UnityでHPが0から始まる謎のバグ!? 実は初期化タイミングに潜んでいた罠

App

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/公開中のアプリ一覧/


同じような現象に困ってる方の助けになれば!

コメント

タイトルとURLをコピーしました