Beispiel #1
0
        public IEnumerator LinkAsync(apPortrait portrait, apOptRootUnit rootUnit, apAsyncTimer asyncTimer)
        {
            if (!_isBaked)
            {
                //return;
                yield break;
            }
            //_parentRootUnit = rootUnit;
            if (_nOptTransforms == 0)
            {
                //return;
                yield break;
            }
            OptBufferData  curBuff            = null;
            apOptTransform linkedOptTransform = null;

            if (_optTransform2Buff == null)
            {
                _optTransform2Buff = new Dictionary <apOptTransform, OptBufferData>();
            }
            _optTransform2Buff.Clear();

            for (int i = 0; i < _nOptTransforms; i++)
            {
                curBuff            = _buffers[i];
                linkedOptTransform = rootUnit.GetTransform(curBuff._optTransformID);
                if (linkedOptTransform == null)
                {
                    curBuff._optTransform = null;
                    continue;
                }

                curBuff._optTransform = linkedOptTransform;
                curBuff.ResetLink();

                //OptTransform2Buff에도 연결
                if (_optTransform2Buff.ContainsKey(linkedOptTransform))
                {
                    continue;
                }

                _optTransform2Buff.Add(linkedOptTransform, curBuff);

                //Async Wait
                if (asyncTimer.IsYield())
                {
                    yield return(asyncTimer.WaitAndRestart());
                }
            }

            //OptTransform을 돌면서 부모/자식 관계를 연결해준다.
            apOptTransform parentOptTransform = null;
            OptBufferData  parentBuff         = null;

            for (int i = 0; i < _nOptTransforms; i++)
            {
                curBuff            = _buffers[i];
                linkedOptTransform = curBuff._optTransform;
                if (linkedOptTransform == null)
                {
                    continue;
                }

                parentOptTransform = linkedOptTransform._parentTransform;
                if (parentOptTransform != null)
                {
                    if (_optTransform2Buff.ContainsKey(parentOptTransform))
                    {
                        parentBuff = _optTransform2Buff[parentOptTransform];
                        curBuff.SetParent(parentBuff);                        //<<부모로 연결
                    }
                }
            }

            _isNeedToSortDepthChangedBuffers  = true;
            _isNeedToApplyDepthChangedBuffers = true;
            //현재 상태 + 이전 상태에 대해서 모두 값을 가지고 "상태가 바뀔 때" 이벤트를 호출해야한다.
            _isDepthChanged      = false;
            _isDepthChanged_Prev = false;            //<<에디터와 다르게 이 변수에 따라서 "다시 초기화"라는 이벤트를 만들어야 한다.

            //옵션에 따라 자동으로 Mesh의 Sorting Order를 설정해야한다.
            SetSortingOrderChangedAutomatically(true);

            //Async Wait
            if (asyncTimer.IsYield())
            {
                yield return(asyncTimer.WaitAndRestart());
            }
        }
        // Link
        //--------------------------------------------------------------------------
        //OptTransform을 연결해줘야 한다.
        //단, Bake가 안되었다면 이 코드는 패스한다.
        public void Link(apPortrait portrait, apOptRootUnit rootUnit)
        {
            if (!_isBaked)
            {
                return;
            }
            //_parentRootUnit = rootUnit;
            if (_nOptTransforms == 0)
            {
                return;
            }
            OptBufferData  curBuff            = null;
            apOptTransform linkedOptTransform = null;

            if (_optTransform2Buff == null)
            {
                _optTransform2Buff = new Dictionary <apOptTransform, OptBufferData>();
            }
            _optTransform2Buff.Clear();

            for (int i = 0; i < _nOptTransforms; i++)
            {
                curBuff            = _buffers[i];
                linkedOptTransform = rootUnit.GetTransform(curBuff._optTransformID);
                if (linkedOptTransform == null)
                {
                    curBuff._optTransform = null;
                    continue;
                }

                curBuff._optTransform = linkedOptTransform;
                curBuff.ResetLink();

                //OptTransform2Buff에도 연결
                if (_optTransform2Buff.ContainsKey(linkedOptTransform))
                {
                    continue;
                }

                _optTransform2Buff.Add(linkedOptTransform, curBuff);
            }

            //OptTransform을 돌면서 부모/자식 관계를 연결해준다.
            apOptTransform parentOptTransform = null;
            OptBufferData  parentBuff         = null;

            for (int i = 0; i < _nOptTransforms; i++)
            {
                curBuff            = _buffers[i];
                linkedOptTransform = curBuff._optTransform;
                if (linkedOptTransform == null)
                {
                    continue;
                }

                parentOptTransform = linkedOptTransform._parentTransform;
                if (parentOptTransform != null)
                {
                    if (_optTransform2Buff.ContainsKey(parentOptTransform))
                    {
                        parentBuff = _optTransform2Buff[parentOptTransform];
                        curBuff.SetParent(parentBuff);                        //<<부모로 연결
                    }
                }
            }

            _isNeedToSortDepthChangedBuffers  = true;
            _isNeedToApplyDepthChangedBuffers = true;
            //현재 상태 + 이전 상태에 대해서 모두 값을 가지고 "상태가 바뀔 때" 이벤트를 호출해야한다.
            _isDepthChanged      = false;
            _isDepthChanged_Prev = false;            //<<에디터와 다르게 이 변수에 따라서 "다시 초기화"라는 이벤트를 만들어야 한다.
        }