public virtual void ResetState() { transform.position = initState.pos; platformMask = initState.platformMask; triggerMask = initState.triggerMask; interactFlag = initState.interactFlag; isSleep = initState.isSleep; velocity = Vector3.zero; targetVelocity = Vector3.zero; gameObject.layer = initState.currentLayer; GetComponent <SpriteRenderer>().maskInteraction = initState.maskInteraction; collisionState.Reset(); }
/// <summary> /// attempts to move the character to position + deltaMovement. Any colliders in the way will cause the movement to /// stop when run into. /// </summary> /// <param name="deltaMovement">Delta movement.</param> public void Move(Vector3 deltaMovement) { // save off our current grounded state which we will use for becameGroundedThisFrame var oldCollisionState = new CollisionState2D(collision); // clear our state collision.Reset(); _raycastHitsThisFrame.Clear(); _isGoingUpSlope = false; var desiredPosition = entity.Position + deltaMovement; primeRaycastOrigins(desiredPosition, deltaMovement); // first, we check for a slope below us before moving // only check slopes if we are going down and grounded if (deltaMovement.y < 0 && oldCollisionState.Below) { handleVerticalSlope(ref deltaMovement); } // now we check movement in the horizontal dir if (Mathf.Abs(deltaMovement.x) > 0) { moveHorizontally(ref deltaMovement, oldCollisionState); } // next, check movement in the vertical dir if (Mathf.Abs(deltaMovement.y) > 0) { moveVertically(ref deltaMovement, oldCollisionState); } // move then update our state if (data.usePhysicsForMovement) { rigidBody.MovePosition(entity.Position + deltaMovement); velocity = rigidBody.velocity; } else { //transform.Translate( deltaMovement, Space.World ); var newPosition = entity.Position + deltaMovement; entity.SetPosition(newPosition); // only calculate velocity if we have a non-zero deltaTime if (FrameCounter.Instance.deltaTime > 0) { velocity = deltaMovement / FrameCounter.Instance.deltaTime; } } // After translation, update proximity check so collision state is fresh. // Without this, collision state doesn't get updated if there's no delta movement. collision = CheckProximity(data.skinWidth * 2, Direction2D.ALL); // Add to the collision buffer. collisionBuffer.AddFirst(new CollisionState2D(collision)); if (collisionBuffer.Count > data.collisionBufferMax) { collisionBuffer.RemoveLast(); } // set our becameGrounded state based on the previous and current collision state if (!oldCollisionState.Below && collision.Below) { collision.becameGroundedThisFrame = true; } // if we are going up a slope we artificially set a y velocity so we need to zero it out here if (_isGoingUpSlope) { velocity.y = 0; } // send off the collision events if we have a listener if (OnControllerCollidedEvent != null) { for (var i = 0; i < _raycastHitsThisFrame.Count; i++) { OnControllerCollidedEvent(_raycastHitsThisFrame[i]); } } }