void GenerateShapes() { var selected = Selection.gameObjects; foreach (var gameObject in selected) { string path = AssetDatabase.GetAssetPath(gameObject); SVGImporter importer = AssetImporter.GetAtPath(path) as SVGImporter; if (importer != null) { var sprite = (Sprite)importer.targetObject; Selection.activeObject = sprite; spriteWindow = Type.GetType("UnityEditor.SpriteEditorWindow, UnityEditor", true); var getWindowMethod = spriteWindow.GetMethod("GetWindow", BindingFlags.Public | BindingFlags.Static); getWindowMethod.Invoke(null, null); //if (spriteWindowInstance == null) spriteWindowInstance = spriteWindow.GetField("s_Instance").GetValue(null); SpriteWindowMethod("OnSelectionChange"); //string selecionPath = SpriteWindowMethod("GetSelectionAssetPath") as string; //Choose custom outline mode SpriteWindowMethod("SetupModule", (object)1); Type spritePhysicsShapeModule = Type.GetType("UnityEditor.U2D.SpritePhysicsShapeModule, UnityEditor", true); object outlineWindowInstance = SpriteWindowField("m_CurrentModule"); Type spriteOutlineModule = spritePhysicsShapeModule.BaseType; //Method(Type.GetType("UnityEditor.Experimental.U2D.SpriteEditorModuleBase, UnityEditor", true), outlineWindowInstance, "OnModuleActivate", null); object m_Outline = spriteOutlineModule.GetField("m_Outline", bf).GetValue(outlineWindowInstance); Type spriteOutlineModel = Type.GetType("UnityEditor.U2D.SpriteOutlineModel, UnityEditor", true); object m_SpriteOutlineList = spriteOutlineModel.InvokeMember("", BindingFlags.GetProperty, null, m_Outline, new object[] { 0 }); Type SpriteOutlineList = Type.GetType("UnityEditor.U2D.SpriteOutlineList, UnityEditor", true); SpriteOutlineList.GetField("m_TessellationDetail", bf).SetValue(m_SpriteOutlineList, 0.3f); //3. this.SetupShapeEditorOutline(this.m_Selected); SpriteRect m_Selected = spriteOutlineModule.GetField("m_Selected", bf).GetValue(outlineWindowInstance) as SpriteRect; Method(spriteOutlineModule, outlineWindowInstance, "SetupShapeEditorOutline", m_Selected); List <Vector2[]> outlines = new List <Vector2[]>((List <Vector2[]>)Method(SpriteOutlineList, m_SpriteOutlineList, "ToListVector")); float tessellation = (float)SpriteOutlineList.GetField("m_TessellationDetail", bf).GetValue(m_SpriteOutlineList); Method(Type.GetType("UnityEditor.Experimental.U2D.SpriteEditorModuleBase, UnityEditor", true), outlineWindowInstance, "ApplyRevert", true); //Method(Type.GetType("UnityEditor.Experimental.U2D.SpriteEditorModuleBase, UnityEditor", true), outlineWindowInstance, "OnModuleDeactivate", null); object ISpriteEditor = spritePhysicsShapeModule.GetProperty("spriteEditorWindow", bf).GetValue(outlineWindowInstance); Method(Type.GetType("UnityEditor.Experimental.U2D.ISpriteEditor, UnityEditor", true), ISpriteEditor, "ApplyOrRevertModification", true); //Method(Type.GetType("UnityEditor.Experimental.U2D.ISpriteEditor, UnityEditor", true), ISpriteEditor, "SetDataModified"); //spriteOutlineModule.GetField("shapeEditorDirty").SetValue(outlineWindowInstance, true); Debug.Log(outlines[0].Length + " count"); //AssetDatabase.Refresh(); //EditorUtility.SetDirty(sprite); //AssetDatabase.SaveAssets(); //OverwriteOutline(sprite, tessellation, outlines); } } }
void GenerateShapesBasedOnMesh() { var selected = Selection.gameObjects; foreach (var gameObject in selected) { string path = AssetDatabase.GetAssetPath(gameObject); SVGImporter importer = AssetImporter.GetAtPath(path) as SVGImporter; if (importer != null) { var sprite = (Sprite)importer.targetObject; var outlines = SpriteBorder.Generate(gameObject, Vector3.zero); Rect rect = sprite.rect; Bounds bounds = sprite.bounds; List <Vector2[]> newOutlines = new List <Vector2[]>(outlines.Count); foreach (var outline in outlines) { List <Vector2> converterOutline = new List <Vector2>(outline.Count); foreach (var v in outline) { converterOutline.Add(new Vector2(v.x * (rect.width / bounds.size.x), v.y * (rect.height / bounds.size.y))); } newOutlines.Add(converterOutline.ToArray()); } OverwriteOutline(sprite, 0, newOutlines); Debug.Log(outlines.Count + " -> outlines.Count"); //Vector2 outlines //Selection.activeObject = sprite; //spriteWindow = Type.GetType("UnityEditor.SpriteEditorWindow, UnityEditor", true); //var getWindowMethod = spriteWindow.GetMethod("GetWindow", BindingFlags.Public | BindingFlags.Static); //getWindowMethod.Invoke(null, null); ////if (spriteWindowInstance == null) //spriteWindowInstance = spriteWindow.GetField("s_Instance").GetValue(null); //SpriteWindowMethod("OnSelectionChange"); ////string selecionPath = SpriteWindowMethod("GetSelectionAssetPath") as string; ////Choose custom outline mode //SpriteWindowMethod("SetupModule", (object)1); //Type spritePhysicsShapeModule = Type.GetType("UnityEditor.U2D.SpritePhysicsShapeModule, UnityEditor", true); //object outlineWindowInstance = SpriteWindowField("m_CurrentModule"); //Type spriteOutlineModule = spritePhysicsShapeModule.BaseType; ////Method(Type.GetType("UnityEditor.Experimental.U2D.SpriteEditorModuleBase, UnityEditor", true), outlineWindowInstance, "OnModuleActivate", null); //object m_Outline = Field(spriteOutlineModule, outlineWindowInstance, "m_Outline"); //Type spriteOutlineModel = Type.GetType("UnityEditor.U2D.SpriteOutlineModel, UnityEditor", true); //object m_SpriteOutlineList = spriteOutlineModel.InvokeMember("", BindingFlags.GetProperty, null, m_Outline, new object[] { 0 }); //Type SpriteOutlineList = Type.GetType("UnityEditor.U2D.SpriteOutlineList, UnityEditor", true); //SpriteOutlineList.GetField("m_TessellationDetail", bf).SetValue(m_SpriteOutlineList, 0.3f); ////3. this.SetupShapeEditorOutline(this.m_Selected); //SpriteRect m_Selected = spriteOutlineModule.GetField("m_Selected", bf).GetValue(outlineWindowInstance) as SpriteRect; //Method(spriteOutlineModule, outlineWindowInstance, "SetupShapeEditorOutline", m_Selected); //List<Vector2[]> outlines = new List<Vector2[]>((List<Vector2[]>)Method(SpriteOutlineList, m_SpriteOutlineList, "ToListVector")); //float tessellation = (float)SpriteOutlineList.GetField("m_TessellationDetail", bf).GetValue(m_SpriteOutlineList); //Method(Type.GetType("UnityEditor.Experimental.U2D.SpriteEditorModuleBase, UnityEditor", true), outlineWindowInstance, "ApplyRevert", true); ////Method(Type.GetType("UnityEditor.Experimental.U2D.SpriteEditorModuleBase, UnityEditor", true), outlineWindowInstance, "OnModuleDeactivate", null); //object ISpriteEditor = spritePhysicsShapeModule.GetProperty("spriteEditorWindow", bf).GetValue(outlineWindowInstance); //Method(Type.GetType("UnityEditor.Experimental.U2D.ISpriteEditor, UnityEditor", true), ISpriteEditor, "ApplyOrRevertModification", true); ////Method(Type.GetType("UnityEditor.Experimental.U2D.ISpriteEditor, UnityEditor", true), ISpriteEditor, "SetDataModified"); ////spriteOutlineModule.GetField("shapeEditorDirty").SetValue(outlineWindowInstance, true); //Debug.Log(outlines[0].Length + " count"); //AssetDatabase.Refresh(); //EditorUtility.SetDirty(sprite); //AssetDatabase.SaveAssets(); //OverwriteOutline(sprite, tessellation, outlines); } } }