LimbColliderMgr.cs 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using kt.Physics;
  5. using kt.Serialization;
  6. using kt.Utility;
  7. using UnityEngine;
  8. public class LimbColliderMgr : MonoBehaviour
  9. {
  10. public void Init(TBody body)
  11. {
  12. this.Body = body;
  13. this.DestroyCollider();
  14. foreach (KeyValuePair<LimbColliderMgr.LimbType, string[]> keyValuePair in LimbColliderMgr.LimbTypeBoneNamePairDic)
  15. {
  16. LimbColliderMgr.LimbColliderData limbColliderData = new LimbColliderMgr.LimbColliderData();
  17. limbColliderData.limbType = keyValuePair.Key;
  18. limbColliderData.parent = body.GetBone(keyValuePair.Value[0]);
  19. limbColliderData.child = body.GetBone(keyValuePair.Value[1]);
  20. GameObject gameObject = new GameObject(string.Format("{0} LimbCollider", keyValuePair.Key));
  21. gameObject.transform.SetParent(limbColliderData.parent, false);
  22. limbColliderData.collider = gameObject.AddComponent<NativeMaidPropCollider>();
  23. limbColliderData.collider.capsuleStatus.direction = MathUtility.VectorType.X;
  24. limbColliderData.collider.capsuleStatus.isDirectionInverse = true;
  25. limbColliderData.collider.capsuleStatus.startRadius = (limbColliderData.collider.capsuleStatus.endRadius = 0.05f);
  26. limbColliderData.collider.SetChara(body.maid);
  27. limbColliderData.relatedMPNList.Add(MPN.sintyou);
  28. if (LimbColliderMgr.IsUpperBodyLimb(keyValuePair.Key))
  29. {
  30. limbColliderData.relatedMPNList.Add(MPN.UdeScl);
  31. }
  32. else
  33. {
  34. limbColliderData.relatedMPNList.Add(MPN.DouPer);
  35. }
  36. this.LimbTypeColliderDataDic[keyValuePair.Key] = limbColliderData;
  37. limbColliderData.CalcCapsuleHeight();
  38. }
  39. foreach (KeyValuePair<MPN, LimbColliderMgr.MaidPropInfo> keyValuePair2 in this.MaidPropMetaDic)
  40. {
  41. MPN key = keyValuePair2.Key;
  42. LimbColliderMgr.MaidPropInfo value = keyValuePair2.Value;
  43. MaidProp prop = body.maid.GetProp(key);
  44. if (prop != null)
  45. {
  46. value.Value = (float)prop.value;
  47. }
  48. }
  49. body.onBoneMorphApply.Add(new Action<string, float>(this.SetPropValue), false);
  50. KasaiUtility.FileLoadGameData("limbconf.limbcol", new Action<StreamReader>(this.Load), null);
  51. }
  52. private void OnDestroy()
  53. {
  54. this.DestroyCollider();
  55. }
  56. private void DestroyCollider()
  57. {
  58. foreach (LimbColliderMgr.LimbColliderData limbColliderData in this.LimbTypeColliderDataDic.Values)
  59. {
  60. if (limbColliderData.collider)
  61. {
  62. UnityEngine.Object.Destroy(limbColliderData.collider);
  63. }
  64. }
  65. this.LimbTypeColliderDataDic.Clear();
  66. }
  67. private void SetPropValue(string tag, float val)
  68. {
  69. foreach (KeyValuePair<MPN, LimbColliderMgr.MaidPropInfo> keyValuePair in this.MaidPropMetaDic)
  70. {
  71. MPN key = keyValuePair.Key;
  72. LimbColliderMgr.MaidPropInfo value = keyValuePair.Value;
  73. if (key.ToString() == tag)
  74. {
  75. value.isValChange = (value.Value != val);
  76. value.Value = val;
  77. break;
  78. }
  79. }
  80. }
  81. public void UpdateColliderTransform()
  82. {
  83. foreach (LimbColliderMgr.LimbColliderData limbColliderData in this.LimbTypeColliderDataDic.Values)
  84. {
  85. foreach (MPN key in limbColliderData.relatedMPNList)
  86. {
  87. if (this.MaidPropMetaDic[key].isValChange)
  88. {
  89. limbColliderData.CalcCapsuleHeight();
  90. break;
  91. }
  92. }
  93. }
  94. foreach (LimbColliderMgr.MaidPropInfo maidPropInfo in this.MaidPropMetaDic.Values)
  95. {
  96. maidPropInfo.isValChange = false;
  97. }
  98. }
  99. public NativeMaidPropCollider GetCollider(LimbColliderMgr.LimbType limb_type)
  100. {
  101. if (this.LimbTypeColliderDataDic.ContainsKey(limb_type))
  102. {
  103. return this.LimbTypeColliderDataDic[limb_type].collider;
  104. }
  105. return null;
  106. }
  107. public void Save(StreamWriter writer)
  108. {
  109. LimbColliderMgr.LimbColliderPackage limbColliderPackage = new LimbColliderMgr.LimbColliderPackage();
  110. foreach (KeyValuePair<LimbColliderMgr.LimbType, LimbColliderMgr.LimbColliderData> keyValuePair in this.LimbTypeColliderDataDic)
  111. {
  112. LimbColliderMgr.LimbColliderData limbColliderData = new LimbColliderMgr.LimbColliderData();
  113. limbColliderData.limbType = keyValuePair.Key;
  114. limbColliderData.colliderStatus = keyValuePair.Value.collider.maidPropStatus;
  115. limbColliderPackage.colliderDataList.Add(limbColliderData);
  116. }
  117. string value = JsonUtility.ToJson(limbColliderPackage, true);
  118. writer.Write(value);
  119. }
  120. public void Load(StreamReader reader)
  121. {
  122. string json = reader.ReadToEnd();
  123. LimbColliderMgr.LimbColliderPackage limbColliderPackage = JsonUtility.FromJson<LimbColliderMgr.LimbColliderPackage>(json);
  124. foreach (LimbColliderMgr.LimbColliderData limbColliderData in limbColliderPackage.colliderDataList)
  125. {
  126. if (this.LimbTypeColliderDataDic.ContainsKey(limbColliderData.limbType))
  127. {
  128. this.LimbTypeColliderDataDic[limbColliderData.limbType].collider.SetStatus(limbColliderData.colliderStatus, this.Body);
  129. }
  130. }
  131. }
  132. private static bool IsUpperBodyLimb(LimbColliderMgr.LimbType limb_type)
  133. {
  134. return limb_type == LimbColliderMgr.LimbType.UpperArm_L || limb_type == LimbColliderMgr.LimbType.UpperArm_R || limb_type == LimbColliderMgr.LimbType.Forearm_L || limb_type == LimbColliderMgr.LimbType.Forearm_R;
  135. }
  136. public const string COLLIDER_FILE_NAME = "limbconf.limbcol";
  137. private static Dictionary<LimbColliderMgr.LimbType, string[]> LimbTypeBoneNamePairDic = new Dictionary<LimbColliderMgr.LimbType, string[]>
  138. {
  139. {
  140. LimbColliderMgr.LimbType.UpperArm_L,
  141. new string[]
  142. {
  143. "Bip01 L UpperArm",
  144. "Bip01 L Forearm"
  145. }
  146. },
  147. {
  148. LimbColliderMgr.LimbType.Forearm_L,
  149. new string[]
  150. {
  151. "Bip01 L Forearm",
  152. "Bip01 L Hand"
  153. }
  154. },
  155. {
  156. LimbColliderMgr.LimbType.UpperArm_R,
  157. new string[]
  158. {
  159. "Bip01 R UpperArm",
  160. "Bip01 R Forearm"
  161. }
  162. },
  163. {
  164. LimbColliderMgr.LimbType.Forearm_R,
  165. new string[]
  166. {
  167. "Bip01 R Forearm",
  168. "Bip01 R Hand"
  169. }
  170. },
  171. {
  172. LimbColliderMgr.LimbType.Thigh_L,
  173. new string[]
  174. {
  175. "Bip01 L Thigh",
  176. "Bip01 L Calf"
  177. }
  178. },
  179. {
  180. LimbColliderMgr.LimbType.Calf_L,
  181. new string[]
  182. {
  183. "Bip01 L Calf",
  184. "Bip01 L Foot"
  185. }
  186. },
  187. {
  188. LimbColliderMgr.LimbType.Thigh_R,
  189. new string[]
  190. {
  191. "Bip01 R Thigh",
  192. "Bip01 R Calf"
  193. }
  194. },
  195. {
  196. LimbColliderMgr.LimbType.Calf_R,
  197. new string[]
  198. {
  199. "Bip01 R Calf",
  200. "Bip01 R Foot"
  201. }
  202. }
  203. };
  204. [SerializeField]
  205. [ReadOnly]
  206. private TBody Body;
  207. private Dictionary<LimbColliderMgr.LimbType, LimbColliderMgr.LimbColliderData> LimbTypeColliderDataDic = new Dictionary<LimbColliderMgr.LimbType, LimbColliderMgr.LimbColliderData>();
  208. private readonly Dictionary<MPN, LimbColliderMgr.MaidPropInfo> MaidPropMetaDic = new Dictionary<MPN, LimbColliderMgr.MaidPropInfo>
  209. {
  210. {
  211. MPN.sintyou,
  212. new LimbColliderMgr.MaidPropInfo()
  213. },
  214. {
  215. MPN.UdeScl,
  216. new LimbColliderMgr.MaidPropInfo()
  217. },
  218. {
  219. MPN.DouPer,
  220. new LimbColliderMgr.MaidPropInfo()
  221. }
  222. };
  223. public enum LimbType
  224. {
  225. UpperArm_L,
  226. Forearm_L,
  227. UpperArm_R,
  228. Forearm_R,
  229. Thigh_L,
  230. Calf_L,
  231. Thigh_R,
  232. Calf_R
  233. }
  234. [Serializable]
  235. public class LimbColliderPackage : ASerializationVersionControl
  236. {
  237. public override int FixVersion
  238. {
  239. get
  240. {
  241. return 1000;
  242. }
  243. }
  244. public List<LimbColliderMgr.LimbColliderData> colliderDataList = new List<LimbColliderMgr.LimbColliderData>();
  245. }
  246. [Serializable]
  247. public class LimbColliderData : ASerializationVersionControl
  248. {
  249. public override int FixVersion
  250. {
  251. get
  252. {
  253. return 1000;
  254. }
  255. }
  256. public void CalcCapsuleHeight()
  257. {
  258. this.collider.capsuleStatus.height = Vector3.Distance(this.parent.position, this.child.position);
  259. this.collider.status.center = this.collider.localDirection * this.collider.capsuleStatus.height / 2f;
  260. }
  261. public override void OnBeforeSerialize()
  262. {
  263. base.OnBeforeSerialize();
  264. if (this.collider)
  265. {
  266. this.colliderStatus = this.collider.maidPropStatus;
  267. }
  268. }
  269. public LimbColliderMgr.LimbType limbType;
  270. [HideInInspector]
  271. public NativeMaidPropColliderStatus colliderStatus = new NativeMaidPropColliderStatus();
  272. [NonSerialized]
  273. public Transform parent;
  274. [NonSerialized]
  275. public Transform child;
  276. [NonSerialized]
  277. public NativeMaidPropCollider collider;
  278. [HideInInspector]
  279. [NonSerialized]
  280. public List<MPN> relatedMPNList = new List<MPN>();
  281. }
  282. private class MaidPropInfo
  283. {
  284. public float Value;
  285. public bool isValChange;
  286. }
  287. }