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