EffectorOffset.cs 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. using UnityEngine;
  2. using System.Collections;
  3. using RootMotion.FinalIK;
  4. namespace RootMotion.Demos {
  5. /// <summary>
  6. /// Demo for offsetting Effectors.
  7. /// </summary>
  8. public class EffectorOffset : OffsetModifier {
  9. // If 1, The hand effectors will maintain their position relative to their parent triangle's rotation {root node, left shoulder, right shoulder}
  10. [Range(0f, 1f)]
  11. public float handsMaintainRelativePositionWeight;
  12. // The offset vectors for each effector
  13. public Vector3 bodyOffset, leftShoulderOffset, rightShoulderOffset, leftThighOffset, rightThighOffset, leftHandOffset, rightHandOffset, leftFootOffset, rightFootOffset;
  14. protected override void OnModifyOffset() {
  15. // How much will the hand effectors maintain their position relative to their parent triangle's rotation {root node, left shoulder, right shoulder} ?
  16. ik.solver.leftHandEffector.maintainRelativePositionWeight = handsMaintainRelativePositionWeight;
  17. ik.solver.rightHandEffector.maintainRelativePositionWeight = handsMaintainRelativePositionWeight;
  18. // Apply position offsets relative to this GameObject's rotation.
  19. ik.solver.bodyEffector.positionOffset += transform.rotation * bodyOffset * weight;
  20. ik.solver.leftShoulderEffector.positionOffset += transform.rotation * leftShoulderOffset * weight;
  21. ik.solver.rightShoulderEffector.positionOffset += transform.rotation * rightShoulderOffset * weight;
  22. ik.solver.leftThighEffector.positionOffset += transform.rotation * leftThighOffset * weight;
  23. ik.solver.rightThighEffector.positionOffset += transform.rotation * rightThighOffset * weight;
  24. ik.solver.leftHandEffector.positionOffset += transform.rotation * leftHandOffset * weight;
  25. ik.solver.rightHandEffector.positionOffset += transform.rotation * rightHandOffset * weight;
  26. ik.solver.leftFootEffector.positionOffset += transform.rotation * leftFootOffset * weight;
  27. ik.solver.rightFootEffector.positionOffset += transform.rotation * rightFootOffset * weight;
  28. // NB! effector position offsets are reset to Vector3.zero after FBBIK update is complete.
  29. // This enables to have more than one script modifying the position offset of effectors.
  30. // Therefore instead of writing effector.positionOffset = value, write effector.positionOffset += value instead.
  31. }
  32. }
  33. }