CustomRoleController.cs 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using UnityEngine;
  5. using DG.Tweening;
  6. using MetaClient;
  7. public class CustomRoleController : MonoBehaviour
  8. {
  9. private Animator ani;
  10. private SkinnedMeshRenderer body;
  11. public MegaMorph morph;
  12. public Transform[] Chest;
  13. public Transform[] UpperArmUp;
  14. public Transform[] UpperArmDown;
  15. public Transform[] UpperLegUp;
  16. public Transform[] UpperLegDown;
  17. public Transform[] LowerLegUp;
  18. public Transform[] LowerLegDown;
  19. private void Start()
  20. {
  21. ani = GetComponent<Animator>();
  22. body = GetComponentInChildren<SkinnedMeshRenderer>();
  23. var t1 = ani.GetBoneTransform(HumanBodyBones.LeftHand);
  24. var t2 = ani.GetBoneTransform(HumanBodyBones.LeftFoot);
  25. morph = GetComponentInChildren<MegaMorph>();
  26. }
  27. private void Update()
  28. {
  29. UpdatePos();
  30. }
  31. private void UpdatePos()
  32. {
  33. var t = body.bounds.min;
  34. var offset = t.y - (-1.3f);
  35. var y = transform.position.y - offset;
  36. transform.SetPositionY(y * 0.2f + transform.position.y * 0.8f);
  37. }
  38. public void UpdateBoneScale(EditableBodyPart part,Vector3 scale,bool isKeep,float value)
  39. {
  40. CustomRoleUtility.UpdateBoneScale(ani, part,scale, isKeep, value);
  41. }
  42. public List<Transform> GetBonesTrans()
  43. {
  44. var bonesTrans = new List<Transform>();
  45. for (int i = 0; i < Enum.GetValues(typeof(HumanBodyBones)).Length - 1; i++)
  46. {
  47. var trans = ani.GetBoneTransform((HumanBodyBones)i);
  48. if (trans)
  49. {
  50. bonesTrans.Add(trans);
  51. }
  52. }
  53. return bonesTrans;
  54. }
  55. public void GetNormalAniBonesScale(ref Dictionary<string, Vector3> boneDic)
  56. {
  57. CustomRoleUtility.GetNormalAniBonesScale(ani,ref boneDic);
  58. }
  59. private Transform[] GetExtraAniBonesTrans(EditableBodyPart extraPart)
  60. {
  61. Transform[] targetTrans = null;
  62. switch (extraPart)
  63. {
  64. case EditableBodyPart.Chest:
  65. targetTrans = Chest;
  66. break;
  67. case EditableBodyPart.UpperArmUp:
  68. targetTrans = UpperArmUp;
  69. break;
  70. case EditableBodyPart.UpperArmDown:
  71. targetTrans = UpperArmDown;
  72. break;
  73. case EditableBodyPart.UpperLegUp:
  74. targetTrans = UpperLegUp;
  75. break;
  76. case EditableBodyPart.UpperLegDown:
  77. targetTrans = UpperLegDown;
  78. break;
  79. case EditableBodyPart.LowerLegUp:
  80. targetTrans = LowerLegUp;
  81. break;
  82. case EditableBodyPart.LowerLegDown:
  83. targetTrans = LowerLegDown;
  84. break;
  85. default:
  86. break;
  87. }
  88. return targetTrans;
  89. }
  90. public void GetExtraAniBonesScale(ref Dictionary<string, Vector3> boneDic,EditableBodyPart extraPart)
  91. {
  92. Transform[] targetTrans = GetExtraAniBonesTrans(extraPart);
  93. if(targetTrans != null)
  94. {
  95. for (int i = 0; i < targetTrans.Length; i++)
  96. {
  97. boneDic.Add(targetTrans[i].name, targetTrans[i].lossyScale);
  98. }
  99. }
  100. }
  101. public void GetExtraAniBonesRotate(ref Dictionary<string, Quaternion> boneDic, EditableBodyPart extraPart)
  102. {
  103. Transform[] targetTrans = GetExtraAniBonesTrans(extraPart);
  104. if (targetTrans != null)
  105. {
  106. for (int i = 0; i < targetTrans.Length; i++)
  107. {
  108. boneDic.Add(targetTrans[i].name, targetTrans[i].localRotation);
  109. }
  110. }
  111. }
  112. public void GetExtraAniBonesPosition(ref Dictionary<string, Vector3> boneDic, EditableBodyPart extraPart)
  113. {
  114. Transform[] targetTrans = GetExtraAniBonesTrans(extraPart);
  115. if (targetTrans != null)
  116. {
  117. for (int i = 0; i < targetTrans.Length; i++)
  118. {
  119. boneDic.Add(targetTrans[i].name, targetTrans[i].localPosition);
  120. }
  121. }
  122. }
  123. public void SetBonePos(string name,Vector3 value)
  124. {
  125. var bone = CustomRoleUtility.GetChild(transform,name);
  126. if(bone)
  127. {
  128. bone.transform.localPosition = value;
  129. }
  130. }
  131. public void SetBoneRot(string name, Vector3 value)
  132. {
  133. var bone = CustomRoleUtility.GetChild(transform, name);
  134. if (bone)
  135. {
  136. bone.localEulerAngles = value;
  137. }
  138. }
  139. public void SetBoneWorldScale(string name, Vector3 scale,Vector3 orginLocalScale,Vector3 orginWorldScale)
  140. {
  141. var bone = CustomRoleUtility.GetChild(transform, name);
  142. if (bone)
  143. {
  144. var value = scale.x;
  145. var trans = bone.transform;
  146. var beforeScale = trans.localScale;
  147. var world_l = orginWorldScale;
  148. trans.SetLocalScaleX(orginLocalScale.x * scale.x / world_l.x);
  149. trans.SetLocalScaleY(orginLocalScale.y * scale.y / world_l.y);
  150. trans.SetLocalScaleZ(orginLocalScale.z * scale.z / world_l.z);
  151. return;
  152. var lcount = trans.childCount;
  153. for (int j = 0; j < lcount; j++)
  154. {
  155. var childTrans = trans.GetChild(j);
  156. var oldScale = childTrans.localScale;
  157. childTrans.SetLocalScaleX(oldScale.x * beforeScale.x / scale.x);
  158. childTrans.SetLocalScaleY(oldScale.y * beforeScale.y / scale.y);
  159. childTrans.SetLocalScaleZ(oldScale.z * beforeScale.z / scale.z);
  160. }
  161. }
  162. }
  163. public void SetBoneScale(string name, Vector3 scale)
  164. {
  165. var bone = CustomRoleUtility.GetChild(transform, name);
  166. if (bone)
  167. {
  168. bone.transform.localScale = scale;
  169. }
  170. }
  171. public void SetBlendShape(string name,float value)
  172. {
  173. name = "123132";
  174. morph.SetPercent(0, value);
  175. return;
  176. if (!body)
  177. {
  178. Debug.LogError(name + "不存在 SkinnedMeshRenderer");
  179. return;
  180. }
  181. if(name == "no")
  182. {
  183. Debug.LogError("表里还没配,快去改表吧!");
  184. return;
  185. }
  186. var index = body.sharedMesh.GetBlendShapeIndex(name);
  187. if(index < 0)
  188. {
  189. Debug.LogError(name + "不存在名称为 " + name + "变形器");
  190. return;
  191. }
  192. SetBlendShape(index, value);
  193. }
  194. public void SetBlendShape(int index,float value)
  195. {
  196. if(!body)
  197. {
  198. Debug.LogError(name + "不存在 SkinnedMeshRenderer");
  199. return;
  200. }
  201. body.SetBlendShapeWeight(index, value);
  202. }
  203. /// <summary>
  204. /// 重置所有变形器
  205. /// </summary>
  206. public void ResetAllBlendShape()
  207. {
  208. if (!body)
  209. {
  210. Debug.LogError(name + "不存在 SkinnedMeshRenderer");
  211. return;
  212. }
  213. var count = body.sharedMesh.blendShapeCount;
  214. for (int i = 0; i < count; i++)
  215. {
  216. SetBlendShape(i, 0);
  217. }
  218. }
  219. public void RotateSelf(float offset)
  220. {
  221. transform.Rotate(0, -offset/10, 0);
  222. }
  223. /// <summary>
  224. /// 修改身体部位颜色
  225. /// </summary>
  226. public void ChangeColor(int id, Vector3 color)
  227. {
  228. var part = (ENieLianStyple)id;
  229. Material mat = null;
  230. switch (part)
  231. {
  232. case ENieLianStyple.None:
  233. break;
  234. case ENieLianStyple.faxing:
  235. break;
  236. case ENieLianStyple.lianxing:
  237. break;
  238. case ENieLianStyple.yankuang:
  239. mat = body.materials[5];
  240. break;
  241. case ENieLianStyple.tongkong:
  242. mat = body.materials[2];
  243. break;
  244. case ENieLianStyple.meimao:
  245. mat = body.materials[9];
  246. break;
  247. case ENieLianStyple.bizi:
  248. break;
  249. case ENieLianStyple.erduo:
  250. break;
  251. case ENieLianStyple.zuiba:
  252. break;
  253. case ENieLianStyple.fuse:
  254. break;
  255. default:
  256. break;
  257. }
  258. if(mat == null)
  259. {
  260. return;
  261. }
  262. mat.color = new Color(color.x, color.y, color.z);
  263. }
  264. }