diff --git a/Assets/Prefabs/Basic Ball.prefab b/Assets/Prefabs/Basic Ball.prefab index 3f80d7f..35ffcda 100644 --- a/Assets/Prefabs/Basic Ball.prefab +++ b/Assets/Prefabs/Basic Ball.prefab @@ -17,7 +17,7 @@ GameObject: - component: {fileID: 3177825165818360414} m_Layer: 0 m_Name: Basic Ball - m_TagString: Ball + m_TagString: BasicBall m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 diff --git a/Assets/Prefabs/Fruit Ball.prefab b/Assets/Prefabs/Fruit Ball.prefab index a19da71..0a87ef9 100644 --- a/Assets/Prefabs/Fruit Ball.prefab +++ b/Assets/Prefabs/Fruit Ball.prefab @@ -17,7 +17,7 @@ GameObject: - component: {fileID: 36043693063624440} m_Layer: 0 m_Name: Fruit Ball - m_TagString: Ball + m_TagString: FruitBall m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 diff --git a/Assets/Prefabs/Ooze Ball.prefab b/Assets/Prefabs/Ooze Ball.prefab index 6c147cf..b2be47d 100644 --- a/Assets/Prefabs/Ooze Ball.prefab +++ b/Assets/Prefabs/Ooze Ball.prefab @@ -17,7 +17,7 @@ GameObject: - component: {fileID: 2721640963658894789} m_Layer: 0 m_Name: Ooze Ball - m_TagString: Untagged + m_TagString: OozeBall m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 diff --git a/Assets/Scripts/Game/BallSpawner.cs b/Assets/Scripts/Game/BallSpawner.cs index b83be57..66e59ed 100644 --- a/Assets/Scripts/Game/BallSpawner.cs +++ b/Assets/Scripts/Game/BallSpawner.cs @@ -22,6 +22,8 @@ public class BallSpawner : MonoBehaviour private Queue ballQueue = new Queue(); + private Queue balls = new Queue(); + // Start is called once before the first execution of Update after the MonoBehaviour is created void Start() { @@ -46,7 +48,9 @@ public class BallSpawner : MonoBehaviour } Vector3 spawnPosition = GetRandomPositionInsideGameBoard(); - Instantiate(ballPrefab, spawnPosition, Quaternion.identity); + var newBall = Instantiate(ballPrefab, spawnPosition, Quaternion.identity); + + balls.Enqueue(newBall); } private Vector3 GetRandomPositionInsideGameBoard() @@ -70,8 +74,9 @@ public class BallSpawner : MonoBehaviour bounds = boardRenderer.bounds; } - float randomX = Random.Range(bounds.min.x, bounds.max.x); - float randomY = Random.Range(bounds.min.y, bounds.max.y); + const float edgeInset = 0.05f; + float randomX = Random.Range(bounds.min.x + edgeInset, bounds.max.x - edgeInset); + float randomY = Random.Range(bounds.min.y + edgeInset, bounds.max.y - edgeInset); return new Vector3(randomX, randomY, gameBoard.transform.position.z); } @@ -84,5 +89,32 @@ public class BallSpawner : MonoBehaviour spawnAction.Invoke(); yield return _waitForSeconds0_5; } + + // Disable collision between existing balls of certain types. + // Only basic balls and fruit balls will collide with each other, while ooze, + // nuclear, glass, and eye balls will not collide with any other balls. + // As an exception, glass balls will collide with other glass balls. + foreach (var ball in balls) + { + foreach (var otherBall in balls) + { + if (ball == otherBall) continue; + + bool ballIsBasicOrFruit = ball.CompareTag("BasicBall") || ball.CompareTag("FruitBall"); + bool otherIsBasicOrFruit = otherBall.CompareTag("BasicBall") || otherBall.CompareTag("FruitBall"); + bool bothAreGlass = ball.CompareTag("GlassBall") && otherBall.CompareTag("GlassBall"); + + bool shouldCollide = (ballIsBasicOrFruit && otherIsBasicOrFruit) || bothAreGlass; + + if (!shouldCollide) + { + Physics2D.IgnoreCollision( + ball.GetComponent(), + otherBall.GetComponent(), + true + ); + } + } + } } } diff --git a/Assets/Scripts/Game/Balls/BasicBall.cs b/Assets/Scripts/Game/Balls/BasicBall.cs index 8aeb30b..1153f84 100644 --- a/Assets/Scripts/Game/Balls/BasicBall.cs +++ b/Assets/Scripts/Game/Balls/BasicBall.cs @@ -36,7 +36,9 @@ public class BasicBall : MonoBehaviour void OnCollisionEnter2D(Collision2D collision) { - if (collision.gameObject.CompareTag("Wall") || collision.gameObject.CompareTag("Ball")) + if (collision.gameObject.CompareTag("Wall") || + collision.gameObject.CompareTag("BasicBall") || + collision.gameObject.CompareTag("FruitBall")) { ContactPoint2D contact = collision.GetContact(0); speed = Vector2.Reflect(speed, contact.normal); diff --git a/Assets/Scripts/Game/Balls/FruitBall.cs b/Assets/Scripts/Game/Balls/FruitBall.cs index 9a488a8..34fe0bb 100644 --- a/Assets/Scripts/Game/Balls/FruitBall.cs +++ b/Assets/Scripts/Game/Balls/FruitBall.cs @@ -50,12 +50,15 @@ public class FruitBall : MonoBehaviour void OnCollisionEnter2D(Collision2D collision) { - if (collision.gameObject.CompareTag("Wall") || collision.gameObject.CompareTag("Ball")) + if (collision.gameObject.CompareTag("Wall") || + collision.gameObject.CompareTag("BasicBall") || + collision.gameObject.CompareTag("FruitBall")) { ContactPoint2D contact = collision.GetContact(0); speed = Vector2.Reflect(speed, contact.normal); - if (collision.gameObject.CompareTag("Ball")) + if (collision.gameObject.CompareTag("BasicBall") || + collision.gameObject.CompareTag("FruitBall")) { speedIncreaseTimer = 2.0f; // Reset the timer to 2 seconds speedMultiplier = 50.0f; // Set the speed multiplier to 7x diff --git a/Assets/Scripts/Game/Balls/OozeBall.cs b/Assets/Scripts/Game/Balls/OozeBall.cs index 672a242..599d6a3 100644 --- a/Assets/Scripts/Game/Balls/OozeBall.cs +++ b/Assets/Scripts/Game/Balls/OozeBall.cs @@ -29,7 +29,7 @@ public class OozeBall : MonoBehaviour { audioSource = GetComponent(); animator = GetComponent(); - speed = new Vector2(Random.Range(-0.005f, 0.005f), Random.Range(-0.005f, 0.005f)); + speed = new Vector2(Random.Range(-0.002f, 0.002f), Random.Range(-0.002f, 0.002f)); audioSource.PlayOneShot(spawnSound); } diff --git a/ProjectSettings/TagManager.asset b/ProjectSettings/TagManager.asset index 8dce2a8..7abfae5 100644 --- a/ProjectSettings/TagManager.asset +++ b/ProjectSettings/TagManager.asset @@ -6,6 +6,9 @@ TagManager: tags: - Wall - Ball + - BasicBall + - FruitBall + - OozeBall layers: - Default - TransparentFX