オブジェクトやコンポーネントを削除するときに「Destroy」を使いますが、実際にDestroyされるタイミングはご存知でしょうか?
ある日、数値などをいじり倒したコンポーネントを初期状態に戻す実装を考えていました。そこでKuroMikanは「よっしゃ、コンポーネントを一旦破棄して、すぐに同じコンポーネントを付けたろw」と思って下記コードを書きました。
var hoge = gameObject.GetComponent<SpriteRenderer>();
Destroy(hoge); //SpriteRendererを削除
gameObject.AddComponent<SpriteRenderer>(); // 再度アタッチ
オブジェクトにアタッチされている SpriteRenderer を破棄して、すぐにまた SpriteRenderer をアタッチします。
…するとこんなログが出ました。
Can't add component 'SpriteRenderer' to fuga because such a component is already added to the game object!
エラーではなく、ログです。
Unity< SpriteRendererは既にアタッチされてるからアタッチできひんかったで
……とおっしゃってます。
直前でDestroyしているのですが、破棄されていないことになっています。
これ、実際破棄されていなくて「破棄されるタイミングがまだ来ていないので破棄されていない」という状態なのでした。
Destroyでオブジェクトが破棄されるタイミングは?
さっくりした答えは「フレームの処理が終わった後」。
要するに同一フレーム内では破棄されたことを検知するのは難しいということです。(方法があるのかもしれませんが、素直にやり方を変えたほうがいいです)