From 9e66cf63d1b9e9edcb7377923d885817d720ed80 Mon Sep 17 00:00:00 2001 From: Pasha Bibko <156938226+PashaBibko@users.noreply.github.com> Date: Tue, 18 Nov 2025 14:37:09 +0000 Subject: [PATCH] Made objects stick to rings --- Assets/Scenes/SampleScene.unity | 2 +- Assets/Scripts/OrbitalPosition.cs | 57 ++++++++++++++++++++++-------- Assets/Scripts/PlayerController.cs | 3 +- 3 files changed, 46 insertions(+), 16 deletions(-) diff --git a/Assets/Scenes/SampleScene.unity b/Assets/Scenes/SampleScene.unity index d892f7d..4d3d1f6 100644 --- a/Assets/Scenes/SampleScene.unity +++ b/Assets/Scenes/SampleScene.unity @@ -433,7 +433,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 1b1a209741ad95946a6f0138e93431c4, type: 3} m_Name: m_EditorClassIdentifier: - m_RadiusSpeed: 4.72 + m_RadiusSpeed: 2 m_DistanceSpeed: 0.6 m_GapDistance: 1 m_RingPrefab: {fileID: 8276642441649562681, guid: 2b69b065f2beade4d91167a23508e29e, type: 3} diff --git a/Assets/Scripts/OrbitalPosition.cs b/Assets/Scripts/OrbitalPosition.cs index d21a9e0..b396300 100644 --- a/Assets/Scripts/OrbitalPosition.cs +++ b/Assets/Scripts/OrbitalPosition.cs @@ -1,8 +1,10 @@ +using System; using System.Collections.Generic; using UnityEngine; public class OrbitalPosition { + public Int64 pRing = 0; public float DistanceFromCentre = 0; public float RadiusDistance = 0; @@ -10,6 +12,7 @@ public class OrbitalPosition public OrbitalPosition(GameObject _owner) { + pRing = GlobalOrbitalPositionManager.LastRingID; owner = _owner.transform; } @@ -20,14 +23,25 @@ public class OrbitalPosition ); } +public class Ring : MonoBehaviour +{ + public Int64 ID; +} + public class GlobalOrbitalPositionManager : MonoBehaviour { static GlobalOrbitalPositionManager s_Instance = null; private readonly List m_ObjectInstances = new(); - private readonly List m_Rings = new(); + private readonly List m_Rings = new(); + private readonly Dictionary m_Distances = new(); private float m_TimeOfLastRingSpawn = float.NegativeInfinity; + private Int64 m_LastGeneratedRing = 0; + public static Int64 LastRingID => s_Instance.m_LastGeneratedRing; + + public static float GetDistanceOf(Int64 rowID) => s_Instance.m_Distances[rowID]; + [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)] private static void OnApplicationStart() { GameObject manager = new("GLOBAL ORBITAL MANAGER"); @@ -41,37 +55,52 @@ public class GlobalOrbitalPositionManager : MonoBehaviour 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); + Ring ring = newRing.AddComponent(); + ring.ID = m_LastGeneratedRing + 1; + m_Rings.Add(ring); + + m_LastGeneratedRing = ring.ID; + m_TimeOfLastRingSpawn = Time.time; } - foreach (OrbitalPosition orbitalPosition in m_ObjectInstances) - { - orbitalPosition.DistanceFromCentre = Mathf.Clamp(orbitalPosition.DistanceFromCentre - (Time.deltaTime * GlobalOrbitalSettings.DistanceSpeed), 0f, float.PositiveInfinity); - orbitalPosition.RadiusDistance = (orbitalPosition.RadiusDistance + (Time.deltaTime * GlobalOrbitalSettings.RadiusSpeed)) % (Mathf.PI * 2); + List toRemove = new(); + int index = 0; + m_Distances.Clear(); - orbitalPosition.owner.position = orbitalPosition.TranslateToVec3(); - } - - List toRemove = new(); - foreach (Transform ring in m_Rings) + foreach (Ring ring in m_Rings) { float diff = Time.deltaTime * GlobalOrbitalSettings.DistanceSpeed; - ring.localScale -= new Vector3(diff, diff, 0f); + ring.transform.localScale -= new Vector3(diff, diff, 0f); - if (ring.localScale.x < 0) + if (ring.transform.localScale.x < 0) { toRemove.Add(ring); } + + m_Distances[ring.ID] = ring.transform.localScale.x; + index++; } - foreach (Transform ring in toRemove) + foreach (Ring ring in toRemove) { m_Rings.Remove(ring); Destroy(ring.gameObject); } + + foreach (OrbitalPosition orbitalPosition in m_ObjectInstances) + { + if (!m_Distances.ContainsKey(orbitalPosition.pRing)) + orbitalPosition.pRing = m_LastGeneratedRing; + + float distance = m_Distances[orbitalPosition.pRing]; + orbitalPosition.DistanceFromCentre = distance; + orbitalPosition.RadiusDistance = (orbitalPosition.RadiusDistance + (Time.deltaTime * GlobalOrbitalSettings.RadiusSpeed)) % (Mathf.PI * 2); + + orbitalPosition.owner.position = orbitalPosition.TranslateToVec3(); + } } public static void RegisterOrbitalPositionInstance(OrbitalPosition newInstance) => diff --git a/Assets/Scripts/PlayerController.cs b/Assets/Scripts/PlayerController.cs index 2039d75..1ef3608 100644 --- a/Assets/Scripts/PlayerController.cs +++ b/Assets/Scripts/PlayerController.cs @@ -1,5 +1,6 @@ using System.Collections; using System.Collections.Generic; +using UnityEditor; using UnityEngine; public class PlayerController : OrbitalPositionBehaviour @@ -15,7 +16,7 @@ public class PlayerController : OrbitalPositionBehaviour { if (Input.GetKeyDown(KeyCode.Space)) { - m_OrbitalPosition.DistanceFromCentre += GlobalOrbitalSettings.GapDistance; + m_OrbitalPosition.pRing += 1; } } }