void CreateMaterial() { var path = EditorUtility.SaveFolderPanel("Save Decal", Application.dataPath, "Assets"); if (!string.IsNullOrEmpty(path)) { var mat = new Material(Shader.Find("Decal2D/SpriteDecalUnlit")); var decal = SaveTextureFromSprite(canvas.GetComponent <SpriteRenderer>().sprite, true); TextureResizing.Bilinear(decal, canvas.decalSize); System.IO.File.WriteAllBytes(path + "/" + canvas.name + "_decal.png", decal.EncodeToPNG()); var decalPath = Helper.ConvertLoRelativePath(path) + "/" + canvas.name + "_decal.png"; AssetDatabase.ImportAsset(decalPath); TextureImporter imp = (TextureImporter)AssetImporter.GetAtPath(decalPath); imp.isReadable = true; imp.textureFormat = TextureImporterFormat.ARGB32; imp.mipmapEnabled = true; imp.wrapMode = TextureWrapMode.Clamp; imp.SaveAndReimport(); canvas.decalMaterial = mat; canvas.RescaleDecal(AssetDatabase.LoadAssetAtPath <Texture2D>(decalPath)); AssetDatabase.CreateAsset(mat, Helper.ConvertLoRelativePath(path) + "/" + canvas.name + "_material.mat"); EditorUtility.SetDirty(canvas); var prefabPath = Helper.ConvertLoRelativePath(path) + "/" + canvas.name + ".prefab"; var prefab = PrefabUtility.CreatePrefab(prefabPath, canvas.gameObject); PrefabUtility.ConnectGameObjectToPrefab(canvas.gameObject, prefab); Selection.activeObject = prefab; } }
public static Texture2D CaptureTextureFromSprite(Sprite sprite, string path) { TextureImporter original = (TextureImporter)AssetImporter.GetAtPath(AssetDatabase.GetAssetPath(sprite.texture)); var t_format = original.textureFormat; var t_type = original.textureType; var t_isReadable = original.isReadable; original.textureType = TextureImporterType.Advanced; original.isReadable = true; original.textureFormat = TextureImporterFormat.ARGB32; original.SaveAndReimport(); var relativeRect = sprite.rect; var map = new Texture2D((int)(relativeRect.width), (int)(relativeRect.height), TextureFormat.ARGB32, false, true); var pixels = new List <Color>(map.height * map.width); var xStart = (int)relativeRect.x; var yStart = (int)relativeRect.y; for (int y = yStart; y < yStart + map.height; y++) { for (int x = xStart; x < xStart + map.width; x++) { pixels.Add(sprite.texture.GetPixel(x, y)); } } map.SetPixels(pixels.ToArray()); map.Apply(); original.textureType = t_type; original.isReadable = t_isReadable; original.textureFormat = t_format; original.SaveAndReimport(); if (map.width != data.textureWidth || map.height != data.textureHeight) { TextureResizing.Bilinear(map, data.textureWidth, data.textureHeight); } var b = map.EncodeToPNG(); File.WriteAllBytes(path, b); AssetDatabase.ImportAsset(path); TextureImporter output = (TextureImporter)AssetImporter.GetAtPath(path); output.alphaIsTransparency = true; output.textureType = TextureImporterType.Advanced; output.isReadable = true; output.textureFormat = TextureImporterFormat.RGBA32; output.wrapMode = TextureWrapMode.Repeat; output.normalmapFilter = TextureImporterNormalFilter.Standard; output.npotScale = TextureImporterNPOTScale.ToNearest; output.spriteImportMode = SpriteImportMode.None; output.SaveAndReimport(); return(AssetDatabase.LoadAssetAtPath <Texture2D>(path)); }
void RescaleDecal() { var sprite = canvas.GetComponent <SpriteRenderer>().sprite; TextureResizing.Bilinear(canvas.decal, sprite.rect.width * canvas.decalSize, sprite.rect.height * canvas.decalSize); var decalPath = AssetDatabase.GetAssetPath(canvas.decal); System.IO.File.WriteAllBytes(Helper.ConvertToAbsolutePath(decalPath), canvas.decal.EncodeToPNG()); AssetDatabase.ImportAsset(decalPath); TextureImporter imp = (TextureImporter)AssetImporter.GetAtPath(decalPath); imp.isReadable = true; imp.SaveAndReimport(); canvas.RescaleDecal(canvas.decal); EditorUtility.SetDirty(canvas); }
/// <summary> /// Creates prefab from sprite /// </summary> /// <param name="mesh"></param> /// <param name="name"></param> /// <param name="path"></param> public static void SavePrefabFromSprite(Mesh mesh, string name, string path) { var obj = new GameObject(name); mesh.name = "mesh"; var prefabPath = path + "/" + name + ".prefab"; var mf = obj.AddComponent <MeshFilter>(); var mr = obj.AddComponent <MeshRenderer>(); var mat = new Material(data.shader); var prefab = PrefabUtility.CreatePrefab(prefabPath, obj); mat.name = "material"; mat.mainTexture = data.sprite.texture; AssetDatabase.AddObjectToAsset(mesh, prefab); AssetDatabase.AddObjectToAsset(mat, prefab); if (data.useDecal) { var decal = SaveTextureFromSprite(data.sprite, true); if (data.decalSize != 1) { TextureResizing.Bilinear(decal, (int)(decal.width * data.decalSize), (int)(decal.height * data.decalSize)); } decal.wrapMode = TextureWrapMode.Clamp; decal.name = "decal"; AssetDatabase.AddObjectToAsset(decal, prefab); if (mat.HasProperty("_DecalTex")) { mat.SetTexture("_DecalTex", decal); } } mf = prefab.GetComponent <MeshFilter>(); mr = prefab.GetComponent <MeshRenderer>(); mf.sharedMesh = mesh; mr.sharedMaterial = mat; DestroyImmediate(obj); AssetDatabase.ImportAsset(prefabPath); Selection.activeObject = AssetDatabase.LoadAssetAtPath <GameObject>(prefabPath); }
public static void SavePrefabFolderFromSprite(Mesh mesh, string name, string path) { var obj = new GameObject(name); mesh.name = "mesh"; path += "/" + name; if (!Directory.Exists(path)) { Directory.CreateDirectory(path); } var prefabPath = path + "/" + name + ".prefab"; var matPath = path + "/material.mat"; var meshPath = path + "/mesh.asset"; var mf = obj.AddComponent <MeshFilter>(); var mr = obj.AddComponent <MeshRenderer>(); var mat = new Material(data.shader); var prefab = PrefabUtility.CreatePrefab(prefabPath, obj); mat.name = "material"; mat.mainTexture = data.sprite.texture; AssetDatabase.CreateAsset(mesh, meshPath); AssetDatabase.CreateAsset(mat, matPath); if (data.useDecal) { var decalPath = path + "/decal.png"; var decal = SaveTextureFromSprite(data.sprite, true); if (data.decalSize != 1) { TextureResizing.Bilinear(decal, (int)(decal.width * data.decalSize), (int)(decal.height * data.decalSize)); } decal.wrapMode = TextureWrapMode.Clamp; decal.name = "decal"; var b = decal.EncodeToPNG(); File.WriteAllBytes(Application.dataPath.Remove(Application.dataPath.Length - 6, 6) + decalPath, b); AssetDatabase.ImportAsset(decalPath); TextureImporter output = (TextureImporter)AssetImporter.GetAtPath(decalPath); output.alphaIsTransparency = true; output.textureType = TextureImporterType.Advanced; output.isReadable = true; output.textureFormat = TextureImporterFormat.RGBA32; output.wrapMode = TextureWrapMode.Repeat; output.normalmapFilter = TextureImporterNormalFilter.Standard; output.npotScale = TextureImporterNPOTScale.ToNearest; output.spriteImportMode = SpriteImportMode.None; output.SaveAndReimport(); if (mat.HasProperty("_DecalTex")) { mat.SetTexture("_DecalTex", AssetDatabase.LoadAssetAtPath <Texture2D>(decalPath)); } } mf = prefab.GetComponent <MeshFilter>(); mr = prefab.GetComponent <MeshRenderer>(); mf.sharedMesh = mesh; mr.sharedMaterial = mat; DestroyImmediate(obj); AssetDatabase.ImportAsset(prefabPath); Selection.activeObject = AssetDatabase.LoadAssetAtPath <GameObject>(prefabPath); }
public void Generate(Texture2D texture, Rect rect, float scale) { currentScale = scale; m_width = (int)rect.width; m_heigth = (int)rect.height; int i = 0; var xStart = (int)rect.x; var yStart = (int)rect.y; var tmpTexture = new Texture2D(m_width, m_heigth, TextureFormat.ARGB32, true); #if UNITY_EDITOR var imp = (UnityEditor.TextureImporter)UnityEditor.AssetImporter.GetAtPath(UnityEditor.AssetDatabase.GetAssetPath(texture)) as UnityEditor.TextureImporter; if (imp != null && !imp.isReadable) { imp.isReadable = true; imp.SaveAndReimport(); } #endif for (int y = 0; y < m_heigth; y++) { for (int x = 0; x < m_width; x++) { tmpTexture.SetPixel(x, y, texture.GetPixel(xStart + x, yStart + y)); i++; } } tmpTexture.Apply(); if (scale < 1) { m_width = (int)(m_width * scale); m_heigth = (int)(m_heigth * scale); if (texture.filterMode == FilterMode.Point) { TextureResizing.Point(tmpTexture, m_width, m_heigth); } else { TextureResizing.Bilinear(tmpTexture, m_width, m_heigth); } } List <Point> list = new List <Point>(m_width * m_heigth); for (int y = 0; y < m_heigth; y++) { for (int x = 0; x < m_width; x++) { var p = tmpTexture.GetPixel(x, y); if (p.a > 0) { var point = new Point(x, y, tmpTexture.GetPixel(x, y)); list.Add(point); } } } m_points = list.ToArray(); #if UNITY_EDITOR if (m_iconPreview != null) { DestroyImmediate(m_iconPreview, true); } m_iconPreview = tmpTexture; m_iconPreview.hideFlags = HideFlags.HideInHierarchy; UnityEditor.AssetDatabase.AddObjectToAsset(m_iconPreview, this); #else DestroyImmediate(tmpTexture); #endif }