CharacterRender.cs 11 KB

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