using Cysharp.Threading.Tasks; using LitJson; using System.Collections; using System.Collections.Generic; using System.Linq; using UnityEditor; using UnityEngine; public class CharacterRender : MonoBehaviour { public GameObject gameObject; /// 左眼 public Material eyes001; /// 右眼 public Material eyes002; public Material[] faceMaterial; public SkinnedMeshRenderer faceSkinnedMeshRenderer; public string[] m_bsNameAll; public Dictionary dressRenders = new Dictionary(); private List shoesShow; private void Awake() { eyes001 = transform.Find("eyes001").GetComponent().material; eyes002 = transform.Find("eyes002").GetComponent().material; faceMaterial = transform.Find("body").GetComponent().materials; faceSkinnedMeshRenderer = transform.Find("body").GetComponent(); shoesShow = JsonMapper.ToObject>(Resources.Load("ShoesShow").text); m_bsNameAll = new string[faceSkinnedMeshRenderer.sharedMesh.blendShapeCount]; for (int j = 0; j < faceSkinnedMeshRenderer.sharedMesh.blendShapeCount; j++) { m_bsNameAll[j] = faceSkinnedMeshRenderer.sharedMesh.GetBlendShapeName(j); } } /// /// 加载骨骼 /// /// /// private async void LoadBones(GameObject obj) { obj.transform.SetParent(faceSkinnedMeshRenderer.transform.parent); Transform[] trans = obj.GetComponentsInChildren(); Transform[] transList = gameObject.transform.GetComponentsInChildren(); for (int i = 0; i < trans.Length; i++) { List bones = new List(); var skmr = trans[i].GetComponent(); if (skmr != null) { List names = trans[i].GetComponent().bones; for (int j = 0; j < names.Count; j++) { for (int k = 0; k < transList.Length; k++) { if (names[j] == transList[k].name) { bones.Add(transList[k]); //Debug.Log(names[j]); } if (skmr.rootBone == null && trans[i].GetComponent().rootBones == transList[k].name) { skmr.rootBone = transList[k]; } } } skmr.bones = bones.ToArray(); } } await UniTask.DelayFrame(1); } public async UniTask SetPlayerCloth( Good config) { Debug.Log(config.id); List crDis = new List(); string[] numbersArray = config.mutex.Split(','); int[] mutex = numbersArray.Select(int.Parse).ToArray(); foreach (var item in dressRenders) { if (mutex.Contains(item.Value.good.id / 10000)) { crDis.Add(item.Value.good.id.ToString()); } } for (int i = 0; i < crDis.Count; i++) { dressRenders[crDis[i]].Dispose(); dressRenders.Remove(crDis[i]); } var cdr = gameObject.AddComponent(); GameObject obj = await CharacterManager.Inst.CreatNewDress(config, cdr); dressRenders.Add(config.id.ToString(), cdr); obj.SetActive(true); LoadBones(obj); bool isShowFoot = true; foreach (var item in dressRenders) { int type = item.Value.good.id / 10000; if (type == 17) { isShowFoot = false; } if(type == 12) { for (int i = 0;i < shoesShow.Count;i++) { if(item.Value.good.id== shoesShow[i]) { isShowFoot = false; } } } } if (isShowFoot) { faceMaterial[6] = faceMaterial[5]; transform.Find("body").GetComponent().materials = faceMaterial; } else { var mat = await YooAssetManager.Instance.LoadAsset("Body_T"); faceMaterial[6] = mat; transform.Find("body").GetComponent().materials = faceMaterial; } bool isShowPaints = true; foreach (var item in dressRenders) { int type = item.Value.good.id / 10000; if (type == 17) { isShowPaints = false; } if (type == 11) { for (int i = 0; i < shoesShow.Count; i++) { if (item.Value.good.id == shoesShow[i]) { isShowPaints = false; } } } } if (isShowPaints) { faceMaterial[4] = faceMaterial[5]; transform.Find("body").GetComponent().materials = faceMaterial; } else { var mat = await YooAssetManager.Instance.LoadAsset("Body_T"); faceMaterial[4] = mat; transform.Find("body").GetComponent().materials = faceMaterial; } //if (CharacterManager.Inst.selfRender == self) //{ // //UI // var renderer = self.gameObject.GetComponentsInChildren(); // foreach (var item in renderer) // { // item.renderingLayerMask = 1 << 1; // item.gameObject.layer = 10; // } //} //else //{ // //场景里的 // var renderer = self.gameObject.GetComponentsInChildren(); // foreach (var item in renderer) // { // item.renderingLayerMask = 1 << 0; // item.gameObject.layer = 0; // } //} } public async UniTask SetPlayerBlendShape(Good config) { List crDis = new List(); string[] numbersArray = config.mutex.Split(','); int[] mutex = numbersArray.Select(int.Parse).ToArray(); foreach (var item in dressRenders) { if (mutex.Contains(item.Value.good.id / 10000)) { crDis.Add(item.Value.good.id.ToString()); } } for (int i = 0; i < crDis.Count; i++) { dressRenders[crDis[i]].Dispose(); dressRenders.Remove(crDis[i]); } int type = config.id / 10000; var cdr = gameObject.AddComponent(); cdr.good = config; cdr.gameObject = config.assetsName; if (dressRenders.ContainsKey(config.id.ToString())) { dressRenders[config.id.ToString()] = cdr; } else { dressRenders.Add(config.id.ToString(), cdr); } await UniTask.DelayFrame(1); //设置blendshape Dictionary param = LitJson.JsonMapper.ToObject>(config.assetsName); foreach (var item in param) { for (int i = 0; i < m_bsNameAll.Length; i++) { if (m_bsNameAll[i].Contains(item.Key)) { faceSkinnedMeshRenderer.SetBlendShapeWeight(i, item.Value * 100); } } } } public async UniTask SetTextrue(Good config) { List crDis = new List(); string[] numbersArray = config.mutex.Split(','); int[] mutex = numbersArray.Select(int.Parse).ToArray(); foreach (var item in dressRenders) { if (mutex.Contains(item.Value.good.id / 10000)) { crDis.Add(item.Value.good.id.ToString()); } } for (int i = 0; i < crDis.Count; i++) { dressRenders[crDis[i]].Dispose(); dressRenders.Remove(crDis[i]); } int type = config.id / 10000; var cdr = gameObject.AddComponent(); var obj = await CharacterManager.Inst.CreatNewDress(config, cdr); if (dressRenders.ContainsKey(config.id.ToString())) { dressRenders[config.id.ToString()] = cdr; } else { dressRenders.Add(config.id.ToString(), cdr); } await UniTask.DelayFrame(1); if (type == 1)//皮肤 { for (int i = 0;i < faceMaterial.Length;i++) { faceMaterial[i].SetTexture("_Skin", obj); } } if (type == 4)//眉毛 { //faceMaterial.SetTexture("_EyesBrow", obj); for (int i = 0; i < faceMaterial.Length; i++) { faceMaterial[i].SetTexture("_EyesBrow", obj); } } if (type == 9)//面颊/胡子 { //faceMaterial.SetTexture("_Beard", obj); for (int i = 0; i < faceMaterial.Length; i++) { faceMaterial[i].SetTexture("_Beard", obj); } } if (type == 15)//纹身 { //faceMaterial.SetTexture("_Tattoo", obj); for (int i = 0; i < faceMaterial.Length; i++) { faceMaterial[i].SetTexture("_Tattoo", obj); } } } public async UniTask SetEyeTextrue(Good config) { List crDis = new List(); string[] numbersArray = config.mutex.Split(','); int[] mutex = numbersArray.Select(int.Parse).ToArray(); foreach (var item in dressRenders) { if (mutex.Contains(item.Value.good.id / 10000)) { crDis.Add(item.Value.good.id.ToString()); } } for (int i = 0; i < crDis.Count; i++) { dressRenders[crDis[i]].Dispose(); dressRenders.Remove(crDis[i]); } int type = config.id / 10000; var cdr = gameObject.AddComponent(); var objL = await CharacterManager.Inst.CreatNewDress(config, cdr, "L"); var objR = await CharacterManager.Inst.CreatNewDress(config, cdr, "R"); if (dressRenders.ContainsKey(config.id.ToString())) { dressRenders[config.id.ToString()] = cdr; } else { dressRenders.Add(config.id.ToString(), cdr); } await UniTask.DelayFrame(1); eyes001.SetTexture("_BaseMap", objL); eyes002.SetTexture("_BaseMap", objR); } public void DestoryEquip() { foreach (var item in dressRenders) { item.Value.Dispose(); } dressRenders.Clear(); } public void UnLoadEquip( Good config) { string dressRender = ""; foreach (var item in dressRenders) { if (item.Value.good.id == config.id) { dressRender = item.Key; } } if (!string.IsNullOrEmpty(dressRender)) { dressRenders[dressRender].Dispose(); dressRenders.Remove(dressRender); } } }