public void ApplyChanges() { if (spriteMeshData) { spriteMeshData.vertices = m_TexVertices.ToArray(); spriteMeshData.boneWeights = boneWeights.ToArray(); spriteMeshData.edges = indexedEdges.ToArray(); spriteMeshData.holes = holes.ConvertAll(h => h.vertex).ToArray(); spriteMeshData.indices = indices.ToArray(); spriteMeshData.bindPoses = bindPoses.ToArray(); spriteMeshData.pivotPoint = pivotPoint; SpriteMeshUtils.DestroyBlendShapes(spriteMeshData, false, ""); SetBlendShapesFromCache(); EditorUtility.SetDirty(spriteMeshData); string spriteAssetPath = AssetDatabase.GetAssetPath(spriteMesh.sprite); SpriteMeshUtils.UpdateAssets(spriteMesh, spriteMeshData); AssetDatabase.SaveAssets(); AssetDatabase.Refresh(); TextureImporter textureImporter = AssetImporter.GetAtPath(spriteAssetPath) as TextureImporter; textureImporter.userData = textureImporter.assetTimeStamp.ToString(); AssetDatabase.StartAssetEditing(); AssetDatabase.ImportAsset(spriteAssetPath); AssetDatabase.StopAssetEditing(); isDirty = false; } if (spriteMeshInstance) { SpriteMeshUtils.UpdateRenderer(spriteMeshInstance, false); } }
public static SpriteMeshInstance CreateSpriteMeshInstance(SpriteMesh spriteMesh, GameObject gameObject, bool undo = true) { SpriteMeshInstance spriteMeshInstance = null; if (spriteMesh && gameObject) { if (undo) { spriteMeshInstance = Undo.AddComponent <SpriteMeshInstance>(gameObject); } else { spriteMeshInstance = gameObject.AddComponent <SpriteMeshInstance>(); } spriteMeshInstance.spriteMesh = spriteMesh; spriteMeshInstance.sharedMaterial = defaultMaterial; SpriteMeshData spriteMeshData = SpriteMeshUtils.LoadSpriteMeshData(spriteMesh); List <Bone2D> bones = new List <Bone2D>(); List <string> paths = new List <string>(); Vector4 zero = new Vector4(0f, 0f, 0f, 1f); foreach (BindInfo bindInfo in spriteMeshData.bindPoses) { Matrix4x4 m = spriteMeshInstance.transform.localToWorldMatrix * bindInfo.bindPose.inverse; GameObject bone = new GameObject(bindInfo.name); if (undo) { Undo.RegisterCreatedObjectUndo(bone, Undo.GetCurrentGroupName()); } Bone2D boneComponent = bone.AddComponent <Bone2D>(); boneComponent.localLength = bindInfo.boneLength; bone.transform.position = m * zero; bone.transform.rotation = m.GetRotation(); bone.transform.parent = gameObject.transform; bones.Add(boneComponent); paths.Add(bindInfo.path); } BoneUtils.ReconstructHierarchy(bones, paths); spriteMeshInstance.bones = bones; SpriteMeshUtils.UpdateRenderer(spriteMeshInstance, undo); EditorUtility.SetDirty(spriteMeshInstance); } return(spriteMeshInstance); }
void DoUpdateRenderer() { SpriteMeshUtils.UpdateRenderer(m_SpriteMeshInstance); #if UNITY_5_5_OR_NEWER #else EditorUtility.SetSelectedWireframeHidden(m_SpriteMeshInstance.cachedRenderer, !m_SpriteMeshInstance.cachedSkinnedRenderer); #endif Undo.CollapseUndoOperations(m_UndoGroup); SceneView.RepaintAll(); }
static void HandleDragAndDrop(bool createOnEnter, Transform parent) { switch (Event.current.type) { case EventType.DragUpdated: if (!init) { spriteMesh = GetSpriteMesh(); if (createOnEnter) { parentTransform = null; CreateInstance(); } Event.current.Use(); init = true; } if (instance) { instance.transform.position = instancePosition; SpriteMeshInstance l_currentDestination = GetClosestBindeableIntersectingSpriteMeshInstance(); if (currentDestination != l_currentDestination) { currentDestination = l_currentDestination; if (currentDestination) { List <Bone2D> destinationBones = currentDestination.bones; List <Bone2D> newBones = new List <Bone2D>(); SpriteMeshData data = SpriteMeshUtils.LoadSpriteMeshData(instance.spriteMesh); for (int i = 0; i < data.bindPoses.Length; ++i) { BindInfo bindInfo = data.bindPoses[i]; int index = FindBindInfo(bindInfo, currentDestination); if (index >= 0 && index < destinationBones.Count) { newBones.Add(destinationBones[index]); } } instance.transform.parent = currentDestination.transform.parent; instance.bones = newBones; SpriteMeshUtils.UpdateRenderer(instance, false); foreach (Bone2D bone in s_InstanceBones) { bone.hideFlags = HideFlags.HideAndDontSave; bone.gameObject.SetActive(false); } } else { foreach (Bone2D bone in s_InstanceBones) { bone.hideFlags = HideFlags.None; bone.gameObject.SetActive(true); } instance.transform.parent = null; instance.bones = s_InstanceBones; SpriteMeshUtils.UpdateRenderer(instance, false); } SceneView.RepaintAll(); } } break; case EventType.DragExited: if (instance) { GameObject.DestroyImmediate(instance.gameObject); Event.current.Use(); } Cleanup(); break; case EventType.DragPerform: if (!createOnEnter) { CreateInstance(); } if (instance) { if (currentDestination) { foreach (Bone2D bone in s_InstanceBones) { if (bone) { GameObject.DestroyImmediate(bone.gameObject); } } } Undo.RegisterCreatedObjectUndo(instance.gameObject, "create SpriteMeshInstance"); } Cleanup(); break; } if (instance) { DragAndDrop.visualMode = DragAndDropVisualMode.Copy; } }