即座にオブジェクトを破壊する/Object.DestroyImmediate
オブジェクトの破壊やコンポーネントの破棄は通常Object.Destroyを使うが、どうもこの命令は実行から反映されるまでに若干のディレイがある模様(同フレーム内で処理されるらしいが)
同一の処理の中でコンポーネントの有無などをifで参照する場合等、そのディレイで期待した結果にならないこともある。
即座に結果を反映したい場合はDestroyImmediateを使用する。
http://docs.unity3d.com/Documentation/ScriptReference/Object.DestroyImmediate.html
推奨されていないらしいがこれじゃないと無理なんだから仕方ない。
public void RemoveBoolItemStatus(ItemType tgtItem, bool stat) { switch(tgtItem) { case ItemType.Glove: isGlove = stat; ActionGlove actGlove = (ActionGlove)gameObject.GetComponent<ActionGlove>(); Debug.Log("actGlove = "+actGlove); if(actGlove != null) Object.DestroyImmediate(actGlove); break; (中略) } public void AddBoolItemComponent(ItemType tgtItem, bool stat) { switch(tgtItem) { case ItemType.Glove: isGlove = stat; ActionGlove actGlove = (ActionGlove)gameObject.GetComponent<ActionGlove>(); Debug.Log("actGlove = "+actGlove); if(actGlove == null) actGlove = (ActionGlove)gameObject.AddComponent<ActionGlove>(); break; (中略) }
上の関数の後、間を置かずに下関数を呼び出した場合、Destroyだと実際の削除が間に合わず下関数内でnullが取れず、コンポーネントが追加されない。
DestroyImmediateだと即座に破棄されるので下の処理が期待通りになる。