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_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}

View File

@@ -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) =>

View File

@@ -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;
}
}
}