Another another **Setting the parent of a transform which resides in a prefab** problem, and OnValidate

The other questions about this error don’t seem to be caused by the situation that I will show. I’m on Unity 5.3.4.

I have two prefabs, Parent and Child. Child is an empty GameObject (has just Transform component). Parent has the following script:

using UnityEngine;

public class TestParenting : MonoBehaviour {
	public GameObject prefab;
	public int dummy;

	private void OnValidate() {
		Debug.Log("validate testparenting. childs found: " + GetComponentsInChildren<Transform>(true).Length);
		UpdateChild();
	}

	private void UpdateChild() {
		// GetComponentsInChildren also returns the Transform in the parent
		if (GetComponentsInChildren<Transform>(true).Length < 2)
			NewChild();
	}

	private void NewChild() {
		GameObject instance = Instantiate(prefab);
		instance.name = "child";
		instance.transform.SetParent(transform);
	}
}

The expected behaviour is that Parent always have to have a Child, which is an instance of the Child prefab attached to the script in Editor, and checked in OnValidate. OnValidate is executed as a Unity event when any change occurs in the editor for the script, and in deserialization (not precisely sure about the moment in this last case).

I get the error when I hit the play button in Editor and Parent has no Child yet (and in other situations related to prefab modification). When I hit play and I get the error, I also get “Some objects were not cleaned up when closing the scene. (Did you spawn new GameObjects from OnDestroy?)”.

I think it is a prefab serialization issue, but can’t fix it.

What can I do to get rid of this error?

The workaround (not sure yet if it is a solution) I’m using is:

	private void OnValidate() {
		if (PrefabUtility.GetPrefabType(this) == PrefabType.PrefabInstance) {
			UpdateChild();
		}
	}

Apparently, OnValidate is also called inside the prefab asset, and not just in the instance. I didn’t know that.