Skin2D.SaveAsPrefab C# (CSharp) Method

SaveAsPrefab() public method

public SaveAsPrefab ( ) : void
return void
    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();
    }

Usage Example

Beispiel #1
0
    public override void OnInspectorGUI()
    {
        Skin2D skin = (Skin2D)target;

        DrawDefaultInspector();

        EditorGUILayout.Separator();

        /* Moved to skeleton for multiple Skin2D
         * if (skin.selectedBones != null && skin.GetComponent<MeshFilter>().sharedMesh != null && GUILayout.Button("Calculate weights")) {
         * skin.CalculateBoneWeights();
         * }*/

        if (skin.GetComponent <SkinnedMeshRenderer>().sharedMesh != null && GUILayout.Button("Save as Prefab"))
        {
            skin.SaveAsPrefab();
        }

        if (skin.GetComponent <SkinnedMeshRenderer>().sharedMesh != null && GUILayout.Button("Recalculate Bone Weights"))
        {
            skin.RecalculateBoneWeights();
        }

        if (skin.GetComponent <SkinnedMeshRenderer>().sharedMesh != null && GUILayout.Button("Create Control Points"))
        {
            ControlPoint.CreateControlPoints(skin.GetComponent <SkinnedMeshRenderer>());
        }

        if (skin.GetComponent <SkinnedMeshRenderer>().sharedMesh != null && GUILayout.Button("Reset Control Points"))
        {
            skin.ResetControlPointPositions();
        }
    }
All Usage Examples Of Skin2D::SaveAsPrefab