1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374 |
- using System.Collections.Generic;
- using UnityEngine;
- namespace Coffee.UIParticleExtensions
- {
- internal class ModifiedMaterial
- {
- private static readonly List<MatEntry> s_Entries = new List<MatEntry>();
- public static Material Add(Material baseMat, Texture texture, int id)
- {
- MatEntry e;
- for (var i = 0; i < s_Entries.Count; ++i)
- {
- e = s_Entries[i];
- if (e.baseMat != baseMat || e.texture != texture || e.id != id) continue;
- ++e.count;
- return e.customMat;
- }
- e = new MatEntry();
- e.count = 1;
- e.baseMat = baseMat;
- e.texture = texture;
- e.id = id;
- e.customMat = new Material(baseMat);
- e.customMat.hideFlags = HideFlags.HideAndDontSave;
- if (texture)
- e.customMat.mainTexture = texture;
- s_Entries.Add(e);
- // Debug.LogFormat(">>>> ModifiedMaterial.Add -> count = {0} {1} {2} {3}", s_Entries.Count, baseMat, texture, id);
- return e.customMat;
- }
- public static void Remove(Material customMat)
- {
- if (!customMat) return;
- for (var i = 0; i < s_Entries.Count; ++i)
- {
- var e = s_Entries[i];
- if (e.customMat != customMat) continue;
- if (--e.count == 0)
- {
- // Debug.LogFormat(">>>> ModifiedMaterial.Add -> count = {0} {1} {2} {3}", s_Entries.Count - 1, e.customMat, e.texture, e.id);
- DestroyImmediate(e.customMat);
- e.baseMat = null;
- e.texture = null;
- s_Entries.RemoveAt(i);
- }
- break;
- }
- }
- private static void DestroyImmediate(Object obj)
- {
- if (!obj) return;
- if (Application.isEditor)
- Object.DestroyImmediate(obj);
- else
- Object.Destroy(obj);
- }
- private class MatEntry
- {
- public Material baseMat;
- public Material customMat;
- public int count;
- public Texture texture;
- public int id;
- }
- }
- }
|