Exemplo n.º 1
0
        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);
        }
Exemplo n.º 3
0
        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();
        }
Exemplo n.º 4
0
        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;
            }
        }