Added rings

They do not move with the player correctly
This commit is contained in:
Pasha Bibko
2025-11-18 13:46:48 +00:00
parent 3b4d0736dc
commit 2dc9c1e389
11 changed files with 394 additions and 31 deletions

View File

@@ -0,0 +1,20 @@
using UnityEngine;
public class GlobalOrbitalSettings : MonoBehaviour
{
private static GlobalOrbitalSettings Instance = null;
[SerializeField, Range(0f, Mathf.PI * 2)] float m_RadiusSpeed = 2f;
public static float RadiusSpeed => Instance.m_RadiusSpeed;
[SerializeField, Range(0f, 2f)] float m_DistanceSpeed = 0.6f;
public static float DistanceSpeed => Instance.m_DistanceSpeed;
[SerializeField, Range(0f, 1f)] float m_GapDistance = 0.3f;
public static float GapDistance => Instance.m_GapDistance;
[SerializeField] GameObject m_RingPrefab;
public static GameObject RingPrefab => Instance.m_RingPrefab;
void Start() => Instance = this;
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 1b1a209741ad95946a6f0138e93431c4
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,11 +1,18 @@
using System.Collections.Generic;
using UnityEngine;
public class OrbitalPosition : MonoBehaviour
public class OrbitalPosition
{
public float DistanceFromCentre = 0;
public float RadiusDistance = 0;
public Transform owner = null;
public OrbitalPosition(GameObject _owner)
{
owner = _owner.transform;
}
public Vector3 TranslateToVec3() => new
(
x: DistanceFromCentre * Mathf.Cos(RadiusDistance),
@@ -17,13 +24,11 @@ public class GlobalOrbitalPositionManager : MonoBehaviour
{
static GlobalOrbitalPositionManager s_Instance = null;
private readonly List<OrbitalPosition> m_ObjectInstances = new();
private readonly List<Transform> m_Rings = new();
[SerializeField, Range(0f, Mathf.PI * 2)] float m_RadiusSpeed = 2f;
[SerializeField, Range(0f, 2f)] float m_DistanceSpeed = 0.6f;
[SerializeField, Range(0f, 1f)] float m_GapDistance = 0.3f;
private float m_TimeOfLastRingSpawn = float.NegativeInfinity;
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]
private static void OnApplicationStart()
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)] private static void OnApplicationStart()
{
GameObject manager = new("GLOBAL ORBITAL MANAGER");
DontDestroyOnLoad(manager);
@@ -33,12 +38,39 @@ public class GlobalOrbitalPositionManager : MonoBehaviour
public void Update()
{
if (Time.time - m_TimeOfLastRingSpawn > GlobalOrbitalSettings.GapDistance)
{
GameObject newRing = Instantiate(GlobalOrbitalSettings.RingPrefab);
m_Rings.Add(newRing.transform);
newRing.transform.localScale = new Vector3(10f, 10f, 1);
m_TimeOfLastRingSpawn = Time.time;
}
foreach (OrbitalPosition orbitalPosition in m_ObjectInstances)
{
orbitalPosition.DistanceFromCentre = Mathf.Clamp(orbitalPosition.DistanceFromCentre - (m_DistanceSpeed * Time.deltaTime * m_DistanceSpeed), 0f, float.PositiveInfinity);
orbitalPosition.RadiusDistance = (orbitalPosition.RadiusDistance + (m_RadiusSpeed * Time.deltaTime * m_RadiusSpeed)) % (Mathf.PI * 2);
orbitalPosition.DistanceFromCentre = Mathf.Clamp(orbitalPosition.DistanceFromCentre - (Time.deltaTime * GlobalOrbitalSettings.DistanceSpeed), 0f, float.PositiveInfinity);
orbitalPosition.RadiusDistance = (orbitalPosition.RadiusDistance + (Time.deltaTime * GlobalOrbitalSettings.RadiusSpeed)) % (Mathf.PI * 2);
orbitalPosition.gameObject.transform.position = orbitalPosition.TranslateToVec3();
orbitalPosition.owner.position = orbitalPosition.TranslateToVec3();
}
List<Transform> toRemove = new();
foreach (Transform ring in m_Rings)
{
float diff = Time.deltaTime * GlobalOrbitalSettings.DistanceSpeed;
ring.localScale -= new Vector3(diff, diff, 0f);
if (ring.localScale.x < 0)
{
toRemove.Add(ring);
}
}
foreach (Transform ring in toRemove)
{
m_Rings.Remove(ring);
Destroy(ring.gameObject);
}
}
@@ -47,19 +79,15 @@ public class GlobalOrbitalPositionManager : MonoBehaviour
public static void UnregisterOrbitalPositionInstance(OrbitalPosition removedInstance) =>
s_Instance.m_ObjectInstances.Remove(removedInstance);
public static float GetGapDistance() =>
s_Instance.m_GapDistance;
}
[RequireComponent(typeof(OrbitalPosition))]
public abstract class OrbitalPositionBehaviour : MonoBehaviour
{
protected OrbitalPosition m_OrbitalPosition = null;
private void Start()
{
m_OrbitalPosition = GetComponent<OrbitalPosition>();
m_OrbitalPosition = new OrbitalPosition(gameObject);
GlobalOrbitalPositionManager.RegisterOrbitalPositionInstance(m_OrbitalPosition);
OnStart();

View File

@@ -4,16 +4,18 @@ using UnityEngine;
public class PlayerController : OrbitalPositionBehaviour
{
float m_StartPosition;
public override void OnStart()
{
m_OrbitalPosition.DistanceFromCentre = 4;
m_OrbitalPosition.DistanceFromCentre = m_StartPosition;
}
public void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
m_OrbitalPosition.DistanceFromCentre += GlobalOrbitalPositionManager.GetGapDistance();
m_OrbitalPosition.DistanceFromCentre += GlobalOrbitalSettings.GapDistance;
}
}
}