CharacterRender.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344
  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. for (int i = 0; i < shoesShow.Count; i++)
  130. {
  131. if (item.Value.good.id == shoesShow[i])
  132. {
  133. isShowPaints = false;
  134. }
  135. }
  136. }
  137. if (type == 11)
  138. {
  139. for (int i = 0; i < shoesShow.Count; i++)
  140. {
  141. if (item.Value.good.id == shoesShow[i])
  142. {
  143. isShowPaints = false;
  144. }
  145. }
  146. }
  147. }
  148. if (isShowPaints)
  149. {
  150. faceMaterial[4] = faceMaterial[5];
  151. transform.Find("body").GetComponent<Renderer>().materials = faceMaterial;
  152. }
  153. else
  154. {
  155. var mat = await YooAssetManager.Instance.LoadAsset<Material>("Body_T");
  156. faceMaterial[4] = mat;
  157. transform.Find("body").GetComponent<Renderer>().materials = faceMaterial;
  158. }
  159. //if (CharacterManager.Inst.selfRender == self)
  160. //{
  161. // //UI
  162. // var renderer = self.gameObject.GetComponentsInChildren<Renderer>();
  163. // foreach (var item in renderer)
  164. // {
  165. // item.renderingLayerMask = 1 << 1;
  166. // item.gameObject.layer = 10;
  167. // }
  168. //}
  169. //else
  170. //{
  171. // //场景里的
  172. // var renderer = self.gameObject.GetComponentsInChildren<Renderer>();
  173. // foreach (var item in renderer)
  174. // {
  175. // item.renderingLayerMask = 1 << 0;
  176. // item.gameObject.layer = 0;
  177. // }
  178. //}
  179. }
  180. public async UniTask SetPlayerBlendShape(Good config)
  181. {
  182. List<string> crDis = new List<string>();
  183. string[] numbersArray = config.mutex.Split(',');
  184. int[] mutex = numbersArray.Select(int.Parse).ToArray();
  185. foreach (var item in dressRenders)
  186. {
  187. if (mutex.Contains(item.Value.good.id / 10000))
  188. {
  189. crDis.Add(item.Value.good.id.ToString());
  190. }
  191. }
  192. for (int i = 0; i < crDis.Count; i++)
  193. {
  194. dressRenders[crDis[i]].Dispose();
  195. dressRenders.Remove(crDis[i]);
  196. }
  197. int type = config.id / 10000;
  198. var cdr = gameObject.AddComponent<CharacterDressRender>();
  199. cdr.good = config;
  200. cdr.gameObject = config.assetsName;
  201. if (dressRenders.ContainsKey(config.id.ToString()))
  202. {
  203. dressRenders[config.id.ToString()] = cdr;
  204. }
  205. else
  206. {
  207. dressRenders.Add(config.id.ToString(), cdr);
  208. }
  209. await UniTask.DelayFrame(1);
  210. //设置blendshape
  211. Dictionary<string, int> param = LitJson.JsonMapper.ToObject<Dictionary<string, int>>(config.assetsName);
  212. foreach (var item in param)
  213. {
  214. for (int i = 0; i < m_bsNameAll.Length; i++)
  215. {
  216. if (m_bsNameAll[i].Contains(item.Key))
  217. {
  218. faceSkinnedMeshRenderer.SetBlendShapeWeight(i, item.Value * 100);
  219. }
  220. }
  221. }
  222. }
  223. public async UniTask SetTextrue(Good config)
  224. {
  225. List<string> crDis = new List<string>();
  226. string[] numbersArray = config.mutex.Split(',');
  227. int[] mutex = numbersArray.Select(int.Parse).ToArray();
  228. foreach (var item in dressRenders)
  229. {
  230. if (mutex.Contains(item.Value.good.id / 10000))
  231. {
  232. crDis.Add(item.Value.good.id.ToString());
  233. }
  234. }
  235. for (int i = 0; i < crDis.Count; i++)
  236. {
  237. dressRenders[crDis[i]].Dispose();
  238. dressRenders.Remove(crDis[i]);
  239. }
  240. int type = config.id / 10000;
  241. var cdr = gameObject.AddComponent<CharacterDressRender>();
  242. var obj = await CharacterManager.Inst.CreatNewDress<Texture>(config, cdr);
  243. if (dressRenders.ContainsKey(config.id.ToString()))
  244. {
  245. dressRenders[config.id.ToString()] = cdr;
  246. }
  247. else
  248. {
  249. dressRenders.Add(config.id.ToString(), cdr);
  250. }
  251. await UniTask.DelayFrame(1);
  252. if (type == 1)//皮肤
  253. {
  254. for (int i = 0;i < faceMaterial.Length;i++) { faceMaterial[i].SetTexture("_Skin", obj); }
  255. }
  256. if (type == 4)//眉毛
  257. {
  258. //faceMaterial.SetTexture("_EyesBrow", obj);
  259. for (int i = 0; i < faceMaterial.Length; i++) { faceMaterial[i].SetTexture("_EyesBrow", obj); }
  260. }
  261. if (type == 9)//面颊/胡子
  262. {
  263. //faceMaterial.SetTexture("_Beard", obj);
  264. for (int i = 0; i < faceMaterial.Length; i++) { faceMaterial[i].SetTexture("_Beard", obj); }
  265. }
  266. if (type == 15)//纹身
  267. {
  268. //faceMaterial.SetTexture("_Tattoo", obj);
  269. for (int i = 0; i < faceMaterial.Length; i++) { faceMaterial[i].SetTexture("_Tattoo", obj); }
  270. }
  271. }
  272. public async UniTask SetEyeTextrue(Good config)
  273. {
  274. List<string> crDis = new List<string>();
  275. string[] numbersArray = config.mutex.Split(',');
  276. int[] mutex = numbersArray.Select(int.Parse).ToArray();
  277. foreach (var item in dressRenders)
  278. {
  279. if (mutex.Contains(item.Value.good.id / 10000))
  280. {
  281. crDis.Add(item.Value.good.id.ToString());
  282. }
  283. }
  284. for (int i = 0; i < crDis.Count; i++)
  285. {
  286. dressRenders[crDis[i]].Dispose();
  287. dressRenders.Remove(crDis[i]);
  288. }
  289. int type = config.id / 10000;
  290. var cdr = gameObject.AddComponent<CharacterDressRender>();
  291. var objL = await CharacterManager.Inst.CreatNewDress<Texture>(config, cdr, "L");
  292. var objR = await CharacterManager.Inst.CreatNewDress<Texture>(config, cdr, "R");
  293. if (dressRenders.ContainsKey(config.id.ToString()))
  294. {
  295. dressRenders[config.id.ToString()] = cdr;
  296. }
  297. else
  298. {
  299. dressRenders.Add(config.id.ToString(), cdr);
  300. }
  301. await UniTask.DelayFrame(1);
  302. eyes001.SetTexture("_BaseMap", objL);
  303. eyes002.SetTexture("_BaseMap", objR);
  304. }
  305. public void DestoryEquip()
  306. {
  307. foreach (var item in dressRenders)
  308. {
  309. item.Value.Dispose();
  310. }
  311. dressRenders.Clear();
  312. }
  313. public void UnLoadEquip( Good config)
  314. {
  315. string dressRender = "";
  316. foreach (var item in dressRenders)
  317. {
  318. if (item.Value.good.id == config.id)
  319. {
  320. dressRender = item.Key;
  321. }
  322. }
  323. if (!string.IsNullOrEmpty(dressRender))
  324. {
  325. dressRenders[dressRender].Dispose();
  326. dressRenders.Remove(dressRender);
  327. }
  328. }
  329. }