using System; using UnityEngine; using System.Collections; using System.Collections.Generic; using Object = UnityEngine.Object; namespace Game.SpriteDeformerTools { public class BaseOfMaterials { private static Dictionary materialList = new Dictionary(); public class MaterialBaseElement { public int count = 0; public Material refMaterial; public Dictionary materialsByTexture = new Dictionary(); public Material GetMaterialByTexture(Texture texture) { if (!materialsByTexture.ContainsKey(texture)) { materialsByTexture[texture] = new TextureBaseElement(); materialsByTexture[texture].material = (Material)Material.Instantiate(refMaterial); materialsByTexture[texture].material.mainTexture = texture; materialsByTexture[texture].material.name += "_batch"; } materialsByTexture[texture].count++; count++; return materialsByTexture[texture].material; } } public class TextureBaseElement { public int count = 0; public Material material; } internal static Material GetMaterial(Material referenceMaterial, Texture texture) { if (referenceMaterial == null) return null; Material m = null; if (materialList.ContainsKey(referenceMaterial)) { m = materialList[referenceMaterial].GetMaterialByTexture(texture); } else { materialList[referenceMaterial] = new MaterialBaseElement(); materialList[referenceMaterial].refMaterial = referenceMaterial; m = materialList[referenceMaterial].GetMaterialByTexture(texture); } return m; } public static void IDestory(Material refMaterial, Texture texture) { MaterialBaseElement mbe = null;//materialList[refMaterial]; if (!materialList.TryGetValue(refMaterial, out mbe)) { return; } mbe.materialsByTexture[texture].count--; if (mbe.materialsByTexture[texture].count == 0) { Object.DestroyImmediate(mbe.materialsByTexture[texture].material); mbe.materialsByTexture.Remove(texture); } mbe.count--; if (mbe.count == 0) { materialList.Remove(refMaterial); } } public static Material[] GetAllMaterialsByReferenceMaterial(Material referensMaterial) { List materials = new List(); if (materialList.ContainsKey(referensMaterial)) { MaterialBaseElement mbe = materialList[referensMaterial]; foreach (TextureBaseElement tb in mbe.materialsByTexture.Values) { materials.Add(tb.material); } } return materials.ToArray(); } } }