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