// Event //----------------------------------------------------------------------------- /// <summary> /// apPortrait가 없어질때 호출해야한다. /// 가져다쓴 Material이 있다면 최적화를 위해 등록을 해제하고 삭제 여부를 결정한다. /// </summary> /// <param name="portrait"></param> public void OnPortraitDestroyed(apPortrait portrait) { //Debug.LogError("Shared Material - OnPortraitDestroyed : " + portrait.name); if (!_portrait2MaterialSets.ContainsKey(portrait)) { return; } List <OptMaterialSet> optMatSetList = _portrait2MaterialSets[portrait]; OptMaterialSet curMatSet = null; List <Texture> removedTextureKey = new List <Texture>(); List <Shader> removedShaderKey = new List <Shader>(); int nRemoved = 0; for (int i = 0; i < optMatSetList.Count; i++) { curMatSet = optMatSetList[i]; //Mat Set에서 Portrait를 삭제한다. if (curMatSet.RemovePortrait(portrait)) { //모든 Portrait가 삭제되었다. //여기서 바로 재질 삭제 curMatSet.RemoveMaterial(); //리스트에서 삭제할 준비 removedTextureKey.Add(curMatSet._texture); removedShaderKey.Add(curMatSet._shader); nRemoved++; } } //Debug.LogError(">> " + nRemoved + "개의 쓸모없는 Shared material이 삭제된다."); if (nRemoved > 0) { Texture curTex = null; Shader curShader = null; for (int i = 0; i < nRemoved; i++) { curTex = removedTextureKey[i]; curShader = removedShaderKey[i]; if (!_materialSets.ContainsKey(curTex)) { continue; } //Texture + Shader에 해당하는 Material Set를 삭제한다. _materialSets[curTex].Remove(curShader); //만약 이 Texture 키에 대한 Shader-Set 리스트에 아무런 데이터가 없다면 //이 텍스쳐에 대한 Set도 삭제 if (_materialSets[curTex].Count == 0) { _materialSets.Remove(curTex); } } } //마지막으로 연결 리스트도 삭제 _portrait2MaterialSets.Remove(portrait); }
// Functions //----------------------------------------------------------------------------- public Material GetSharedMaterial(Texture texture, Shader shader, apPortrait portrait) { #if UNITY_EDITOR if (UnityEditor.BuildPipeline.isBuildingPlayer) { return(null); } #endif OptMaterialSet matSet = null; //Debug.LogWarning("Shared Material - Get Shared Material [ " + texture.name + " / " + shader.name + " / " + portrait.name + " ]"); if (_materialSets.ContainsKey(texture)) { if (_materialSets[texture].ContainsKey(shader)) { matSet = _materialSets[texture][shader]; //Debug.Log(">> 기존에 만들어진 Material 리턴"); } else { //새로운 Material Set 생성 matSet = new OptMaterialSet(texture, shader); //Shader 키와 함께 등록 _materialSets[texture].Add(shader, matSet); //Debug.Log(">> (!) 새로운 Material 리턴"); } } else { //새로운 Material Set 생성 matSet = new OptMaterialSet(texture, shader); //Texture 키와 리스트 생성 _materialSets.Add(texture, new Dictionary <Shader, OptMaterialSet>()); //Shader 키와 함께 등록 _materialSets[texture].Add(shader, matSet); //Debug.Log(">> (!) 새로운 Material 리턴"); } //Portrait 등록 matSet.LinkPortrait(portrait); List <OptMaterialSet> matSetList = null; if (!_portrait2MaterialSets.ContainsKey(portrait)) { _portrait2MaterialSets.Add(portrait, new List <OptMaterialSet>()); } matSetList = _portrait2MaterialSets[portrait]; if (!matSetList.Contains(matSet)) { matSetList.Add(matSet); } //Shader Material 반환 return(matSet._material); }