7
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

[Unity] Destory処理中のOnDisableとOnDestroyの呼び出され方と、その最中にGameObjectの親子関係を解除したときの挙動

Posted at

#結論から
OnDisableやOnDestroyで親子関係を変えると意図しない挙動を引き起こしやすいので
Destroyする前に親子関係を解除した方が良い

##検証用GameObjectの構造とコード
コメント 2019-07-09 153613.png

DestroyTest
DestroyTest : MonoBehaviour
	{
		public bool detachChildrenOnDisable;
		public bool detachParentOnDisable;
		public bool detachChildrenOnDestroy;
		public bool detachParentOnDestroy;

		private void OnDisable()
		{
			if (detachChildrenOnDisable) { transform.DetachChildren(); }
			if (detachParentOnDisable) { transform.parent = null; }
			Debug.Log(gameObject.name + "OnDisable");
		}

		private void OnDestroy()
		{
			if (detachChildrenOnDestroy) { transform.DetachChildren(); }
			if (detachParentOnDestroy) { transform.parent = null; }
			Debug.Log(gameObject.name + "OnDestroy");

		}
	}

##コードから親をDestroyした場合
親→子→孫という順番でOnDisableが呼ばれ、その後同じ順序でOnDestroyも呼ばれる
コメント 2019-07-09 134746.png
##Editorの操作から削除した場合
コメント 2019-07-09 154128.png
Disableは孫→子→親の逆順で呼ばれ、Destroyはコード側の操作と同じ順序で呼ばれる
コメント 2019-07-09 134916.png
##親のOnDestroyで親子関係を解除した場合

すべてのOnDisableが呼び出された後、親子関係が解除され親のOnDestroyのみ呼ばれる
1213213.JPG

この場合DestroyしたGameObjectの直下にある子のみdisableのままになり孫はEnableが呼ばれコンポーネントが起動する
1010.JPG
コードにOnEnableを書き加え確認するとしっかり呼ばれているのを確認できる
1111.JPG
Destroy処理の途中で親子関係を外す場合に期待する挙動としては確かに子はDisableされずEnableのままにしてほしいと思うので
中断できた場合は改めてEnableにするのだろうが
構造的に子か否かでその処理が走るかどうか決めていて親になった「子」には適用されないのだろう
##親のOnDisableで親子関係を解除した場合
特筆することもなく親だけで処理が完結する
212212.JPG
#子のOnDestroyで親を外した時
親を外す処理はDestory中には不可能で、エラーになりそのままDestroyされる
22222222.JPG
##子のOnDisableで親を外した時
子でOnDisableの伝播が止まり孫はDisableされていないのでOnEnableも呼ばれない
1515654.JPG
子はDisableのままになる
654566.JPG
#Unityが用意しているコンポーネントは?
子がRootへ変化する状況では同じくDisableされる
16548163.JPG
Particle Systemなどは出てるパーティクルが一度すべて消える
#感想
あんまり無い状況かもしれませんが、Destory中に親子関係を解除するとコンポーネントがDisableのままというのは
結構罠だと思うので、事前に解除しておきましょう

7
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?