CharacterRender.cs 8.9 KB

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