I’m not sure if I’m doing something wrong, if this is a bug, or if it’s intended behaviour. But if you have a component that generates a Mesh or a Material (perhaps others too), it seems that you cannot make it into a prefab and have the generated objects stored with it. This seems strange, because you can save/load scenes with generated meshes just fine, so it’s not as if it’s something that cannot be serialized.
Here’s an example component that demonstrates this issue:
using UnityEngine;
[ExecuteInEditMode]
public class GenerateMesh : MonoBehaviour
{
public Mesh myMesh;
public void Awake()
{
if (myMesh == null)
{
myMesh = new Mesh();
myMesh.name = "My Mesh";
myMesh.vertices = new Vector3[] {Vector3.up, Vector3.right, Vector3.left};
myMesh.RecalculateBounds();
myMesh.RecalculateNormals();
var meshFilter = gameObject.AddComponent<MeshFilter>();
meshFilter.sharedMesh = myMesh;
}
}
public void OnDestroy()
{
Destroy(myMesh);
}
}
Simply attach this component to a GameObject and observe that it creates a mesh and assigns it to both the MeshFilter and the public myMesh field. If you then drag the GameObject into the Project window to create a prefab, it will lose the Mesh and say there’s none.
I’m aware that you could create a Mesh or Material asset to get around this, but in my actual code, I generate my Mesh + Material in Update() whenever it detects the public fields have been modified, so it would be very impractical to create assets potentially every frame.