public void SaveAsPrefab()
{
// Check if the Prefabs directory exists, if not, create it.
DirectoryInfo prefabDir = new DirectoryInfo("Assets/Prefabs");
if (Directory.Exists(prefabDir.FullName) == false)
{
Directory.CreateDirectory(prefabDir.FullName);
}
Skeleton[] skeletons = transform.root.gameObject.GetComponentsInChildren<Skeleton>(true);
Skeleton skeleton = null;
foreach (Skeleton s in skeletons)
{
if (transform.IsChildOf(s.transform))
{
skeleton = s;
}
}
DirectoryInfo prefabSkelDir = new DirectoryInfo("Assets/Prefabs/" + skeleton.gameObject.name);
if (Directory.Exists(prefabSkelDir.FullName) == false)
{
Directory.CreateDirectory(prefabSkelDir.FullName);
}
string path = "Assets/Prefabs/" + skeleton.gameObject.name + "/" + gameObject.name + ".prefab";
// Need to create a new Mesh because replacing the prefab will erase the sharedMesh
// on the SkinnedMeshRenderer if it is linked to the prefab
Mesh mesh = new Mesh();
mesh.name = meshFilter.sharedMesh.name.Replace(".Mesh", ".SkinnedMesh");
mesh.vertices = skinnedMeshRenderer.sharedMesh.vertices;
mesh.triangles = skinnedMeshRenderer.sharedMesh.triangles;
mesh.normals = skinnedMeshRenderer.sharedMesh.normals;
mesh.uv = skinnedMeshRenderer.sharedMesh.uv;
mesh.uv2 = skinnedMeshRenderer.sharedMesh.uv2;
mesh.bounds = skinnedMeshRenderer.sharedMesh.bounds;
mesh.bindposes = skinnedMeshRenderer.sharedMesh.bindposes;
mesh.boneWeights = skinnedMeshRenderer.sharedMesh.boneWeights;
DirectoryInfo meshSkelDir = new DirectoryInfo("Assets/Meshes/SkinnedMeshes/" + skeleton.gameObject.name);
if (Directory.Exists(meshSkelDir.FullName) == false)
{
Directory.CreateDirectory(meshSkelDir.FullName);
}
string meshPath = "Assets/Meshes/SkinnedMeshes/" + skeleton.gameObject.name + "/" + mesh.name + ".asset";
Mesh generatedMesh = AssetDatabase.LoadMainAssetAtPath (meshPath) as Mesh;
if (generatedMesh == null) {
generatedMesh = new Mesh();
// Hack to display mesh once saved
CombineInstance[] combine = new CombineInstance[1];
combine[0].mesh = mesh;
combine[0].transform = Matrix4x4.identity;
generatedMesh.CombineMeshes(combine);
EditorUtility.CopySerialized(mesh, generatedMesh);
AssetDatabase.CreateAsset(generatedMesh, meshPath);
AssetDatabase.Refresh();
}
// Ensure there is a reference material for the renderer
if (referenceMaterial == null) {
if (skinnedMeshRenderer.sharedMaterial.name.Contains(" (Instance)")) {
string materialName = skinnedMeshRenderer.sharedMaterial.name.Replace(" (Instance)", "");
Debug.Log(materialName);
Material material = AssetDatabase.LoadAssetAtPath("Assets/Materials/" + materialName + ".mat", typeof(Material)) as Material;
referenceMaterial = material;
}
else {
referenceMaterial = skinnedMeshRenderer.sharedMaterial;
}
}
else {
if (referenceMaterial.name.Contains(" (Instance)")) {
string materialName = referenceMaterial.name.Replace(" (Instance)", "");
Material material = AssetDatabase.LoadAssetAtPath("Assets/Materials/" + materialName + ".mat", typeof(Material)) as Material;
referenceMaterial = material;
}
}
// Create a new prefab erasing the old one
Object obj = PrefabUtility.CreateEmptyPrefab(path);
// Make sure the skinned mesh renderer is using the stored generated mesh
skinnedMeshRenderer.sharedMesh = generatedMesh;
// Make sure the renderer is using a material
if (referenceMaterial != null) {
skinnedMeshRenderer.sharedMaterial = referenceMaterial;
}
// Add the mesh back to the prefab ** No Longer Using this as prefabs are less stable this way **
// AssetDatabase.AddObjectToAsset(skinnedMeshRenderer.sharedMesh, obj);
// Replace the prefab
PrefabUtility.ReplacePrefab(gameObject, obj, ReplacePrefabOptions.ConnectToPrefab);
EditorUtility.SetDirty(skinnedMeshRenderer.gameObject);
AssetDatabase.SaveAssets();
}