public override void PerformAction(float delta) {
Vector3 ori = character.transform.position;
Vector3 target = character.grab.GetCenter() - grabbingOffset;
// once we center, stop moving!
if (!centering) {
character.velocity = Vector3.zero;
}
// close enough to our target position ?
if (centering && Vector3.Distance(ori, target) < 0.1f) {
character.velocity = target - ori;
centering = false;
}
// close the gap a little more
if (centering) {
// centering phase
Vector3.SmoothDamp(
ori,
target,
ref character.velocity,
towardsTime,
towardsSpeed, //Mathf.Infinity,
delta);
}
character.SetFacing(input.GetAxisRawX());
// check for dismount conditions
if (dismountJumping && input.IsActionHeld(actionJump.action)) {
canGrab.Reset();
character.ExitState(States.Grabbing);
actionJump.Jump(new JumpConstant(character,
jumpOff.Clone((int) character.faceDir)
));
} else if (dismountPressingDown && input.GetAxisRawY() < 0) {
// TODO Dismount down delay ?
canGrab.Reset();
character.ExitState(States.Grabbing);
}
}