/// <summary> /// 脱下时装 /// </summary> private void TakeOffTheFashion(CostumeDefine fashionInfo) { // if (_curUsedFashions.Contains(fashionInfo.CostumeId)) { //换装 HallRoleManager.Instance.CurRole.NotifyDressUp(fashionInfo, true); // _curUsedFashions.Remove(fashionInfo.CostumeId); //更新冲突类型 UpdateConflictTypes(); } }
//Live2D换装思路 //将live2D模型固定一套基础样式(默认裸妆/只你内衣)然后按照部位划分 每个部位单独对应一张贴图 客户端更换贴图实现换装 //需求 //1.live2D模型给到时所有的部位都要显示出来 //2.部位 对应 id/名称 //处理 //1.部位的显示 控制方式2种 都需要在 LateUpdate() 中进行更新 //(1).控制 CubismModel->Parameters 需要客户端测试参数对应位置 //(2).控制 CubismModel->Parts->Id 与live2D模型给到的部位id一致 (当前选用的方式) //2.通过CubismRenderController 获取所有的 CubismRenderer 然后对比 CubismRenderer->MainTexture.name //贴图名称 //3.对比贴图名称判断是否为需要更新的贴图 然后更换贴图 //完成换装 /// <summary> /// 通知换装 /// </summary> /// <param name="costume"></param> /// <param name="isTakeOff">是否为脱下时装</param> public async void NotifyDressUp(CostumeDefine costume, bool isTakeOff = false) { if (isTakeOff) { //await UniTask.WaitForEndOfFrame(); //更新换装部位 UpdateParts(costume.ShowParts, null); return; } //换装贴图 UpdateTexture(costume.UseTexture); await UniTask.WaitForEndOfFrame();//UniTask.Delay(200); //更新换装部位 UpdateParts(costume.HideParts, costume.ShowParts); }
/// <summary> /// 更新冲突类型 /// </summary> private void UpdateConflictTypes() { _curConflictTypes.Clear(); CostumeDefine costumeDefine = null; for (int i = 0; i < _curUsedFashions.Count; i++) { costumeDefine = StaticData.configExcel.GetCostumeByCostumeId(_curUsedFashions[i]); for (int j = 0; j < costumeDefine.ConflictTypes.Count; j++) { if (!_curConflictTypes.Contains(costumeDefine.ConflictTypes[j])) { _curConflictTypes.Add(costumeDefine.ConflictTypes[j]); } } } }
/// <summary> /// 获取使用的冲突的时装和同类型的时装 /// </summary> /// <param name="conflictType"></param> /// <returns></returns> private void GetUsedConflictFashion(CostumeType sameType, List <CostumeType> conflictTypes, ref List <int> conflictTypeIDs) { CostumeDefine costumeDefine = null; for (int i = 0; i < _curUsedFashions.Count; i++) { costumeDefine = StaticData.configExcel.GetCostumeByCostumeId(_curUsedFashions[i]); if (costumeDefine.Type == sameType) { conflictTypeIDs.Add(_curUsedFashions[i]); continue; } if (conflictTypes.Contains(costumeDefine.Type)) { conflictTypeIDs.Add(_curUsedFashions[i]); continue; } } }
/// <summary> /// 获取当前角色的全部时装 /// </summary> /// <param name="isActive"></param> public List <CostumeDefine> GetCurRoleAllFashions(int selectedRoleID = 0, List <int> roleFashionList = null) { List <CostumeDefine> costumes = new List <CostumeDefine>(); //获取玩家角色的数据 if (selectedRoleID == 0 && roleFashionList == null) { selectedRoleID = _curSelectedRoleID; for (int i = 0; i < StaticData.playerInfoData.userInfo.HallRoleInfo.Count; i++) { if (StaticData.playerInfoData.userInfo.HallRoleInfo[i].RoleId == selectedRoleID) { string choiceDesc = StaticData.playerInfoData.userInfo.HallRoleInfo[i].ChoiceList; var fashionList = choiceDesc.Split(','); roleFashionList = new List <int>(); for (int j = 0; j < fashionList.Length; j++) { roleFashionList.Add(Convert.ToInt32(fashionList[j])); } } } } // if (roleFashionList == null) { return(costumes); } CostumeDefine fashion = null; for (int i = 0; i < roleFashionList.Count; i++) { fashion = StaticData.configExcel.GetCostumeByCostumeId(roleFashionList[i]); if (fashion != null && fashion.RoleId == selectedRoleID) { costumes.Add(fashion); } } return(costumes); }
/// <summary> /// 穿戴时装 /// </summary> /// <param name="fashionInfo"></param> private void WearFashion(CostumeDefine fashionInfo) { // ClearFashionSelectedEffect?.Invoke(); ClearFashionConflictEffect?.Invoke(); //获取需要移除的时装 //冲突的时装id 和 相同类型的时装id List <int> conflictTypeIDs = new List <int>(); //1.获取冲突类型 获取冲突时装id GetUsedConflictFashion(fashionInfo.Type, fashionInfo.ConflictTypes, ref conflictTypeIDs); CostumeDefine costumeDefine = null; //2.移除冲突时装id 和 相同类型的时装id for (int i = 0; i < conflictTypeIDs.Count; i++) { if (_curUsedFashions.Contains(conflictTypeIDs[i])) { // costumeDefine = StaticData.configExcel.GetCostumeByCostumeId(conflictTypeIDs[i]); //脱下时装 TakeOffTheFashion(costumeDefine); } } //换装 HallRoleManager.Instance.CurRole.NotifyDressUp(fashionInfo); //更新当前角色使用时装数据 //添加新的时装id if (!_curUsedFashions.Contains(fashionInfo.CostumeId)) { _curUsedFashions.Add(fashionInfo.CostumeId); } //更新冲突类型 UpdateConflictTypes(); }
/// <summary> /// 初始化换装 /// </summary> public async void InitDressUp(List <int> costumeIDs) { Debug.Log("InitDressUp 初始化换装!"); _needHideParts.Clear(); _needShowParts.Clear(); List <string> hideParts = new List <string>(); List <string> showParts = new List <string>(); //影藏全部部位 需要后续添加 hideParts.Add("xiezi"); hideParts.Add("tfaqian"); hideParts.Add("tfaqianchang"); hideParts.Add("tfahou"); hideParts.Add("nabao"); hideParts.Add("nabao2"); hideParts.Add("bao2"); hideParts.Add("bao"); hideParts.Add("nabao3"); hideParts.Add("nabao4"); hideParts.Add("bao3"); hideParts.Add("bao4"); hideParts.Add("maozi"); hideParts.Add("toushi2"); hideParts.Add("weijin"); hideParts.Add("dayi"); hideParts.Add("erhuan"); hideParts.Add("xiangquan"); hideParts.Add("xianglian"); hideParts.Add("shoushi"); hideParts.Add("wazi"); hideParts.Add("kuzi"); hideParts.Add("lianyiqun"); hideParts.Add("lianyiqun2"); hideParts.Add("xiayi"); hideParts.Add("xiayi2"); hideParts.Add("xiajinshenqun"); hideParts.Add("xiajinshenqun2"); hideParts.Add("shangyi"); hideParts.Add("toushi1"); hideParts.Add("toushi"); hideParts.Add("tfagaomawei"); hideParts.Add("tfadimawei"); hideParts.Add("tfahoumawei"); //hideParts.Add("youshou"); //hideParts.Add("zuoshou"); List <CostumeTextureInfo> useTexture = new List <CostumeTextureInfo>(); CostumeDefine costume = null; for (int i = 0; i < costumeIDs.Count; i++) { costume = StaticData.configExcel.GetCostumeByCostumeId(costumeIDs[i]); useTexture.AddRange(costume.UseTexture); for (int j = 0; j < costume.HideParts.Count; j++) { if (!hideParts.Contains(costume.HideParts[j])) { hideParts.Add(costume.HideParts[j]); } } for (int j = 0; j < costume.ShowParts.Count; j++) { //将显示的从影藏中移除 if (hideParts.Contains(costume.ShowParts[j])) { hideParts.Remove(costume.ShowParts[j]); } if (!showParts.Contains(costume.ShowParts[j])) { showParts.Add(costume.ShowParts[j]); } } } //更新换装部位 UpdateParts(hideParts, showParts); await UniTask.WaitForEndOfFrame();//UniTask.Delay(300); //换装贴图 UpdateTexture(useTexture, true); }