private void OnPortraitDestroyed_MatInfo(apPortrait portrait)
        {
            if (!_portrait2MatUnits_MatInfo.ContainsKey(portrait))
            {
                return;
            }

            List <MaterialUnit> optMatUnitList = _portrait2MatUnits_MatInfo[portrait];
            MaterialUnit        curMatUnit     = null;

            List <Texture>      removedTextureKey = new List <Texture>();
            List <Shader>       removedShaderKey  = new List <Shader>();
            List <MaterialUnit> removedMatUnit    = new List <MaterialUnit>();
            int nRemoved = 0;

            for (int i = 0; i < optMatUnitList.Count; i++)
            {
                curMatUnit = optMatUnitList[i];

                //Mat Set에서 Portrait를 삭제한다.
                if (curMatUnit.RemovePortrait(portrait))
                {
                    //모든 Portrait가 삭제되었다. > 연결된 Portrait가 0
                    //여기서 바로 재질 삭제
                    curMatUnit.RemoveMaterial();

                    //리스트에서 삭제할 준비
                    removedTextureKey.Add(curMatUnit._materialInfo._mainTex);
                    removedShaderKey.Add(curMatUnit._materialInfo._shader);
                    removedMatUnit.Add(curMatUnit);
                    nRemoved++;
                }
            }

            //Debug.LogError(">> " + nRemoved + "개의 쓸모없는 Shared material이 삭제된다.");

            if (nRemoved > 0)
            {
                Texture curTex    = null;
                Shader  curShader = null;
                //MaterialUnit curMatUnit = null;

                List <MaterialUnit> curMatUnits = null;
                for (int i = 0; i < nRemoved; i++)
                {
                    curTex     = removedTextureKey[i];
                    curShader  = removedShaderKey[i];
                    curMatUnit = removedMatUnit[i];

                    if (!_matUnits_MatInfo.ContainsKey(curTex))
                    {
                        continue;
                    }

                    //Texture + Shader에 해당하는 Material Set를 삭제한다.
                    if (!_matUnits_MatInfo[curTex].ContainsKey(curShader))
                    {
                        continue;
                    }

                    curMatUnits = _matUnits_MatInfo[curTex][curShader];

                    curMatUnits.Remove(curMatUnit);

                    //리스트 > Shader > Texture 순으로 Count가 0이면 삭제
                    if (_matUnits_MatInfo[curTex][curShader].Count == 0)
                    {
                        _matUnits_MatInfo[curTex].Remove(curShader);

                        if (_matUnits_MatInfo[curTex].Count == 0)
                        {
                            _matUnits_MatInfo.Remove(curTex);
                        }
                    }
                }
            }

            //마지막으로 연결 리스트도 삭제
            _portrait2MatUnits_MatInfo.Remove(portrait);
        }
        private void OnPortraitDestroyed_Prev(apPortrait portrait)
        {
            if (!_portrait2MatUnits_Prev.ContainsKey(portrait))
            {
                return;
            }

            List <MaterialUnit> optMatUnitList = _portrait2MatUnits_Prev[portrait];
            MaterialUnit        curMatSet      = null;

            List <Texture> removedTextureKey = new List <Texture>();
            List <Shader>  removedShaderKey  = new List <Shader>();
            int            nRemoved          = 0;

            for (int i = 0; i < optMatUnitList.Count; i++)
            {
                curMatSet = optMatUnitList[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 (!_matUnits_Prev.ContainsKey(curTex))
                    {
                        continue;
                    }

                    //Texture + Shader에 해당하는 Material Set를 삭제한다.
                    _matUnits_Prev[curTex].Remove(curShader);

                    //만약 이 Texture 키에 대한 Shader-Set 리스트에 아무런 데이터가 없다면
                    //이 텍스쳐에 대한 Set도 삭제
                    if (_matUnits_Prev[curTex].Count == 0)
                    {
                        _matUnits_Prev.Remove(curTex);
                    }
                }
            }

            //마지막으로 연결 리스트도 삭제
            _portrait2MatUnits_Prev.Remove(portrait);
        }