CharacterRender.cs 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361
  1. using Cysharp.Threading.Tasks;
  2. using LitJson;
  3. using System.Collections;
  4. using System.Collections.Generic;
  5. using System.Linq;
  6. using System.Threading.Tasks;
  7. using UnityEditor;
  8. using UnityEngine;
  9. public class CharacterRender : MonoBehaviour
  10. {
  11. public GameObject gameObject;
  12. /// <summary>左眼</summary>
  13. public Material eyes001;
  14. /// <summary>右眼</summary>
  15. public Material eyes002;
  16. public Material[] faceMaterial;
  17. public SkinnedMeshRenderer faceSkinnedMeshRenderer;
  18. public string[] m_bsNameAll;
  19. public Dictionary<string, CharacterDressRender> dressRenders = new Dictionary<string, CharacterDressRender>();
  20. private List<int> shoesShow;
  21. private GameObject defaultTop;
  22. private GameObject defaultBottom;
  23. private void Awake()
  24. {
  25. eyes001 = transform.Find("eyes001").GetComponent<Renderer>().material;
  26. eyes002 = transform.Find("eyes002").GetComponent<Renderer>().material;
  27. faceMaterial = transform.Find("body").GetComponent<Renderer>().materials;
  28. faceSkinnedMeshRenderer = transform.Find("body").GetComponent<SkinnedMeshRenderer>();
  29. shoesShow = JsonMapper.ToObject<List<int>>(Resources.Load<TextAsset>("ShoesShow").text);
  30. m_bsNameAll = new string[faceSkinnedMeshRenderer.sharedMesh.blendShapeCount];
  31. for (int j = 0; j < faceSkinnedMeshRenderer.sharedMesh.blendShapeCount; j++)
  32. {
  33. m_bsNameAll[j] = faceSkinnedMeshRenderer.sharedMesh.GetBlendShapeName(j);
  34. }
  35. defaultTop = transform.Find("default_Top").gameObject;
  36. defaultBottom = transform.Find("default_Bottom").gameObject;
  37. }
  38. /// <summary>
  39. /// 加载骨骼
  40. /// </summary>
  41. /// <param name="go"></param>
  42. /// <param name="type"></param>
  43. private async void LoadBones(GameObject obj)
  44. {
  45. obj.transform.SetParent(faceSkinnedMeshRenderer.transform.parent);
  46. Transform[] trans = obj.GetComponentsInChildren<Transform>();
  47. Transform[] transList = gameObject.transform.GetComponentsInChildren<Transform>();
  48. for (int i = 0; i < trans.Length; i++)
  49. {
  50. List<Transform> bones = new List<Transform>();
  51. var skmr = trans[i].GetComponent<SkinnedMeshRenderer>();
  52. if (skmr != null)
  53. {
  54. List<string> names = trans[i].GetComponent<BonesName>().bones;
  55. for (int j = 0; j < names.Count; j++)
  56. {
  57. for (int k = 0; k < transList.Length; k++)
  58. {
  59. if (names[j] == transList[k].name)
  60. {
  61. bones.Add(transList[k]);
  62. //Debug.Log(names[j]);
  63. }
  64. if (skmr.rootBone == null && trans[i].GetComponent<BonesName>().rootBones == transList[k].name)
  65. {
  66. skmr.rootBone = transList[k];
  67. }
  68. }
  69. }
  70. skmr.bones = bones.ToArray();
  71. }
  72. }
  73. await UniTask.DelayFrame(1);
  74. }
  75. public async UniTask SetPlayerCloth( Good config)
  76. {
  77. //Debug.Log(config.id);
  78. List<string> crDis = new List<string>();
  79. string[] numbersArray = config.mutex.Split(',');
  80. int[] mutex = numbersArray.Select(int.Parse).ToArray();
  81. foreach (var item in dressRenders)
  82. {
  83. if (mutex.Contains(item.Value.good.id / 10000))
  84. {
  85. crDis.Add(item.Value.good.id.ToString());
  86. }
  87. }
  88. for (int i = 0; i < crDis.Count; i++)
  89. {
  90. dressRenders[crDis[i]].Dispose();
  91. dressRenders.Remove(crDis[i]);
  92. }
  93. var cdr = gameObject.AddComponent<CharacterDressRender>();
  94. GameObject obj = await CharacterManager.Inst.CreatNewDress<GameObject>(config, cdr);
  95. dressRenders.Add(config.id.ToString(), cdr);
  96. obj.SetActive(true);
  97. LoadBones(obj);
  98. bool isShowFoot = true;
  99. foreach (var item in dressRenders)
  100. {
  101. int type = item.Value.good.id / 10000;
  102. if (type == 17)
  103. {
  104. isShowFoot = false;
  105. defaultTop.SetActive(false);
  106. defaultBottom.SetActive(false);
  107. }
  108. if(type == 12)
  109. {
  110. for (int i = 0;i < shoesShow.Count;i++)
  111. {
  112. if(item.Value.good.id== shoesShow[i])
  113. {
  114. isShowFoot = false;
  115. }
  116. }
  117. }
  118. if (type == 10)
  119. {
  120. defaultTop.SetActive(false);
  121. }
  122. if (type == 11)
  123. {
  124. defaultBottom.SetActive(false);
  125. }
  126. }
  127. if (isShowFoot)
  128. {
  129. faceMaterial[6] = faceMaterial[5];
  130. transform.Find("body").GetComponent<Renderer>().materials = faceMaterial;
  131. }
  132. else
  133. {
  134. var mat = await YooAssetManager.Instance.LoadAsset<Material>("Body_T");
  135. faceMaterial[6] = mat;
  136. transform.Find("body").GetComponent<Renderer>().materials = faceMaterial;
  137. }
  138. bool isShowPaints = true;
  139. foreach (var item in dressRenders)
  140. {
  141. int type = item.Value.good.id / 10000;
  142. if (type == 17)
  143. {
  144. for (int i = 0; i < shoesShow.Count; i++)
  145. {
  146. if (item.Value.good.id == shoesShow[i])
  147. {
  148. isShowPaints = false;
  149. }
  150. }
  151. }
  152. if (type == 11)
  153. {
  154. for (int i = 0; i < shoesShow.Count; i++)
  155. {
  156. if (item.Value.good.id == shoesShow[i])
  157. {
  158. isShowPaints = false;
  159. }
  160. }
  161. }
  162. }
  163. if (isShowPaints)
  164. {
  165. faceMaterial[4] = faceMaterial[5];
  166. transform.Find("body").GetComponent<Renderer>().materials = faceMaterial;
  167. }
  168. else
  169. {
  170. var mat = await YooAssetManager.Instance.LoadAsset<Material>("Body_T");
  171. faceMaterial[4] = mat;
  172. transform.Find("body").GetComponent<Renderer>().materials = faceMaterial;
  173. }
  174. //if (CharacterManager.Inst.selfRender == self)
  175. //{
  176. // //UI
  177. // var renderer = self.gameObject.GetComponentsInChildren<Renderer>();
  178. // foreach (var item in renderer)
  179. // {
  180. // item.renderingLayerMask = 1 << 1;
  181. // item.gameObject.layer = 10;
  182. // }
  183. //}
  184. //else
  185. //{
  186. // //场景里的
  187. // var renderer = self.gameObject.GetComponentsInChildren<Renderer>();
  188. // foreach (var item in renderer)
  189. // {
  190. // item.renderingLayerMask = 1 << 0;
  191. // item.gameObject.layer = 0;
  192. // }
  193. //}
  194. }
  195. public async UniTask SetPlayerBlendShape(Good config)
  196. {
  197. List<string> crDis = new List<string>();
  198. string[] numbersArray = config.mutex.Split(',');
  199. int[] mutex = numbersArray.Select(int.Parse).ToArray();
  200. foreach (var item in dressRenders)
  201. {
  202. if (mutex.Contains(item.Value.good.id / 10000))
  203. {
  204. crDis.Add(item.Value.good.id.ToString());
  205. }
  206. }
  207. for (int i = 0; i < crDis.Count; i++)
  208. {
  209. dressRenders[crDis[i]].Dispose();
  210. dressRenders.Remove(crDis[i]);
  211. }
  212. int type = config.id / 10000;
  213. var cdr = gameObject.AddComponent<CharacterDressRender>();
  214. cdr.good = config;
  215. cdr.gameObject = config.assetsName;
  216. if (dressRenders.ContainsKey(config.id.ToString()))
  217. {
  218. dressRenders[config.id.ToString()] = cdr;
  219. }
  220. else
  221. {
  222. dressRenders.Add(config.id.ToString(), cdr);
  223. }
  224. await UniTask.DelayFrame(1);
  225. //设置blendshape
  226. Dictionary<string, int> param = LitJson.JsonMapper.ToObject<Dictionary<string, int>>(config.assetsName);
  227. foreach (var item in param)
  228. {
  229. for (int i = 0; i < m_bsNameAll.Length; i++)
  230. {
  231. if (m_bsNameAll[i].Contains(item.Key))
  232. {
  233. faceSkinnedMeshRenderer.SetBlendShapeWeight(i, item.Value * 100);
  234. }
  235. }
  236. }
  237. }
  238. public async UniTask SetTextrue(Good config)
  239. {
  240. List<string> crDis = new List<string>();
  241. string[] numbersArray = config.mutex.Split(',');
  242. int[] mutex = numbersArray.Select(int.Parse).ToArray();
  243. foreach (var item in dressRenders)
  244. {
  245. if (mutex.Contains(item.Value.good.id / 10000))
  246. {
  247. crDis.Add(item.Value.good.id.ToString());
  248. }
  249. }
  250. for (int i = 0; i < crDis.Count; i++)
  251. {
  252. dressRenders[crDis[i]].Dispose();
  253. dressRenders.Remove(crDis[i]);
  254. }
  255. int type = config.id / 10000;
  256. var cdr = gameObject.AddComponent<CharacterDressRender>();
  257. var obj = await CharacterManager.Inst.CreatNewDress<Texture>(config, cdr);
  258. if (dressRenders.ContainsKey(config.id.ToString()))
  259. {
  260. dressRenders[config.id.ToString()] = cdr;
  261. }
  262. else
  263. {
  264. dressRenders.Add(config.id.ToString(), cdr);
  265. }
  266. await UniTask.DelayFrame(1);
  267. if (type == 1)//皮肤
  268. {
  269. for (int i = 0;i < faceMaterial.Length;i++) { faceMaterial[i].SetTexture("_Skin", obj); }
  270. }
  271. if (type == 4)//眉毛
  272. {
  273. //faceMaterial.SetTexture("_EyesBrow", obj);
  274. for (int i = 0; i < faceMaterial.Length; i++) { faceMaterial[i].SetTexture("_EyesBrow", obj); }
  275. }
  276. if (type == 9)//面颊/胡子
  277. {
  278. //faceMaterial.SetTexture("_Beard", obj);
  279. for (int i = 0; i < faceMaterial.Length; i++) { faceMaterial[i].SetTexture("_Beard", obj); }
  280. }
  281. if (type == 15)//纹身
  282. {
  283. //faceMaterial.SetTexture("_Tattoo", obj);
  284. for (int i = 0; i < faceMaterial.Length; i++) { faceMaterial[i].SetTexture("_Tattoo", obj); }
  285. }
  286. }
  287. public async UniTask SetEyeTextrue(Good config)
  288. {
  289. List<string> crDis = new List<string>();
  290. string[] numbersArray = config.mutex.Split(',');
  291. int[] mutex = numbersArray.Select(int.Parse).ToArray();
  292. foreach (var item in dressRenders)
  293. {
  294. if (mutex.Contains(item.Value.good.id / 10000))
  295. {
  296. crDis.Add(item.Value.good.id.ToString());
  297. }
  298. }
  299. for (int i = 0; i < crDis.Count; i++)
  300. {
  301. dressRenders[crDis[i]].Dispose();
  302. dressRenders.Remove(crDis[i]);
  303. }
  304. int type = config.id / 10000;
  305. var cdr = gameObject.AddComponent<CharacterDressRender>();
  306. var objL = await CharacterManager.Inst.CreatNewDress<Texture>(config, cdr, "L");
  307. var objR = await CharacterManager.Inst.CreatNewDress<Texture>(config, cdr, "R");
  308. if (dressRenders.ContainsKey(config.id.ToString()))
  309. {
  310. dressRenders[config.id.ToString()] = cdr;
  311. }
  312. else
  313. {
  314. dressRenders.Add(config.id.ToString(), cdr);
  315. }
  316. await UniTask.DelayFrame(1);
  317. eyes001.SetTexture("_BaseMap", objL);
  318. eyes002.SetTexture("_BaseMap", objR);
  319. }
  320. public void DestoryEquip()
  321. {
  322. foreach (var item in dressRenders)
  323. {
  324. item.Value.Dispose();
  325. }
  326. dressRenders.Clear();
  327. }
  328. public void UnLoadEquip( Good config)
  329. {
  330. string dressRender = "";
  331. foreach (var item in dressRenders)
  332. {
  333. if (item.Value.good.id == config.id)
  334. {
  335. dressRender = item.Key;
  336. }
  337. }
  338. if (!string.IsNullOrEmpty(dressRender))
  339. {
  340. dressRenders[dressRender].Dispose();
  341. dressRenders.Remove(dressRender);
  342. }
  343. }
  344. }