Example #1
0
        public static void Create()
        {
            // If we have a GameObject selected then use this to create the Skin2D
            if (Selection.activeGameObject != null)
            {
                GameObject          o              = Selection.activeGameObject;
                SkinnedMeshRenderer skin           = o.GetComponent <SkinnedMeshRenderer>();
                SpriteRenderer      spriteRenderer = o.GetComponent <SpriteRenderer>();

                // If we do not have a Skin2D already on this object and a SpriteRenderer then create it
                if (skin == null && spriteRenderer != null)
                {
                    Sprite     thisSprite = spriteRenderer.sprite;
                    SpriteMesh spriteMesh = new SpriteMesh();
                    spriteMesh.spriteRenderer = spriteRenderer;
                    spriteMesh.CreateSpriteMesh();
                    Texture2D spriteTexture = UnityEditor.Sprites.SpriteUtility.GetSpriteTexture(spriteRenderer.sprite, false);

                    // Copy the sprite material
                    Material spriteMaterial = new Material(spriteRenderer.sharedMaterial);
                    spriteMaterial.CopyPropertiesFromMaterial(spriteRenderer.sharedMaterial);
                    spriteMaterial.mainTexture = spriteTexture;

                    // Copy the sorting order and sorting layers of the Sprite
                    string sortLayerName = spriteRenderer.sortingLayerName;
                    int    sortOrder     = spriteRenderer.sortingOrder;

                    // Kill the SpriteRenderer as we do not need it any more.
                    DestroyImmediate(spriteRenderer);

                    // Add the Skin2D to this object and assign the sprite
                    Skin2D skin2D = o.AddComponent <Skin2D>();
                    skin2D.sprite = thisSprite;
                    skin          = o.GetComponent <SkinnedMeshRenderer>();
                    MeshFilter filter = o.GetComponent <MeshFilter>();
                    skin.material = spriteMaterial;

                    // Save out the material from the sprite so we have a default material
                    if (!Directory.Exists("Assets/Materials"))
                    {
                        AssetDatabase.CreateFolder("Assets", "Materials");
                        AssetDatabase.Refresh();
                    }
                    AssetDatabase.CreateAsset(spriteMaterial, "Assets/Materials/" + spriteMaterial.mainTexture.name + ".mat");
                    Debug.Log("Created material " + spriteMaterial.mainTexture.name + " for " + skin.gameObject.name);
                    skin2D.referenceMaterial = spriteMaterial;
                    skin.sortingLayerName    = sortLayerName;
                    skin.sortingOrder        = sortOrder;

                    // Create the mesh from the selection
                    filter.mesh = (Mesh)Selection.activeObject;
                    if (filter.sharedMesh != null && skin.sharedMesh == null)
                    {
                        skin.sharedMesh      = filter.sharedMesh;
                        skin2D.referenceMesh = skin.sharedMesh;
                    }
                    // Recalculate the bone weights for the new mesh
                    skin2D.RecalculateBoneWeights();
                }
                else
                {
                    // If there is a Skin2D or no SpriteRenderer then create a new GameObject with a Skin2D component
                    o = new GameObject("Skin2D");
                    Undo.RegisterCreatedObjectUndo(o, "Create Skin2D");
                    o.AddComponent <Skin2D> ();
                }
            }
            else
            {
                // If there is no selected GameObject then create a new GameObject with a Skin2D component
                GameObject o = new GameObject("Skin2D");
                Undo.RegisterCreatedObjectUndo(o, "Create Skin2D");
                o.AddComponent <Skin2D> ();
            }
        }
Example #2
0
        public override void OnInspectorGUI()
        {
            DrawDefaultInspector();

            EditorGUILayout.Separator();

            if (GUILayout.Button("Toggle Mesh Outline"))
            {
                Skin2D.showMeshOutline = !Skin2D.showMeshOutline;
            }

            EditorGUILayout.Separator();

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

            EditorGUILayout.Separator();

            if (skin.skinnedMeshRenderer && GUILayout.Button("Recalculate Bone Weights"))
            {
                skin.RecalculateBoneWeights();
            }

            EditorGUILayout.Separator();

            GUILayout.Label("Control Points", EditorStyles.boldLabel);

            EditorGUILayout.Separator();

            handleColor = EditorGUILayout.ColorField("Handle Color", handleColor);

            changedBaseSelectDistance = EditorGUILayout.Slider("Handle Size", baseSelectDistance, 0, 1);

            EditorGUILayout.Separator();

            if (baseSelectDistance != changedBaseSelectDistance)
            {
                baseSelectDistance = changedBaseSelectDistance;
                EditorUtility.SetDirty(this);
                SceneView.RepaintAll();
            }

            if (skin.skinnedMeshRenderer.sharedMesh != null && GUILayout.Button("Create Control Points"))
            {
                skin.CreateControlPoints(skin.skinnedMeshRenderer);
            }

            EditorGUILayout.Separator();

            if (skin.skinnedMeshRenderer.sharedMesh != null && GUILayout.Button("Reset Control Points"))
            {
                skin.ResetControlPointPositions();
            }

            EditorGUILayout.Separator();

            if (skin.points != null && skin.controlPoints != null && skin.controlPoints.Length > 0 &&
                selectedIndex != -1 && GUILayout.Button("Reset Selected Control Point"))
            {
                skin.controlPoints[selectedIndex].ResetPosition();
                skin.points.SetPoint(skin.controlPoints[selectedIndex]);
            }

            EditorGUILayout.Separator();

            if (GUILayout.Button("Remove Control Points"))
            {
                skin.RemoveControlPoints();
            }

            EditorGUILayout.Separator();

            GUILayout.Label("Generate Assets", EditorStyles.boldLabel);

            EditorGUILayout.Separator();

            if (skin.skinnedMeshRenderer.sharedMesh != null && GUILayout.Button("Generate Mesh Asset"))
            {
                                #if UNITY_EDITOR
                // Check if the Meshes directory exists, if not, create it.
                if (!Directory.Exists("Assets/Meshes"))
                {
                    AssetDatabase.CreateFolder("Assets", "Meshes");
                    AssetDatabase.Refresh();
                }
                Mesh mesh = skin.skinnedMeshRenderer.sharedMesh.Clone();
                mesh.name = skin.skinnedMeshRenderer.sharedMesh.name.Replace(".SkinnedMesh", ".Mesh");

                ScriptableObjectUtility.CreateAsset(mesh, "Meshes/" + skin.gameObject.name + ".Mesh");
                                #endif
            }

            EditorGUILayout.Separator();

            if (skin.skinnedMeshRenderer.sharedMaterial != null && GUILayout.Button("Generate Material Asset"))
            {
                                #if UNITY_EDITOR
                Material material = new Material(skin.skinnedMeshRenderer.sharedMaterial);
                material.CopyPropertiesFromMaterial(skin.skinnedMeshRenderer.sharedMaterial);

                skin.skinnedMeshRenderer.sharedMaterial = material;

                if (!Directory.Exists("Assets/Materials"))
                {
                    AssetDatabase.CreateFolder("Assets", "Materials");
                    AssetDatabase.Refresh();
                }

                AssetDatabase.CreateAsset(material, "Assets/Materials/" + material.mainTexture.name + ".mat");

                Debug.Log("Created material " + material.mainTexture.name + " for " + skin.gameObject.name);
                                #endif
            }
        }