CustomManager.cs 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using GameFramework.Event;
  5. using UnityEngine;
  6. using GameFramework.DataTable;
  7. namespace MetaClient
  8. {
  9. public class CustomManager : MonoBehaviour
  10. {
  11. public static CustomManager Instance;
  12. public RoleCustomData bodyData;
  13. public const float valueFloating = 1f;
  14. public CustomRoleController testPlayer = null;
  15. public Dictionary<string, Transform> bones = new Dictionary<string, Transform>();
  16. private void Awake()
  17. {
  18. Instance = this;
  19. }
  20. public void Init()
  21. {
  22. GameEntry.Event.Subscribe(CustomRoleBodyEventArgs.EventId, UpdateBody);
  23. CreateCustomBodyData();
  24. }
  25. /// <summary>
  26. /// 生成玩家自定义数据信息
  27. /// </summary>
  28. public void CreateCustomBodyData()
  29. {
  30. testPlayer = GameObject.Find("10").GetComponent<CustomRoleController>();
  31. bodyData = new RoleCustomData();
  32. //初始化身体部分
  33. IDataTable<DRCustomBody> drCB = GameEntry.DataTable.GetDataTable<DRCustomBody>();
  34. DRCustomBody[] dtCB = drCB.GetAllDataRows();
  35. for (int i = 0; i < dtCB.Length; i++)
  36. {
  37. var partData = new PartData(
  38. dtCB[i].Id,
  39. dtCB[i].BoneName.Split(','),
  40. dtCB[i].ScaleRangeMin,
  41. dtCB[i].ScaleRangeMax,
  42. dtCB[i].ScaleChange,
  43. dtCB[i].PositionChange,
  44. dtCB[i].RotationChange,
  45. dtCB[i].IsBlend,
  46. dtCB[i].BiggerBlendName,
  47. dtCB[i].SmallerBlendName,
  48. dtCB[i].DefaultBlendValue
  49. );
  50. bodyData.bodyList.Add(dtCB[i].Id, partData);
  51. }
  52. //初始化脸部分
  53. IDataTable<DRCustomFace> drCF = GameEntry.DataTable.GetDataTable<DRCustomFace>();
  54. DRCustomFace[] dtCF = drCF.GetAllDataRows();
  55. for (int i = 0; i < dtCF.Length; i++)
  56. {
  57. var partData = new PartData(
  58. dtCF[i].Id,
  59. dtCF[i].BoneName==""?null:dtCF[i].BoneName.Split(','),
  60. dtCF[i].ScaleRangeMin,
  61. dtCF[i].ScaleRangeMax,
  62. dtCF[i].ScaleChange,
  63. dtCF[i].PositionChange,
  64. dtCF[i].RotationChange,
  65. dtCF[i].IsBlend,
  66. dtCF[i].BiggerBlendName,
  67. dtCF[i].SmallerBlendName,
  68. dtCF[i].DefaultBlendValue
  69. );
  70. bodyData.faceList.Add(dtCF[i].Id, partData);
  71. }
  72. bones.Clear();
  73. foreach (var item in bodyData.bodyList)
  74. {
  75. var key = item.Key;
  76. var value = item.Value;
  77. if(!value.useBlend)
  78. {
  79. for (int i = 0; i < value.bones.Length; i++)
  80. {
  81. var transform = CustomRoleUtility.GetChild(testPlayer.transform, value.bones[i]);
  82. if (!transform)
  83. {
  84. continue;
  85. }
  86. if (!bones.ContainsKey(value.bones[i]))
  87. {
  88. bones.Add(value.bones[i], transform);
  89. }
  90. }
  91. }
  92. }
  93. foreach (var item in bodyData.faceList)
  94. {
  95. var key = item.Key;
  96. var value = item.Value;
  97. if (!value.useBlend)
  98. {
  99. for (int i = 0; i < value.bones.Length; i++)
  100. {
  101. var transform = CustomRoleUtility.GetChild(testPlayer.transform, value.bones[i]);
  102. if (!transform)
  103. {
  104. continue;
  105. }
  106. if (!bones.ContainsKey(value.bones[i]))
  107. {
  108. bones.Add(value.bones[i], transform);
  109. }
  110. }
  111. }
  112. }
  113. Debug.Log( "一共有"+ bones.Count + "部位的骨骼自定义修改");
  114. //获取自定义骨骼的初始数据
  115. foreach (var item in bones)
  116. {
  117. var key = item.Key;
  118. var value = item.Value;
  119. bodyData.orginLocalScaleList.Add(key, value.localScale);
  120. bodyData.orginChangeScaleList.Add(key, new Vector3(1,1,1));
  121. bodyData.ChangedScaleParamsList.Add(key, new Vector3(1,1,1));
  122. bodyData.orginLocalPositionList.Add(key, value.localPosition);
  123. bodyData.orginLocalRotationList.Add(key, value.localEulerAngles);
  124. }
  125. }
  126. public void Clear()
  127. {
  128. GameEntry.Event.Unsubscribe(CustomRoleBodyEventArgs.EventId, UpdateBody);
  129. }
  130. private void UpdateBody(object sender, GameEventArgs e)
  131. {
  132. CustomRoleBodyEventArgs crf = (CustomRoleBodyEventArgs)e;
  133. if (crf != null)
  134. {
  135. PartData partData = null;
  136. switch (crf.Type)
  137. {
  138. case ECustomStyple.None:
  139. break;
  140. case ECustomStyple.NieLian:
  141. partData = bodyData.faceList[crf.Part];
  142. break;
  143. case ECustomStyple.Body:
  144. partData = bodyData.bodyList[crf.Part];
  145. break;
  146. case ECustomStyple.Cloth:
  147. break;
  148. case ECustomStyple.Ornament:
  149. break;
  150. default:
  151. break;
  152. }
  153. //更新数据
  154. if(partData == null)
  155. {
  156. Debug.LogError("ID :" + crf.Part + " 无数据");
  157. return;
  158. }
  159. if(partData.useBlend)
  160. {
  161. ChangeBlendShape(partData, crf.ChangeValue);
  162. }
  163. else
  164. {
  165. ChangeBone(partData, crf.ChangeValue);
  166. }
  167. }
  168. }
  169. /// <summary>
  170. /// 变形器改变
  171. /// </summary>
  172. /// <param name="partData"></param>
  173. /// <param name="changeValue"></param>
  174. private void ChangeBlendShape(PartData partData, Vector3 changeValue)
  175. {
  176. partData.floatValue = changeValue.x;
  177. Debug.Log(partData.id + " : "+ partData.floatValue);
  178. if(partData.oneBlend)
  179. {
  180. RefreshRoleBlendShape(partData.biggerBlendName, partData.floatValue);
  181. return;
  182. }
  183. if(partData.floatValue == 0.5f)
  184. {
  185. RefreshRoleBlendShape(partData.biggerBlendName, 0);
  186. RefreshRoleBlendShape(partData.smallerBlendName, 0);
  187. }
  188. if(partData.floatValue > 0.5f)
  189. {
  190. RefreshRoleBlendShape(partData.biggerBlendName, (partData.floatValue - 0.5f) * 2 * 100);
  191. RefreshRoleBlendShape(partData.smallerBlendName, 0);
  192. }
  193. if(partData.floatValue < 0.5f)
  194. {
  195. RefreshRoleBlendShape(partData.biggerBlendName, 0);
  196. RefreshRoleBlendShape(partData.smallerBlendName, (0.5f - partData.floatValue) * 2 * 100);
  197. }
  198. }
  199. /// <summary>
  200. /// 骨骼改变
  201. /// </summary>
  202. /// <param name="partData"></param>
  203. /// <param name="changeValue"></param>
  204. private void ChangeBone(PartData partData,Vector3 changeValue)
  205. {
  206. if (changeValue.x == 0.5f)
  207. {
  208. partData.floatValue = 1;
  209. }
  210. if (changeValue.x < 0.5f)
  211. {
  212. partData.floatValue = partData.minChangeValue + (1 - partData.minChangeValue) * (changeValue.x / 0.5f);
  213. }
  214. if (changeValue.x > 0.5f)
  215. {
  216. partData.floatValue = 1 + (partData.maxChangeValue - 1) * ((changeValue.x - 0.5f) / 0.5f);
  217. }
  218. Debug.Log(partData.id + " : " + changeValue + " 转换后 :" + partData.floatValue);
  219. if (partData.scaleChange != Vector3.zero)
  220. {
  221. for (int i = 0; i < partData.bones.Length; i++)
  222. {
  223. //var orginBoneScale = bodyData.orginWorldScaleList[partData.bones[i]];
  224. var orginBoneScale = bodyData.orginLocalScaleList[partData.bones[i]];
  225. var changeScale = bodyData.orginChangeScaleList[partData.bones[i]];
  226. var bone = bones[partData.bones[i]];
  227. var nowBone = bones[partData.bones[i]];
  228. //var scale = nowBone.lossyScale;
  229. var scale = nowBone.localScale;
  230. var nowScale = new Vector3(scale.x / orginBoneScale.x, scale.y / orginBoneScale.y, scale.z / orginBoneScale.z);
  231. //var newBoneScale = new Vector3(orginBoneScale.x * (partData.scaleChange.x == 1 ? partData.floatValue : 1) * nowScale.x, orginBoneScale.y * (partData.scaleChange.y == 1 ? partData.floatValue : 1) * nowScale.y, orginBoneScale.z * (partData.scaleChange.z == 1 ? partData.floatValue : 1) * nowScale.y);
  232. var newBoneScale = new Vector3(
  233. partData.scaleChange.x == 1 ? partData.floatValue * orginBoneScale.x * changeScale.x : scale.x,
  234. partData.scaleChange.y == 1 ? partData.floatValue * orginBoneScale.y * changeScale.y : scale.y,
  235. partData.scaleChange.z == 1 ? partData.floatValue * orginBoneScale.z * changeScale.z : scale.z
  236. );
  237. bodyData.changedScaleList[partData.bones[i]] = newBoneScale;
  238. bodyData.ChangedScaleParamsList[partData.bones[i]] = new Vector3(newBoneScale.x/orginBoneScale.x/changeScale.x, newBoneScale.y / orginBoneScale.y / changeScale.y, newBoneScale.z / orginBoneScale.z / changeScale.z);
  239. Debug.Log(partData.bones[i] + " : " + bodyData.ChangedScaleParamsList[partData.bones[i]]);
  240. //子物体
  241. var count = nowBone.childCount;
  242. for (int j = 0; j < count; j++)
  243. {
  244. var childname = nowBone.GetChild(j).name;
  245. if(bones.ContainsKey(childname))
  246. {
  247. var orginChildBoneScale = bodyData.orginLocalScaleList[childname];
  248. var beforeChildScaleParams = bodyData.ChangedScaleParamsList[childname];
  249. bodyData.orginChangeScaleList[childname] = new Vector3(orginBoneScale.x/newBoneScale.x, orginBoneScale.y / newBoneScale.y, orginBoneScale.z / newBoneScale.z);
  250. bodyData.changedScaleList[childname] = new Vector3(
  251. beforeChildScaleParams.x * bodyData.orginChangeScaleList[childname].x * orginChildBoneScale.x,
  252. beforeChildScaleParams.y * bodyData.orginChangeScaleList[childname].y * orginChildBoneScale.y,
  253. beforeChildScaleParams.z * bodyData.orginChangeScaleList[childname].z * orginChildBoneScale.z
  254. );
  255. Debug.Log(childname + " : " + bodyData.ChangedScaleParamsList[childname]);
  256. }
  257. }
  258. }
  259. }
  260. //修改位置
  261. if (partData.positionChange != Vector3.zero)
  262. {
  263. for (int i = 0; i < partData.bones.Length; i++)
  264. {
  265. }
  266. }
  267. //修改旋转
  268. if (partData.rotationChange != Vector3.zero)
  269. {
  270. }
  271. RefreshRoleBone();
  272. }
  273. public float GetBodyBoneValue(ECustomStyple styple,int id)
  274. {
  275. PartData partData = null;
  276. switch (styple)
  277. {
  278. case ECustomStyple.None:
  279. break;
  280. case ECustomStyple.NieLian:
  281. partData = bodyData.faceList[id];
  282. break;
  283. case ECustomStyple.Body:
  284. partData = bodyData.bodyList[id];
  285. break;
  286. case ECustomStyple.Cloth:
  287. break;
  288. case ECustomStyple.Ornament:
  289. break;
  290. default:
  291. break;
  292. }
  293. if(partData == null)
  294. {
  295. return 0;
  296. }
  297. Debug.Log(partData.id + " :" + partData.useBlend + " : " + partData.floatValue);
  298. if (partData.useBlend)
  299. {
  300. return partData.floatValue;
  301. }
  302. Debug.Log(id +": GetBodyBoneValue + " + partData.scaleChange + " " + partData.floatValue);
  303. if (partData.scaleChange.x == 1 || partData.scaleChange.y == 1 || partData.scaleChange.z == 1)
  304. {
  305. if (partData.floatValue == 1)
  306. {
  307. return 0.5f;
  308. }
  309. if (partData.floatValue < 1)
  310. {
  311. return (partData.floatValue - partData.minChangeValue) / (1 - partData.minChangeValue)/2;
  312. }
  313. if (partData.floatValue > 1)
  314. {
  315. return 0.5f + (partData.floatValue - 1) / (partData.maxChangeValue - 1)/2;
  316. }
  317. }
  318. return 0.5f;
  319. }
  320. /// <summary>
  321. /// 重置角色数据
  322. /// </summary>
  323. public void ResetRole()
  324. {
  325. if(testPlayer == null)
  326. {
  327. Debug.LogError("没有模型存在");
  328. return;
  329. }
  330. Debug.Log("重置模型");
  331. foreach (var item in bodyData.bodyList)
  332. {
  333. var key = item.Key;
  334. var value = item.Value;
  335. if(value.useBlend)
  336. {
  337. value.floatValue = 0;
  338. }
  339. else
  340. {
  341. value.floatValue = 1;
  342. }
  343. }
  344. //重置缩放
  345. foreach (var item in bodyData.orginLocalScaleList)
  346. {
  347. var key = item.Key;
  348. var value = item.Value;
  349. testPlayer.SetBoneScale(key, value);
  350. //testPlayer.SetBoneWorldScale(key, value);
  351. if (bodyData.changedScaleList.ContainsKey(key))
  352. {
  353. bodyData.changedScaleList[key] = bodyData.orginLocalScaleList[key];
  354. }
  355. bodyData.orginChangeScaleList[key] = new Vector3(1, 1, 1);
  356. bodyData.ChangedScaleParamsList[key] = new Vector3(1, 1, 1);
  357. }
  358. //重置旋转
  359. foreach (var item in bodyData.orginLocalRotationList)
  360. {
  361. var key = item.Key;
  362. var value = item.Value;
  363. testPlayer.SetBoneRot(key, value);
  364. }
  365. //重置位置
  366. foreach (var item in bodyData.orginLocalPositionList)
  367. {
  368. var key = item.Key;
  369. var value = item.Value;
  370. testPlayer.SetBonePos(key, value);
  371. }
  372. testPlayer.ResetAllBlendShape();
  373. }
  374. public void RefreshRoleBlendShape(string name,float value)
  375. {
  376. if (testPlayer == null)
  377. {
  378. Debug.LogError("没有模型存在");
  379. return;
  380. }
  381. testPlayer.SetBlendShape(name, value);
  382. }
  383. public void RefreshRoleBone()
  384. {
  385. if (testPlayer == null)
  386. {
  387. Debug.LogError("没有模型存在");
  388. return;
  389. }
  390. Debug.Log("刷新模型");
  391. //刷新缩放
  392. //foreach (var item in bodyData.orginLocalScaleList)
  393. //{
  394. // var key = item.Key;
  395. // var value = item.Value;
  396. // if(bodyData.changedScaleList.ContainsKey(key))
  397. // {
  398. // testPlayer.SetBoneScale(key, bodyData.changedScaleList[key]);
  399. // }
  400. // else
  401. // {
  402. // testPlayer.SetBoneScale(key, value);
  403. // }
  404. //}
  405. foreach (var item in bodyData.changedScaleList)
  406. {
  407. var key = item.Key;
  408. var value = item.Value;
  409. //testPlayer.SetBoneWorldScale(key, value, bodyData.orginLocalScaleList[key], bodyData.orginWorldScaleList[key]);
  410. testPlayer.SetBoneScale(key, value);
  411. }
  412. }
  413. /// <summary>
  414. /// 旋转模特
  415. /// </summary>
  416. public void RotateModel(float offset)
  417. {
  418. if (testPlayer == null)
  419. {
  420. Debug.LogError("没有模型存在");
  421. return;
  422. }
  423. testPlayer.RotateSelf(offset);
  424. }
  425. }
  426. }