/// <summary> /// Event that is called when we begin a new collision /// </summary> /// <param name="HitData"></param> public void OnEHCollisionEnter(FHitData HitData) { if (HitData.HitDirection.y > 0 && CurrentMovementType == EMovementType.IN_AIR) { OnLanded(); } }
private void OnCharacterCollision(FHitData HitData) { if (HitData.HitDirection.x > 0) { ColliderWeAreOn = HitData.OtherCollider; if (!CharacterMovement.GetIsFacingLeft()) { CharacterMovement.SetIsFacingLeft(true, true); } } else if (HitData.HitDirection.x < 0) { ColliderWeAreOn = HitData.OtherCollider; if (CharacterMovement.GetIsFacingLeft()) { CharacterMovement.SetIsFacingLeft(false, true); } } else { return; } CachedWallDirection = Mathf.Sign(ColliderWeAreOn.transform.position.x - this.transform.position.x); CharacterAnim.SetBool(ANIM_WALL_HOLD, true); }
private void OnCharacterCollisionEnd(FHitData HitData) { if (HitData.OtherCollider == ColliderWeAreOn) { ColliderWeAreOn = null; CharacterAnim.SetBool(ANIM_WALL_HOLD, false); } }
private void ReverseHitData(ref FHitData HitData) { EHBaseCollider2D OriginalOwning = HitData.OwningCollider; HitData.OwningCollider = HitData.OtherCollider; HitData.OtherCollider = OriginalOwning; HitData.HitDirection *= -1f; }
protected bool MatchesOverlappingHitData(EHBaseCollider2D OtherCollider, ref FHitData HitData) { if (!OverlappingColliders.ContainsKey(OtherCollider)) { return(false); } return(OverlappingColliders[OtherCollider].HitDirection != HitData.HitDirection); }
public override bool PushOutCollider(EHBaseCollider2D ColliderToPushOut) { EHBox2DCollider OtherRectCollier = (EHBox2DCollider)ColliderToPushOut; if (OtherRectCollier == null) { return(false); } if (RectGeometry.IsOverlappingRect(OtherRectCollier.PhysicsSweepGeometry)) { FHitData HitData = new FHitData(); HitData.OwningCollider = this; HitData.OtherCollider = ColliderToPushOut; EHBounds2D ThisCurrentBounds = RectGeometry.GetBounds(); EHBounds2D OtherCurrentBounds = OtherRectCollier.RectGeometry.GetBounds(); EHBounds2D ThisPreviousBounds = PreviousRectGeometry.GetBounds(); EHBounds2D OtherPreviousBounds = OtherRectCollier.PreviousRectGeometry.GetBounds(); Vector2 RightUpOffset = ThisCurrentBounds.MaxBounds - OtherCurrentBounds.MinBounds; Vector2 LeftBottomOffset = ThisCurrentBounds.MinBounds - OtherCurrentBounds.MaxBounds; if (ThisPreviousBounds.MaxBounds.y < OtherPreviousBounds.MinBounds.y && RightUpOffset.y > 0 && (CollisionMask & (byte)ECollisionDirection.UP) != 0) { ColliderToPushOut.transform.position += Vector3.up * RightUpOffset.y; HitData.HitDirection = Vector2.down; } else if (ThisPreviousBounds.MaxBounds.x < OtherPreviousBounds.MinBounds.x && RightUpOffset.x > 0 && (CollisionMask & (byte)ECollisionDirection.RIGHT) != 0) { ColliderToPushOut.transform.position += Vector3.right * RightUpOffset.x; HitData.HitDirection = Vector2.left; } else if (ThisPreviousBounds.MinBounds.x > OtherPreviousBounds.MaxBounds.x && LeftBottomOffset.x < 0 && (CollisionMask & (byte)ECollisionDirection.LEFT) != 0) { ColliderToPushOut.transform.position += Vector3.right * LeftBottomOffset.x; HitData.HitDirection = Vector2.right; } else if (ThisPreviousBounds.MinBounds.y > OtherPreviousBounds.MaxBounds.y && LeftBottomOffset.y < 0 && (CollisionMask & (byte)ECollisionDirection.DOWN) != 0) { ColliderToPushOut.transform.position += Vector3.up * LeftBottomOffset.y; HitData.HitDirection = Vector2.up; } if (!ContainOverlappingCollider(ColliderToPushOut) || MatchesOverlappingHitData(ColliderToPushOut, ref HitData)) { AddColliderToHitSet(ColliderToPushOut, HitData); } HitCollisionStay(ColliderToPushOut, HitData); return(true); } return(false); }
protected void HitCollisionStay(EHBaseCollider2D OtherCollider, FHitData HitData) { if (OtherCollider != null) { OnCollision2DStay?.Invoke(HitData); ReverseHitData(ref HitData); OtherCollider.OnCollision2DStay?.Invoke(HitData); } }
/// <summary> /// This should be called anytime we end a collision with another collider /// </summary> /// <param name="OtherCollider"></param> protected void RemoveColliderFromHitSet(EHBaseCollider2D OtherCollider, FHitData HitData) { if (OtherCollider != null && OverlappingColliders.Remove(OtherCollider)) { OtherCollider.OverlappingColliders.Remove(this); OnCollision2DEnd?.Invoke(HitData); ReverseHitData(ref HitData); OtherCollider.OnCollision2DEnd?.Invoke(HitData); } }
/// <summary> /// This methods will be called every time we intersect with a collider to indicate wither or not we are currently in the air or not. /// </summary> /// <param name="HitData"></param> private void OnEHCollisionStay(FHitData HitData) { if (HitData.HitDirection.y != 0 && Mathf.Sign(HitData.HitDirection.y) != Mathf.Sign(Velocity.y)) { Velocity = new Vector2(Velocity.x, 0); } if (HitData.HitDirection.x != 0 && Mathf.Sign(HitData.HitDirection.x) != Mathf.Sign(Velocity.x)) { Velocity = new Vector2(0, Velocity.y); } }
/// <summary> /// This should be called anytime we begin a collision with another collider /// </summary> /// <param name="OtherCollider"></param> protected void AddColliderToHitSet(EHBaseCollider2D OtherCollider, FHitData HitData) { if (OtherCollider != null && !OverlappingColliders.ContainsKey(OtherCollider)) { OverlappingColliders.Add(OtherCollider, new FHitData()); OtherCollider.OverlappingColliders.Add(this, new FHitData()); } OverlappingColliders[OtherCollider] = HitData; OnCollision2DBegin?.Invoke(HitData); ReverseHitData(ref HitData); OtherCollider.OverlappingColliders[this] = HitData; OtherCollider.OnCollision2DBegin?.Invoke(HitData); }
/// <summary> /// Returns whether the physics collider that is passed in is overlapping with /// this collider /// </summary> /// <param name="OtherCollider"></param> /// <returns></returns> public bool IsPhysicsColliderOverlapping(EHBaseCollider2D OtherCollider) { if (SweepColliderOverlap(OtherCollider)) { return(true); } if (ContainOverlappingCollider(OtherCollider)) { FHitData HitData = new FHitData(); HitData.OtherCollider = OtherCollider; HitData.OwningCollider = this; RemoveColliderFromHitSet(OtherCollider, HitData); } return(false); }
protected virtual void OnDisable() { List <EHBaseCollider2D> ColliderIterator = new List <EHBaseCollider2D>(OverlappingColliders.Keys); foreach (EHBaseCollider2D OtherCollider in ColliderIterator) { if (bIsTrigger) { } else { FHitData HitData = new FHitData(); HitData.OtherCollider = OtherCollider; HitData.OwningCollider = this; RemoveColliderFromHitSet(OtherCollider, HitData); } } }