/// <summary> /// 重ならなくなった時のコールバックメソッドを実行します。 /// </summary> /// <param name="other">重なっていたオブジェクト</param> private void HandleColliderExit(SpriteCollider2D other) { RemoveCollidedPair(other); onColliderExit.Invoke(other); other.onColliderExit.Invoke(this); }
/* * コールバックのハンドリング */ /// <summary> /// 重なった時のコールバックメソッドを実行します。 /// 前フレームで重なっていなかったペアであればOnColliderEnterイベントもハンドルします。 /// </summary> /// <param name="other">重なっているオブジェクト</param> private void HandleColliding(SpriteCollider2D other) { if (!IsCollidedPair(other)) { CollidedPairs.Add(new CollidedPair(this, other)); onColliderEnter.Invoke(other); other.onColliderEnter.Invoke(this); } onColliding.Invoke(other); other.onColliding.Invoke(this); }
/* * 当たり判定計算からの除外 */ /// <summary> /// 重なっていたオブジェクトのペアを削除します /// </summary> /// <param name="other">重なっていたオブジェクト</param> private void RemoveCollidedPair(SpriteCollider2D other) { CollidedPair target = null; foreach (var it in CollidedPairs.Where(it => it.IsEquals(this, other))) { target = it; } if (target != null) { CollidedPairs.Remove(target); } }
/// <summary> /// 同一フレームでの当たり判定処理済みペアとしてリストに追加します /// </summary> /// <param name="other">重なっているオブジェクト</param> private void AddSameFrameDecidedPair(SpriteCollider2D other) { DecidedInFrame.Add(new CollidedPair(this, other)); }
/* * 多重判定の防止 */ /// <summary> /// 同一フレームで当たり判定処理をしているか判定します /// </summary> /// <param name="other">重なっているオブジェクト</param> /// <returns>同一フレームで当たり判定処理済みであるか否か</returns> private bool IsDecidedPairInFrame(SpriteCollider2D other) { return(DecidedInFrame.Any(it => it.IsEquals(this, other))); }
/// <summary> /// 前フレームで重なっていたかどうか調べる /// </summary> /// <param name="other">比較対象</param> /// <returns>重なっていたどうか</returns> private bool IsCollidedPair(SpriteCollider2D other) { return(CollidedPairs.Any(it => it.IsEquals(this, other))); }
/* * 当たり判定比較 */ /// <summary> /// 他方と重なっているか調べる /// </summary> /// <param name="other">比較対象</param> /// <returns>重なっているかどうか</returns> private bool IsColliding(SpriteCollider2D other) { return(Math.Abs(X - other.X) < Width / 2 + other.Width / 2 && Math.Abs(Y - other.Y) < Height / 2 + other.Height / 2); }