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> (); } }
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 } }