Generated meshes/materials cannot be made into prefabs?

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.

All objects are usually scene objects, at least when they are created. That’s why they are serialized along with the scene. Prefabs on the other hand are assets that doesn’t belong to a scene. They are stored as seperated assets and can only consist of other assets.

Take a look at the AssetDatabase and mainly at CreateAsset and AddObjectToAsset