Made objects stick to rings
This commit is contained in:
@@ -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<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 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>();
|
||||
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<Ring> toRemove = new();
|
||||
int index = 0;
|
||||
m_Distances.Clear();
|
||||
|
||||
orbitalPosition.owner.position = orbitalPosition.TranslateToVec3();
|
||||
}
|
||||
|
||||
List<Transform> 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) =>
|
||||
|
||||
Reference in New Issue
Block a user