public void UpdateState() { OnStateUpdateStart?.Invoke(); stepsSinceLastGrounded += 1; body.useGravity = true; if (OnGround || SnapToGround() || CheckSteepContacts()) { OnGroundedStateUpdate?.Invoke(); stepsSinceLastGrounded = 0; if (groundContatctCount > 1) { ContactNormal.Normalize(); } } else { ContactNormal = Vector3.up; OnInAirStateUpdate?.Invoke(); } CollisionHandlerStateSheet.CompareAndInvoke(currentState, prevState); OnStateUpdateEnd?.Invoke(); }
public static void CompareAndInvoke(CollisionHandlerStateSheet current, CollisionHandlerStateSheet prev) { var handler = current.handler; if (current.stepsSinceLastGrounded == 1 && prev.stepsSinceLastGrounded == 0) { handler.OnInAirStart?.Invoke(); } if (current.groundContatctCount >= 1 && prev.stepsSinceLastGrounded > 0) { handler.OnGroundedStart?.Invoke(); } if (current.steepContactCount >= 1 && prev.steepContactCount < 1) { handler.OnWallStart?.Invoke(); } }
public void CopyValues(CollisionHandlerStateSheet src) { groundContatctCount = src.groundContatctCount; steepContactCount = src.steepContactCount; stepsSinceLastGrounded = src.stepsSinceLastGrounded; }
private void Start() { prevState = new CollisionHandlerStateSheet(this); currentState = new CollisionHandlerStateSheet(this); }