Beispiel #1
0
 /// <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();
     }
 }
Beispiel #2
0
 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);
 }
Beispiel #3
0
 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);
     }
 }
Beispiel #9
0
 /// <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);
            }
        }
    }