/// <summary> 재료아이템 및 코스튬 데이터 셋팅 사전 검사 필요함.</summary>
    void InitEvolve(NetData._CostumeData costumeData)
    {
        ushort minor      = costumeData._MinorGrade;
        int    starLength = EvolveStars.Length;

        for (int i = 0; i < starLength; i++)
        {
            EvolveStars[i].SetActive(i < minor);

            //if (i < minor)
            //    EvolveStars[i].SetActive(true);
            //else
            //    EvolveStars[i].SetActive(false);
        }

        //재료 셋팅
        bool isCanNotEvolve = false;
        int  loopCount      = EvolInvenSlots.Length;

        for (int i = 0; i < loopCount; i++)
        {
            NetData.MaterialData md = EvolveMaterialData.MaterialList[i];
            int    nowAmount        = UserInfo.GetItemCountForItemId(md.ItemId, (byte)eItemType.USE);
            ushort amount           = (ushort)(md.Amount + (minor * md.AddValue));

            if (nowAmount < amount && !isCanNotEvolve)
            {
                isCanNotEvolve = true;
            }

            int arr = i;
            EvolMaterialAmount[i].text = string.Format("{0} / {1}", nowAmount, amount);
            EvolInvenSlots[i].SetLowDataItemSlot(md.ItemId, 0, (lowDataId) => {
                UIMgr.OpenDetailPopup(this, (uint)lowDataId);
                //UIMgr.OpenClickPopup((uint)lowDataId, EvolInvenSlots[arr].transform.position);
            });
        }

        ulong needPrice = EvolveMaterialData.Price + (EvolveMaterialData.AddPrice * costumeData._MinorGrade);

        EvolveCost.text = string.Format("{0:#,#} {1}", needPrice, _LowDataMgr.instance.GetStringCommon(32));

        NetData.ItemAbilityData ability = costumeData.AbilityData;
        string abilityText = null;

        float abilityValue = _LowDataMgr.instance.GetCostumeAbilityValue(costumeData._Grade, costumeData._MinorGrade, ability.Value);

        abilityText = string.Format("{0} {1}"
                                    , UIMgr.instance.GetAbilityLocName(ability.Ability)                  //이름
                                    , UIMgr.instance.GetAbilityStrValue(ability.Ability, abilityValue)); //지금 능력치

        TargetCostume[0].gameObject.SetActive(true);
        TargetCostume[0].FindChild("icon").GetComponent <UISprite>().spriteName = costumeData.GetIconName();
        TargetCostume[0].FindChild("name").GetComponent <UILabel>().text        = costumeData.GetLocName();
        TargetCostume[0].FindChild("info").GetComponent <UILabel>().text        = costumeData.GetDescription();
        TargetCostume[0].FindChild("ability").GetComponent <UILabel>().text     = abilityText;
        EvolCount.text = string.Format("{0}", costumeData._Grade);
        //TargetCostumeAbility.text = abilityText;
    }
    /// <summary> 코스튬 획득 응답. </summary>
    public void OnReceiveGetCostume(NetData._CostumeData costumeData)
    {
        Transform  gridTf = ViewObj[(uint)ViewType.List].transform.FindChild("ScrollView/Grid");
        Transform  slotTf = gridTf.FindChild(string.Format("{0}", costumeData._costmeDataIndex));//gridTf.GetChild(SelectCostumeTfArr);
        GameObject eff    = UIHelper.CreateEffectInGame(slotTf, "Fx_UI_costume_select");

        Destroy(eff, 2f);
        //TempCoroutine.instance.FrameDelay()
        //CostumeListView();

        //아이템리스트에서 현재의 조각아이템을 찾아서 갯수를 가져온다 - 자주쓸거같으면 _Inventory안에 만들기
        //NetData._CostumeData costumeData = UserInfo.GetCostumeDataForLowDataID(costumeLowDataId);
        Item.CostumeInfo tempCos = costumeData.GetLowData();//_LowDataMgr.instance.GetLowDataCostumeInfo(costumeLowDataId);
        int shardCount           = UserInfo.GetItemCountForItemId(tempCos.ShardIdx, (byte)eItemType.USE);

        UILabel  nameAndStack = slotTf.FindChild("costume/name_and_stack_d1").GetComponent <UILabel>();
        UILabel  ability      = slotTf.FindChild("costume/ability_d1").GetComponent <UILabel>();
        UILabel  info         = slotTf.FindChild("costume/info_d1").GetComponent <UILabel>();
        UISprite icon         = slotTf.FindChild("costume/icon").GetComponent <UISprite>();

        NetData.ItemAbilityData abilityData = costumeData.AbilityData;
        float abilityValue = _LowDataMgr.instance.GetCostumeAbilityValue(costumeData._Grade, costumeData._MinorGrade, abilityData.Value);

        nameAndStack.text = string.Format("{0} ({1}/{2})", costumeData.GetLocName(), shardCount, costumeData._needShard);
        ability.text      = string.Format("{0} {1}", UIMgr.instance.GetAbilityLocName(abilityData.Ability)         //이름
                                          , UIMgr.instance.GetAbilityStrValue(abilityData.Ability, abilityValue)); //abilityData.Value * 0.1f));//지금 능력치

        info.text       = costumeData.GetDescription();
        icon.spriteName = costumeData.GetIconName();

        UIButton       uiBtnGet   = slotTf.FindChild("costume/BtnGet").GetComponent <UIButton>();
        UIEventTrigger uiTriMount = slotTf.FindChild("costume/BtnMount").GetComponent <UIEventTrigger>();
        GameObject     mountEff   = slotTf.FindChild("costume/mount_effect").gameObject;

        uiBtnGet.gameObject.SetActive(false);
        mountEff.SetActive(false);

        ///보유중
        uiTriMount.collider.enabled = true;
        uiTriMount.transform.GetComponent <UILabel>().text = _LowDataMgr.instance.GetStringCommon(38);
        EventDelegate.Set(uiTriMount.onClick, delegate() { OnClickMountCostume(costumeData); });

        string msg = string.Format(_LowDataMgr.instance.GetStringCommon(832), costumeData.GetLocName());

        UIMgr.AddLogChat(msg);
    }
    void InitSocket()
    {
        Transform socketTf = GetViewObj(CurViewType).transform;

        NetData._CostumeData    costumeData = UserInfo.GetEquipCostume();
        NetData.ItemAbilityData ability     = costumeData.AbilityData;

        float abilityValue = _LowDataMgr.instance.GetCostumeAbilityValue(costumeData._Grade, costumeData._MinorGrade, ability.Value);

        TargetCostume[1].gameObject.SetActive(true);
        TargetCostume[1].FindChild("icon").GetComponent <UISprite>().spriteName = costumeData.GetIconName();
        TargetCostume[1].FindChild("name").GetComponent <UILabel>().text        = costumeData.GetLocName();
        TargetCostume[1].FindChild("info").GetComponent <UILabel>().text        = costumeData.GetDescription();
        TargetCostume[1].FindChild("ability").GetComponent <UILabel>().text     = string.Format("{0} {1}", UIMgr.instance.GetAbilityLocName(ability.Ability)
                                                                                                , UIMgr.instance.GetAbilityStrValue(ability.Ability, abilityValue));   //지금 능력치

        //if(DetailPopup == null)
        //    DetailPopup = UIMgr.OpenDetailPopup(this);

        //코스튬에 보석 공간 확인
        for (ushort i = 0; i < SystemDefine.MaxJewelCount; i++)
        {
            string         itemName    = null;
            string         itemAbility = null;
            string         itemDesc    = null;
            UIEventTrigger uiTri       = SocketRootTfs[i].GetComponent <UIEventTrigger>();

            uint jewelLowDataId = costumeData._EquipJewelLowId[i];
            if (0 < jewelLowDataId)
            {
                Item.ItemInfo useLowData = _LowDataMgr.instance.GetUseItem(jewelLowDataId);
                //Item.ItemValueInfo valueLowData = _LowDataMgr.instance.GetLowDataItemValueInfo(useLowData.OptionIndex1);
                //LockImg.SetActive(false);

                itemDesc = _LowDataMgr.instance.GetStringItem(useLowData.DescriptionId);
                JewelInvenSlots[i].SetLowDataItemSlot(jewelLowDataId, 0, null);
                itemName    = _LowDataMgr.instance.GetStringItem(useLowData.NameId);
                itemAbility = string.Format("{0} {1}", UIMgr.instance.GetAbilityLocName((AbilityType)useLowData.OptionType),
                                            UIMgr.instance.GetAbilityStrValue((AbilityType)useLowData.OptionType, useLowData.value * 0.1f));
            }
            else//그런거 없음 빈 슬롯.
            {
                JewelInvenSlots[i].EmptySlot();
                //LockImg.SetActive(true);
            }
            UILabel nameLbl    = SocketRootTfs[i].FindChild("item_name").GetComponent <UILabel>();
            UILabel abilityLbl = SocketRootTfs[i].FindChild("ability").GetComponent <UILabel>();
            UILabel descLbl    = SocketRootTfs[i].FindChild("desc").GetComponent <UILabel>();

            //승급에따라 슬롯수가 결정됨, 보석슬롯 락처리
            int        maxJewelSlot = costumeData.MaxJewelSlot;
            GameObject LockImg      = SocketRootTfs[i].FindChild("Lock").gameObject; // 락이미지
            LockImg.SetActive(maxJewelSlot <= i);



            nameLbl.text    = itemName;
            abilityLbl.text = itemAbility;
            descLbl.text    = itemDesc;
        }

        if (JewelGrid.transform.childCount <= 0)//처음으로 클릭함. 슬롯 생성 및 갱신해준다.
        {
            int maxInvenSlot = _LowDataMgr.instance.GetEtcTableValue <int>(EtcID.InvenMax);
            List <NetData._ItemData> jewelList = UserInfo.GetTypeItemList(eItemType.USE, AssetType.Jewel);
            jewelList.Sort(SortJewel);
            for (int i = 0; i < maxInvenSlot; i++)
            {
                GameObject slotGo = Instantiate(InvenSlotPrefab) as GameObject;
                Transform  slotTf = slotGo.transform;
                slotTf.parent        = JewelGrid.transform;
                slotTf.localPosition = Vector3.zero;
                slotTf.localScale    = Vector3.one;

                InvenItemSlotObject invenSlot = slotGo.GetComponent <InvenItemSlotObject>();
                if (i < jewelList.Count)
                {
                    invenSlot.SetInvenItemSlot(jewelList[i], OnClickInvenItemSlot);
                    //SocketRootTfs[i].FindChild("Lock").gameObject.SetActive(false);
                }
                else
                {
                    invenSlot.EmptySlot();
                }
            }

            JewelScrollView.ResetPosition();
        }

        //선택되어 있는 소켓 기본 0번으로 셋팅
        SelectJewelArr = 0;
        if (costumeData.MaxJewelSlot > 0)
        {
            for (int i = 0; i < SocketRootTfs.Length; i++)
            {
                GameObject select = SocketRootTfs[i].transform.FindChild("cover").gameObject;
                select.SetActive(i == SelectJewelArr);
            }
        }
    }
    /// <summary>
    /// 코스튬 뷰를 보여준다.
    /// </summary>
    void CostumeListView()
    {
        List <NetData._CostumeData> costimeList = UserInfo.GetCostumeList();
        Transform listTf = ViewObj[(uint)ViewType.List].transform;
        Transform gridTf = listTf.FindChild("ScrollView/Grid");

        for (int i = 0; i < gridTf.childCount; /*costimeList.Count;*/ i++)
        {
            Transform slotTf = gridTf.GetChild(i);

            slotTf.FindChild("costume").gameObject.SetActive(false);
            slotTf.FindChild("noncostum_slot").gameObject.SetActive(false);
            if (i >= costimeList.Count)
            {
                slotTf.FindChild("noncostum_slot").gameObject.SetActive(true);
                continue;
            }
            slotTf.FindChild("costume").gameObject.SetActive(true);

            NetData._CostumeData costumeData = costimeList[i];

            //아이템리스트에서 현재의 조각아이템을 찾아서 갯수를 가져온다 - 자주쓸거같으면 _Inventory안에 만들기
            Item.CostumeInfo tempCos = _LowDataMgr.instance.GetLowDataCostumeInfo(costumeData._costmeDataIndex);
            int shardCount           = UserInfo.GetItemCountForItemId(tempCos.ShardIdx, (byte)eItemType.USE);

            slotTf.name = string.Format("{0}", costumeData._costmeDataIndex);
            UILabel  nameAndStack = slotTf.FindChild("costume/name_and_stack_d1").GetComponent <UILabel>();
            UILabel  ability      = slotTf.FindChild("costume/ability_d1").GetComponent <UILabel>();
            UILabel  info         = slotTf.FindChild("costume/info_d1").GetComponent <UILabel>();
            UISprite icon         = slotTf.FindChild("costume/icon").GetComponent <UISprite>();
            UISprite bg           = slotTf.FindChild("costume/bg").GetComponent <UISprite>();
            NetData.ItemAbilityData abilityData = costumeData.AbilityData;

            nameAndStack.text = string.Format("{0} ({1}/{2})", costumeData.GetLocName(), shardCount, costumeData._needShard);

            float calculatedAbilityValue = _LowDataMgr.instance.GetCostumeAbilityValue(costumeData._Grade, costumeData._MinorGrade, abilityData.Value);
            ability.text = string.Format("{0} {1}", UIMgr.instance.GetAbilityLocName(abilityData.Ability)                   //이름
                                         , UIMgr.instance.GetAbilityStrValue(abilityData.Ability, calculatedAbilityValue)); //지금 능력치

            info.text       = costumeData.GetDescription();
            icon.spriteName = costumeData.GetIconName();

            UIButton       uiBtnGet   = slotTf.FindChild("costume/BtnGet").GetComponent <UIButton>();
            UIEventTrigger uiTriMount = slotTf.FindChild("costume/BtnMount").GetComponent <UIEventTrigger>();
            GameObject     mountEff   = slotTf.FindChild("costume/mount_effect").gameObject;
            GameObject     mountCover = slotTf.FindChild("costume/cover").gameObject;
            bool           isGetBtn   = false;
            mountEff.SetActive(costumeData._isEquip);
            mountCover.SetActive(costumeData._isEquip);
            ///보유중
            if (costumeData._isOwn)
            {
                string text = null;
                if (costumeData._isEquip)
                {
                    text          = _LowDataMgr.instance.GetStringCommon(37);
                    bg.spriteName = "Bod_List04";
                }
                else
                {
                    text          = _LowDataMgr.instance.GetStringCommon(38);
                    bg.spriteName = "Bod_List05";

                    if (i != 0)
                    {
                        Destroy(uiTriMount.gameObject.GetComponent <TutorialSupport>());
                    }
                }

                EventDelegate.Set(uiTriMount.onClick, delegate()
                {
                    if (costumeData._isEquip && (IsPreViewCostume))
                    {
                        OnClickPreView(costumeData);
                    }
                    else
                    {
                        OnClickMountCostume(costumeData);
                    }
                });

                uiTriMount.transform.GetComponent <UILabel>().text = text;
            }
            else//획득하지 못한 아이템
            {
                uiTriMount.transform.GetComponent <UILabel>().text = _LowDataMgr.instance.GetStringCommon(38);

                if (costumeData._needShard <= shardCount)//획득 가능.
                {
                    uiBtnGet.collider.enabled = true;
                    slotTf.FindChild("costume/BtnGet/label_d2").GetComponent <UILabel>().color = Color.white;
                    EventDelegate.Set(uiBtnGet.onClick, delegate() { OnClickGetCostume(costumeData._costmeDataIndex); }); //, slotTf
                }
                else//불가능
                {
                    uiBtnGet.collider.enabled = false;
                    slotTf.FindChild("costume/BtnGet/label_d2").GetComponent <UILabel>().color = Color.gray;
                }

                EventDelegate.Set(uiTriMount.onClick, delegate() { OnClickPreView(costumeData); });

                isGetBtn = true;
            }

            uiBtnGet.gameObject.SetActive(isGetBtn);
        }

        gridTf.GetComponent <UIGrid>().Reposition();

        ListScrollView.enabled = true;
        ListScrollView.transform.SetLocalY(0);
        ListScrollView.transform.GetComponent <UIPanel>().clipOffset = Vector3.zero;
        // ListScrollView.ResetPosition();

        if (costimeList.Count < 4)
        {
            ListScrollView.enabled = false;
        }
    }
    /// <summary> 아이템의 옵션정보 표기 </summary>
    Vector3 SetAbility(NetData._ItemData itemData, ref byte optionCount)
    {
        for (int i = 0; i < Abilitys.Length; i++)
        {
            Abilitys[i].gameObject.SetActive(false);
        }

        int        abilityCount = 0;
        GameObject line         = AbilityTf.FindChild("line_d0").gameObject;

        if (itemData.IsEquipItem())//장비 아이템
        {
            NetData._ItemData mountItemData = NetData.instance.GetUserInfo().GetEquipParts(itemData.EquipPartType);
            bool isCompare = false;
            if (mountItemData != null)                                                         //같은 파츠이면서 착용한 아이템과 다르다면 비교한다.
            {
                if (mountItemData.GetEquipLowData().Class == itemData.GetEquipLowData().Class) //같은 직업군인지
                {
                    isCompare = mountItemData._itemIndex != itemData._itemIndex;
                }
            }

            List <NetData.ItemAbilityData> statList = itemData.StatList;
            abilityCount = statList.Count;
            for (int i = 0; i < abilityCount; i++)
            {
                //float value = (statList[i].Value * 0.1f) + (itemData._enchant + ((itemData._Grade * 10) + itemData._MinorGrade));
                int value = _LowDataMgr.instance.GetItemAbilityValueToInt(statList[i].Value, itemData._enchant);
                Abilitys[i].text = string.Format("{0} {1}", uiMgr.GetAbilityLocName(statList[i].Ability), value);
                Abilitys[i].gameObject.SetActive(true);
            }
        }
        else//사용 아이템
        {
            abilityCount = itemData.StatList.Count;
            for (int i = 0; i < abilityCount; i++)
            {
                NetData.ItemAbilityData data = itemData.StatList[i];
                Abilitys[i].text = string.Format("{0} {1}", uiMgr.GetAbilityLocName(data.Ability)
                                                 , uiMgr.GetAbilityStrValue(data.Ability, data.Value * 0.1f));
                Abilitys[i].gameObject.SetActive(true);
            }
        }

        if (abilityCount == 0)//Option이 없다. 꺼놓고 자신의 좌표를 준다.
        {
            AbilityTf.gameObject.SetActive(false);
            return(AbilityTf.localPosition);
        }

        ++optionCount;
        ++abilityCount;

        AbilityTf.gameObject.SetActive(true);

        ///Line 그리기
        Transform lineTf  = AbilityTf.FindChild("line_d0");
        Vector3   linePos = lineTf.localPosition;

        linePos.y            = -(abilityCount * 27);
        lineTf.localPosition = linePos;

        ///다음에 올 객체에 관한 포지션 값
        Vector3 pos = AbilityTf.localPosition;

        pos.y += (linePos.y - 27);
        return(pos);
    }