123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344 |
- 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;
- /// <summary>左眼</summary>
- public Material eyes001;
- /// <summary>右眼</summary>
- public Material eyes002;
- public Material[] faceMaterial;
- public SkinnedMeshRenderer faceSkinnedMeshRenderer;
- public string[] m_bsNameAll;
- public Dictionary<string, CharacterDressRender> dressRenders = new Dictionary<string, CharacterDressRender>();
- private List<int> shoesShow;
- private void Awake()
- {
- eyes001 = transform.Find("eyes001").GetComponent<Renderer>().material;
- eyes002 = transform.Find("eyes002").GetComponent<Renderer>().material;
- faceMaterial = transform.Find("body").GetComponent<Renderer>().materials;
- faceSkinnedMeshRenderer = transform.Find("body").GetComponent<SkinnedMeshRenderer>();
- shoesShow = JsonMapper.ToObject<List<int>>(Resources.Load<TextAsset>("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);
- }
- }
- /// <summary>
- /// 加载骨骼
- /// </summary>
- /// <param name="go"></param>
- /// <param name="type"></param>
- private async void LoadBones(GameObject obj)
- {
- obj.transform.SetParent(faceSkinnedMeshRenderer.transform.parent);
- Transform[] trans = obj.GetComponentsInChildren<Transform>();
- Transform[] transList = gameObject.transform.GetComponentsInChildren<Transform>();
- for (int i = 0; i < trans.Length; i++)
- {
- List<Transform> bones = new List<Transform>();
- var skmr = trans[i].GetComponent<SkinnedMeshRenderer>();
- if (skmr != null)
- {
- List<string> names = trans[i].GetComponent<BonesName>().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<BonesName>().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<string> crDis = new List<string>();
- 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<CharacterDressRender>();
- GameObject obj = await CharacterManager.Inst.CreatNewDress<GameObject>(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<Renderer>().materials = faceMaterial;
- }
- else
- {
- var mat = await YooAssetManager.Instance.LoadAsset<Material>("Body_T");
- faceMaterial[6] = mat;
- transform.Find("body").GetComponent<Renderer>().materials = faceMaterial;
- }
- bool isShowPaints = true;
- foreach (var item in dressRenders)
- {
- int type = item.Value.good.id / 10000;
- if (type == 17)
- {
- for (int i = 0; i < shoesShow.Count; i++)
- {
- if (item.Value.good.id == shoesShow[i])
- {
- 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<Renderer>().materials = faceMaterial;
- }
- else
- {
- var mat = await YooAssetManager.Instance.LoadAsset<Material>("Body_T");
- faceMaterial[4] = mat;
- transform.Find("body").GetComponent<Renderer>().materials = faceMaterial;
- }
- //if (CharacterManager.Inst.selfRender == self)
- //{
- // //UI
- // var renderer = self.gameObject.GetComponentsInChildren<Renderer>();
- // foreach (var item in renderer)
- // {
- // item.renderingLayerMask = 1 << 1;
- // item.gameObject.layer = 10;
- // }
- //}
- //else
- //{
- // //场景里的
- // var renderer = self.gameObject.GetComponentsInChildren<Renderer>();
- // foreach (var item in renderer)
- // {
- // item.renderingLayerMask = 1 << 0;
- // item.gameObject.layer = 0;
- // }
- //}
- }
- public async UniTask SetPlayerBlendShape(Good config)
- {
- List<string> crDis = new List<string>();
- 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<CharacterDressRender>();
- 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<string, int> param = LitJson.JsonMapper.ToObject<Dictionary<string, int>>(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<string> crDis = new List<string>();
- 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<CharacterDressRender>();
- var obj = await CharacterManager.Inst.CreatNewDress<Texture>(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<string> crDis = new List<string>();
- 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<CharacterDressRender>();
- var objL = await CharacterManager.Inst.CreatNewDress<Texture>(config, cdr, "L");
- var objR = await CharacterManager.Inst.CreatNewDress<Texture>(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);
- }
- }
- }
|