Пример #1
0
        // 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);
        }
Пример #2
0
        // 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);
        }