Made player mods affect the player

This commit is contained in:
Pasha Bibko
2025-11-27 13:34:55 +00:00
parent 055e688df5
commit 886622cd6c
7 changed files with 257 additions and 10 deletions

View File

@@ -1,9 +1,25 @@
using System.Collections.Generic;
using UnityEngine;
public class EnemyController : OrbitalPositionBehaviour
{
private static readonly List<EnemyController> s_Instances = new();
public static void KillAllEnemies()
{
foreach (EnemyController controller in s_Instances)
{
Destroy(controller.gameObject);
PlayerController.s_PlayerScore++;
}
s_Instances.Clear();
}
protected override void OnStart()
{
s_Instances.Add(this);
transform.position = new Vector3(0, 0, -200f);
m_OrbitalPosition.m_DistanceAlongRadius = Random.Range(0f, Mathf.PI * 2f);
@@ -13,9 +29,10 @@ public class EnemyController : OrbitalPositionBehaviour
public override void OnReachCentre()
{
if (GlobalOrbitalPositionManager.IsSimulationRunning)
if (GlobalOrbitalPositionManager.s_IsSimulationRunning)
PlayerController.s_PlayerScore++;
s_Instances.Remove(this);
Destroy(gameObject);
}
}

View File

@@ -35,12 +35,14 @@ public class Ring : MonoBehaviour
public class GlobalOrbitalPositionManager : MonoBehaviour
{
private static GlobalOrbitalPositionManager s_Instance = null;
private static GlobalOrbitalPositionManager s_Instance;
public static GlobalOrbitalPositionManager Instance => s_Instance;
private readonly List<OrbitalPosition> m_ObjectInstances = new();
private readonly List<Ring> m_Rings = new();
private readonly Dictionary<int, float> m_Distances = new();
public static bool IsSimulationRunning = true;
public static bool s_IsSimulationRunning = true;
private OrbitalPosition m_PlayerOrbitalPosition;
public static void SetPlayer(OrbitalPosition player) => s_Instance.m_PlayerOrbitalPosition = player;
@@ -60,6 +62,15 @@ public class GlobalOrbitalPositionManager : MonoBehaviour
private bool m_CurrentRingAllowsSpawning;
private Vector3[] m_PrecalculatedPositions;
public IEnumerator StartPlayerSpeedupModifier()
{
m_LocalDeltaTimeScale *= 2f;
yield return new WaitForSeconds(10f);
m_LocalDeltaTimeScale /= 2f;
}
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)] private static void OnApplicationStart()
{
@@ -84,7 +95,7 @@ public class GlobalOrbitalPositionManager : MonoBehaviour
private static IEnumerator RestartSimulationInternal()
{
IsSimulationRunning = false;
s_IsSimulationRunning = false;
s_Instance.m_LocalDeltaTimeScale = 7f;
AllowPlayerInput = false;
@@ -106,7 +117,7 @@ public class GlobalOrbitalPositionManager : MonoBehaviour
AllowPlayerInput = true;
s_Instance.m_LocalDeltaTimeScale = 1f;
IsSimulationRunning = true;
s_IsSimulationRunning = true;
}
public static void RestartSimulation() => s_Instance.StartCoroutine(RestartSimulationInternal());
@@ -160,7 +171,7 @@ public class GlobalOrbitalPositionManager : MonoBehaviour
Color c = Color.Lerp(Color.black, Color.white, Mathf.Clamp01(lerp));
if (ring.transform.localScale.x < 0.5f)
{
if (IsSimulationRunning)
if (s_IsSimulationRunning)
PlayerController.s_PlayerScore++;
toRemove.Add(ring);

View File

@@ -1,4 +1,5 @@
using System;
using System.Collections;
using UnityEngine;
using UnityEngine.UI;
@@ -14,9 +15,15 @@ public class PlayerController : OrbitalPositionBehaviour
private Vector3 m_SuicidePoint;
private bool m_KillingItself;
private float m_DeathLerp;
private bool m_HasFreeHitActive;
private bool m_HasInvicibility;
public MeshRenderer m_Renderer;
public Text m_ScoreText;
[Header("References")]
[SerializeField] private MeshRenderer m_Renderer;
[SerializeField] private Text m_ScoreText;
[SerializeField] private Material m_DefaultMaterial;
[SerializeField] private Material m_FreeHitMaterial;
protected override void OnStart()
{
@@ -37,6 +44,11 @@ public class PlayerController : OrbitalPositionBehaviour
m_ScoreText.color = Color.yellow;
else
m_ScoreText.color = Color.white;
if (m_HasFreeHitActive)
m_Renderer.material = m_FreeHitMaterial;
else
m_Renderer.material = m_DefaultMaterial;
if (GlobalInput.IsScreenClicked && GlobalOrbitalPositionManager.AllowPlayerInput)
{
@@ -50,6 +62,43 @@ public class PlayerController : OrbitalPositionBehaviour
m_DeathLerp += Time.deltaTime;
}
private IEnumerator OnGrowPlayerModifier()
{
transform.localScale *= 1.5f;
m_OrbitalPosition.m_ObjectRadius *= 1.5f;
yield return new WaitForSecondsRealtime(5f);
transform.localScale /= 1.5f;
m_OrbitalPosition.m_ObjectRadius /= 1.5f;
}
private IEnumerator OnShrinkPlayerModifier()
{
transform.localScale *= 0.6f;
m_OrbitalPosition.m_ObjectRadius *= 0.6f;
yield return new WaitForSecondsRealtime(5f);
transform.localScale /= 0.6f;
m_OrbitalPosition.m_ObjectRadius /= 0.6f;
}
private IEnumerator OnSpeedUpModifier()
{
yield return null;
}
private IEnumerator TriggerInvicibility()
{
m_HasFreeHitActive = false;
m_HasInvicibility = true;
yield return new WaitForSecondsRealtime(1f);
m_HasInvicibility = false;
}
public override void OnCollision(OrbitalPositionBehaviour other)
{
if (!m_OrbitalPosition.m_IsAttachedToRings)
@@ -57,6 +106,17 @@ public class PlayerController : OrbitalPositionBehaviour
if (other.CompareTag("Enemy"))
{
if (m_HasInvicibility)
{
return;
}
if (m_HasFreeHitActive)
{
StartCoroutine(TriggerInvicibility());
return;
}
GlobalOrbitalPositionManager.RestartSimulation();
m_SuicidePoint = transform.position;
m_KillingItself = true;
@@ -65,7 +125,38 @@ public class PlayerController : OrbitalPositionBehaviour
else if (other.CompareTag("PlayerMod"))
{
other.OnCollision(this);
Debug.Log($"Collision with player mod [{((PlayerModifier)other).HeldModifier}]");
switch (((PlayerModifier)other).HeldModifier)
{
case PlayerModifier.Modifier.GainPoints:
s_PlayerScore += 100;
break;
case PlayerModifier.Modifier.FreeHit:
m_HasFreeHitActive = true;
break;
case PlayerModifier.Modifier.GrowPlayer:
StartCoroutine(OnGrowPlayerModifier());
break;
case PlayerModifier.Modifier.ShrinkPlayer:
StartCoroutine(OnShrinkPlayerModifier());
break;
case PlayerModifier.Modifier.SpeedUp:
StartCoroutine(GlobalOrbitalPositionManager.Instance.StartPlayerSpeedupModifier());
break;
case PlayerModifier.Modifier.ClearAllEnemies:
EnemyController.KillAllEnemies();
break;
default:
Debug.Log($"Collision with unknown modifier occured [{((PlayerModifier)other).HeldModifier}]");
break;
}
Debug.Log("Collided with player mod");
}

View File

@@ -1,7 +1,32 @@
using System;
using UnityEngine;
using Random = UnityEngine.Random;
public class PlayerModifier : OrbitalPositionBehaviour
{
public enum Modifier
{
GainPoints,
FreeHit,
GrowPlayer,
ShrinkPlayer,
ClearAllEnemies,
SpeedUp
}
private static readonly System.Random s_RandomGenerator = new();
private static Modifier GetRandomModifier()
{
return Modifier.SpeedUp;
Array possibilities = Enum.GetValues(typeof(Modifier));
return (Modifier)possibilities.GetValue(s_RandomGenerator.Next(possibilities.Length));
}
private Modifier m_Modifier;
public Modifier HeldModifier => m_Modifier;
protected override void OnStart()
{
transform.position = new Vector3(0, 0, -100f);
@@ -9,6 +34,8 @@ public class PlayerModifier : OrbitalPositionBehaviour
m_OrbitalPosition.m_DistanceAlongRadius = Random.Range(0f, Mathf.PI * 2f);
m_OrbitalPosition.m_ObjectRadius = 0.3f;
m_OrbitalPosition.m_SpinSpeed = 1.6f;
m_Modifier = GetRandomModifier();
}
public override void OnReachCentre() => Destroy(gameObject);