public override void _IntegrateForces(Physics2DDirectBodyState bodyState) { Vector2 linearVelocity = bodyState.LinearVelocity; float step = bodyState.Step; PlayerInputInteraction playerInputInteraction = ListenToPlayerInput(); linearVelocity.x -= this.floorHVelocity; floorHVelocity = 0.0f; FloorContact floorContact = FindFloorContact(bodyState); ProcessSpawn(playerInputInteraction); ProcessShooting(playerInputInteraction, step); ProcessFloorContact(floorContact, step); linearVelocity = ProcessJump(playerInputInteraction, linearVelocity, step); linearVelocity = ProcessPlayerMovement(playerInputInteraction, linearVelocity, step); this.shooting = playerInputInteraction.Shoot; if (floorContact.FoundFloor) { floorHVelocity = bodyState.GetContactColliderVelocityAtPosition(floorContact.FloorIndex).x; linearVelocity.x += floorHVelocity; } linearVelocity += bodyState.TotalGravity * step; bodyState.LinearVelocity = linearVelocity; }
private void ProcessFloorContact(FloorContact floorContact, float step) { if (floorContact.FoundFloor) { this.airborneTime = 0.0f; } else { this.airborneTime += step; } }
private FloorContact FindFloorContact(Physics2DDirectBodyState bodyState) { FloorContact floorContact = new FloorContact(false, -1); for (int i = 0; i < bodyState.GetContactCount(); i++) { Vector2 contactLocalNormal = bodyState.GetContactLocalNormal(i); if (contactLocalNormal.Dot(new Vector2(0, -1)) > 0.6f) { floorContact.FoundFloor = true; floorContact.FloorIndex = i; } } return(floorContact); }
void Awake() { rigidbody2D = GetComponent<Rigidbody2D>(); floorContact = transform.FindChild("FloorContact").gameObject.GetComponent<FloorContact>(); animator = GetComponent<Animator>(); }