FABRIKCtrl.cs 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. using System;
  2. using RootMotion.FinalIK;
  3. using UnityEngine;
  4. [Serializable]
  5. public class FABRIKCtrl : AIKCtrl
  6. {
  7. public FABRIKCtrl(FullBodyIKMgr ik_mgr, FullBodyIKMgr.IKEffectorType effector_type) : base(ik_mgr, effector_type)
  8. {
  9. this.IK = base.constraintTarget.parent.gameObject.AddComponent<FABRIK>();
  10. this.IK.solver.target = base.constraintTarget;
  11. this.IK.fixTransforms = false;
  12. this.IK.solver.SetChain(this.ChainBones, this.ChainBones[0]);
  13. this.IK.enabled = false;
  14. for (int i = 0; i < this.ChainBones.Length - 1; i++)
  15. {
  16. Transform transform = this.ChainBones[i];
  17. Transform transform2 = base.chainBones[i + 1];
  18. this.BoneLengthSum += Vector3.Distance(transform.position, transform2.position);
  19. }
  20. }
  21. public override void OnPostFullBodySolverUpdate()
  22. {
  23. if (base.pointIKData.isIKExec)
  24. {
  25. if (base.pointIKData.isBlendNow)
  26. {
  27. float num = Vector3.Distance(this.ChainBones[0].position, base.constraintTarget.position);
  28. if (num > this.BoneLengthSum)
  29. {
  30. Vector3 a = this.ChainBones[0].position - base.constraintTarget.position;
  31. base.constraintTarget.position += a / num * (num - this.BoneLengthSum);
  32. float num2 = 1f - Mathf.Clamp01((num - this.BoneLengthSum) / this.BoneLengthSum);
  33. base.positionWeight *= num2;
  34. }
  35. }
  36. this.IK.solver.Update();
  37. }
  38. if (base.rotateIKData.isIKExec)
  39. {
  40. base.bone.rotation = Quaternion.Slerp(base.bone.rotation, base.constraintTarget.rotation, base.rotationWeight);
  41. }
  42. }
  43. protected override void OnPostSetPositionWeight(float val)
  44. {
  45. this.IK.solver.IKPositionWeight = val;
  46. }
  47. [SerializeField]
  48. protected FABRIK IK;
  49. protected readonly float BoneLengthSum;
  50. }