Made objects stick to rings
This commit is contained in:
@@ -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}
|
||||
|
||||
@@ -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) =>
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user