読者です 読者をやめる 読者になる 読者になる

【Unity】ユニットの全滅を調べる

ユニットの全滅判定で問題が出たので修正。

元々の全滅判定は、全プレイヤーユニットを子要素に持つゲームオブジェクトと、全敵ユニットを子要素に持つゲームオブジェクトをそれぞれ作成。
ユニットが破壊された時に子要素の数をchildCountで取得、子要素が存在しなければ全滅している、というような設計にしていた。
しかし、前述したユニット管理用のゲームオブジェクト内に、ユニット以外のオブジェクトを入れる必要が生じたため、現在の判定方法だと上手くいかなくなった。

というわけで、FindWithTagを使用しての実装に変更。

……しようと試みたものの、予想に反して上手くいかない。
FindWithTagは該当オブジェクトが無ければ、nullを返してくれる。
その仕様を利用して、ユニット消失時に、EnemyUnit(or PlayerUnit)というタグのついたオブジェクトを検索して、nullが返ってくれば、全滅が確認出来る。

…はずなんだけど、どうもFindWithTagでの探索がオブジェクト消滅よりも先に行われるせいか、nullでなく、最後に消え行くオブジェクトを返してしまう。

何か他にカウントするために使える方法無いかなーと探し始めると、もちろんありました。
FindWithTagの複数取得バージョンとも言えるFindGameObjectsWithTagを使って、配列のサイズで判断すれば実装出来そう。
善は急げと早速実装。

GameObject[] enemyUnits = GameObject.FindGameObjectsWithTag("EnemyUnit");
if (enemyUnits.Length == 1) {
  //敵全滅時の処理
}

こんな感じで無事判定出来た。
enemyUnits.Lengthが0ではなく1と同値かの判定を行っている理由は、FindWithTagの時に記述した、オブジェクトの消滅よりもこちらの判定が行われる方が早いという理由と同じ。

毎回配列取ってくるのってパフォーマンス的にどうなの?という疑問は払拭出来ないが、当面はこれで動かそうと思う。
ループの中の処理とかじゃ無いしね……大丈夫だよね……。

参考
Unity Script Reference:
Unity Script Reference:
Unity入門/タグ - WisdomSoft
[Unity] オブジェクトの参照を取得する | HAPPY*TRAP