Exemplo n.º 1
0
        void OnPreprocessTexture()
        {
            if (!s_Initialized)
            {
                return;
            }

            string guid = AssetDatabase.AssetPathToGUID(assetPath);

            if (s_SpriteMeshToTextureCache.ContainsValue(guid))
            {
                TextureImporter    textureImporter        = (TextureImporter)assetImporter;
                SerializedObject   textureImporterSO      = new SerializedObject(textureImporter);
                SerializedProperty textureImporterSprites = textureImporterSO.FindProperty("m_SpriteSheet.m_Sprites");

                foreach (KeyValuePair <string, string> pair in s_SpriteMeshToTextureCache)
                {
                    if (pair.Value == guid)
                    {
                        SpriteMesh     spriteMesh     = LoadSpriteMesh(AssetDatabase.GUIDToAssetPath(pair.Key));
                        SpriteMeshData spriteMeshData = SpriteMeshUtils.LoadSpriteMeshData(spriteMesh);

                        if (spriteMesh && spriteMeshData && spriteMesh.sprite && spriteMeshData.vertices.Length > 0)
                        {
                            SerializedProperty spriteProp = null;
                            int    i    = 0;
                            string name = "";

                            while (i < textureImporterSprites.arraySize && name != spriteMesh.sprite.name)
                            {
                                spriteProp = textureImporterSprites.GetArrayElementAtIndex(i);
                                name       = spriteProp.FindPropertyRelative("m_Name").stringValue;

                                ++i;
                            }

                            if (name == spriteMesh.sprite.name)
                            {
                                Rect textureRect = SpriteMeshUtils.CalculateSpriteRect(spriteMesh, 5);
                                spriteProp.FindPropertyRelative("m_Rect").rectValue     = textureRect;
                                spriteProp.FindPropertyRelative("m_Alignment").intValue = 9;
                                spriteProp.FindPropertyRelative("m_Pivot").vector2Value = Vector2.Scale(spriteMeshData.pivotPoint - textureRect.position, new Vector2(1f / textureRect.size.x, 1f / textureRect.size.y));
                                textureImporter.userData = textureImporter.assetTimeStamp.ToString();
                            }
                        }
                    }
                }

                textureImporterSO.ApplyModifiedProperties();
            }
        }
        static void DoSpriteOverride(SpriteMesh spriteMesh, Sprite sprite)
        {
            SpriteMeshData spriteMeshData = SpriteMeshUtils.LoadSpriteMeshData(spriteMesh);

            if (spriteMeshData)
            {
                Rect rect       = SpriteMeshUtils.CalculateSpriteRect(spriteMesh, 5);
                Rect spriteRect = sprite.rect;

                Vector2 factor = new Vector2(spriteRect.width / rect.width, spriteRect.height / rect.height);

                Vector2[] newVertices = new List <Vector2>(spriteMeshData.vertices).ConvertAll(v => MathUtils.ClampPositionInRect(Vector2.Scale(v, factor), spriteRect) - spriteRect.position).ToArray();
                ushort[]  newIndices  = new List <int>(spriteMeshData.indices).ConvertAll <ushort>(i => (ushort)i).ToArray();

                sprite.OverrideGeometry(newVertices, newIndices);
            }
        }
Exemplo n.º 3
0
        void DoSpriteOverride(SpriteMesh spriteMesh, Sprite sprite)
        {
            TextureImporter textureImporter = (TextureImporter)assetImporter;

#if UNITY_5_1 || UNITY_5_2 || UNITY_5_3_OR_NEWER
            Debug.Assert(textureImporter.spriteImportMode == SpriteImportMode.Single ||
                         textureImporter.spriteImportMode == SpriteImportMode.Multiple,
                         "Incompatible Sprite Mode. Use Single or Multiple.");
#endif

            SpriteMeshData spriteMeshData = SpriteMeshUtils.LoadSpriteMeshData(spriteMesh);

            if (spriteMeshData)
            {
                Vector2 factor           = Vector2.one;
                Rect    spriteRect       = sprite.rect;
                Rect    rectTextureSpace = new Rect();

                if (textureImporter.spriteImportMode == SpriteImportMode.Single)
                {
                    int width  = 0;
                    int height = 0;

                    SpriteMeshUtils.GetSpriteTextureSize(spriteMesh.sprite, ref width, ref height);
                    rectTextureSpace = new Rect(0, 0, width, height);
                }
                else if (textureImporter.spriteImportMode == SpriteImportMode.Multiple)
                {
                    rectTextureSpace = SpriteMeshUtils.CalculateSpriteRect(spriteMesh, 5);
                }

                factor = new Vector2(spriteRect.width / rectTextureSpace.width,
                                     spriteRect.height / rectTextureSpace.height);

                Vector2[] newVertices = new List <Vector2>(spriteMeshData.vertices).ConvertAll(v =>
                                                                                               MathUtils.ClampPositionInRect(Vector2.Scale(v, factor), spriteRect) - spriteRect.position)
                                        .ToArray();
                ushort[] newIndices =
                    new List <int>(spriteMeshData.indices).ConvertAll <ushort>(i => (ushort)i).ToArray();

                sprite.OverrideGeometry(newVertices, newIndices);
            }
        }