Made objects stick to rings

This commit is contained in:
Pasha Bibko
2025-11-18 14:37:09 +00:00
parent 2dc9c1e389
commit 9e66cf63d1
3 changed files with 46 additions and 16 deletions

View File

@@ -433,7 +433,7 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 1b1a209741ad95946a6f0138e93431c4, type: 3} m_Script: {fileID: 11500000, guid: 1b1a209741ad95946a6f0138e93431c4, type: 3}
m_Name: m_Name:
m_EditorClassIdentifier: m_EditorClassIdentifier:
m_RadiusSpeed: 4.72 m_RadiusSpeed: 2
m_DistanceSpeed: 0.6 m_DistanceSpeed: 0.6
m_GapDistance: 1 m_GapDistance: 1
m_RingPrefab: {fileID: 8276642441649562681, guid: 2b69b065f2beade4d91167a23508e29e, type: 3} m_RingPrefab: {fileID: 8276642441649562681, guid: 2b69b065f2beade4d91167a23508e29e, type: 3}

View File

@@ -1,8 +1,10 @@
using System;
using System.Collections.Generic; using System.Collections.Generic;
using UnityEngine; using UnityEngine;
public class OrbitalPosition public class OrbitalPosition
{ {
public Int64 pRing = 0;
public float DistanceFromCentre = 0; public float DistanceFromCentre = 0;
public float RadiusDistance = 0; public float RadiusDistance = 0;
@@ -10,6 +12,7 @@ public class OrbitalPosition
public OrbitalPosition(GameObject _owner) public OrbitalPosition(GameObject _owner)
{ {
pRing = GlobalOrbitalPositionManager.LastRingID;
owner = _owner.transform; owner = _owner.transform;
} }
@@ -20,14 +23,25 @@ public class OrbitalPosition
); );
} }
public class Ring : MonoBehaviour
{
public Int64 ID;
}
public class GlobalOrbitalPositionManager : MonoBehaviour public class GlobalOrbitalPositionManager : MonoBehaviour
{ {
static GlobalOrbitalPositionManager s_Instance = null; static GlobalOrbitalPositionManager s_Instance = null;
private readonly List<OrbitalPosition> m_ObjectInstances = new(); private readonly List<OrbitalPosition> m_ObjectInstances = new();
private readonly List<Transform> m_Rings = new(); private readonly List<Ring> m_Rings = new();
private readonly Dictionary<Int64, float> m_Distances = new();
private float m_TimeOfLastRingSpawn = float.NegativeInfinity; 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() [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)] private static void OnApplicationStart()
{ {
GameObject manager = new("GLOBAL ORBITAL MANAGER"); GameObject manager = new("GLOBAL ORBITAL MANAGER");
@@ -41,37 +55,52 @@ public class GlobalOrbitalPositionManager : MonoBehaviour
if (Time.time - m_TimeOfLastRingSpawn > GlobalOrbitalSettings.GapDistance) if (Time.time - m_TimeOfLastRingSpawn > GlobalOrbitalSettings.GapDistance)
{ {
GameObject newRing = Instantiate(GlobalOrbitalSettings.RingPrefab); GameObject newRing = Instantiate(GlobalOrbitalSettings.RingPrefab);
m_Rings.Add(newRing.transform);
newRing.transform.localScale = new Vector3(10f, 10f, 1); newRing.transform.localScale = new Vector3(10f, 10f, 1);
Ring ring = newRing.AddComponent<Ring>();
ring.ID = m_LastGeneratedRing + 1;
m_Rings.Add(ring);
m_LastGeneratedRing = ring.ID;
m_TimeOfLastRingSpawn = Time.time; m_TimeOfLastRingSpawn = Time.time;
} }
foreach (OrbitalPosition orbitalPosition in m_ObjectInstances) List<Ring> toRemove = new();
{ int index = 0;
orbitalPosition.DistanceFromCentre = Mathf.Clamp(orbitalPosition.DistanceFromCentre - (Time.deltaTime * GlobalOrbitalSettings.DistanceSpeed), 0f, float.PositiveInfinity); m_Distances.Clear();
orbitalPosition.RadiusDistance = (orbitalPosition.RadiusDistance + (Time.deltaTime * GlobalOrbitalSettings.RadiusSpeed)) % (Mathf.PI * 2);
orbitalPosition.owner.position = orbitalPosition.TranslateToVec3(); foreach (Ring ring in m_Rings)
}
List<Transform> toRemove = new();
foreach (Transform ring in m_Rings)
{ {
float diff = Time.deltaTime * GlobalOrbitalSettings.DistanceSpeed; 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); 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); m_Rings.Remove(ring);
Destroy(ring.gameObject); 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) => public static void RegisterOrbitalPositionInstance(OrbitalPosition newInstance) =>

View File

@@ -1,5 +1,6 @@
using System.Collections; using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
using UnityEditor;
using UnityEngine; using UnityEngine;
public class PlayerController : OrbitalPositionBehaviour public class PlayerController : OrbitalPositionBehaviour
@@ -15,7 +16,7 @@ public class PlayerController : OrbitalPositionBehaviour
{ {
if (Input.GetKeyDown(KeyCode.Space)) if (Input.GetKeyDown(KeyCode.Space))
{ {
m_OrbitalPosition.DistanceFromCentre += GlobalOrbitalSettings.GapDistance; m_OrbitalPosition.pRing += 1;
} }
} }
} }