diff --git a/Assets/Images.meta b/Assets/Images.meta new file mode 100644 index 0000000..0869f25 --- /dev/null +++ b/Assets/Images.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 3e98e9784b45f4a458500add6468a752 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Images/OrbRing.png b/Assets/Images/OrbRing.png new file mode 100644 index 0000000..2948e7d Binary files /dev/null and b/Assets/Images/OrbRing.png differ diff --git a/Assets/Images/OrbRing.png.meta b/Assets/Images/OrbRing.png.meta new file mode 100644 index 0000000..05da2c2 --- /dev/null +++ b/Assets/Images/OrbRing.png.meta @@ -0,0 +1,127 @@ +fileFormatVersion: 2 +guid: fb4bc5a0cfdd0764c993dbdcc33b97c7 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 2 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 256 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: WebGL + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 1537655665 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Prefabs.meta b/Assets/Prefabs.meta new file mode 100644 index 0000000..44a8308 --- /dev/null +++ b/Assets/Prefabs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 54d0352969708df48bbec1b2ebc476a5 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Prefabs/Ring.prefab b/Assets/Prefabs/Ring.prefab new file mode 100644 index 0000000..7b18e4d --- /dev/null +++ b/Assets/Prefabs/Ring.prefab @@ -0,0 +1,118 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &948790708724241901 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3163593764429408667} + - component: {fileID: 5367498319078075666} + m_Layer: 0 + m_Name: Sprite + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &3163593764429408667 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 948790708724241901} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1.025, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 5052103053041639182} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!212 &5367498319078075666 +SpriteRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 948790708724241901} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 0 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10754, guid: 0000000000000000f000000000000000, type: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 0 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_Sprite: {fileID: 21300000, guid: fb4bc5a0cfdd0764c993dbdcc33b97c7, type: 3} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_FlipX: 0 + m_FlipY: 0 + m_DrawMode: 0 + m_Size: {x: 2, y: 2} + m_AdaptiveModeThreshold: 0.5 + m_SpriteTileMode: 0 + m_WasSpriteAssigned: 1 + m_MaskInteraction: 0 + m_SpriteSortPoint: 0 +--- !u!1 &8276642441649562681 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5052103053041639182} + m_Layer: 0 + m_Name: Ring + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &5052103053041639182 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8276642441649562681} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 3163593764429408667} + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} diff --git a/Assets/Prefabs/Ring.prefab.meta b/Assets/Prefabs/Ring.prefab.meta new file mode 100644 index 0000000..b6d2b44 --- /dev/null +++ b/Assets/Prefabs/Ring.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 2b69b065f2beade4d91167a23508e29e +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scenes/SampleScene.unity b/Assets/Scenes/SampleScene.unity index 1b969d0..d892f7d 100644 --- a/Assets/Scenes/SampleScene.unity +++ b/Assets/Scenes/SampleScene.unity @@ -132,7 +132,6 @@ GameObject: m_Component: - component: {fileID: 104400498} - component: {fileID: 104400497} - - component: {fileID: 104400499} - component: {fileID: 104400501} - component: {fileID: 104400500} m_Layer: 0 @@ -169,20 +168,6 @@ Transform: m_Children: [] m_Father: {fileID: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &104400499 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 104400496} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: a035e66fabb459f48aa8f152b3d4f339, type: 3} - m_Name: - m_EditorClassIdentifier: - DistanceFromCentre: 0 - RadiusDistance: 0 --- !u!23 &104400500 MeshRenderer: m_ObjectHideFlags: 0 @@ -419,10 +404,59 @@ Transform: m_Children: [] m_Father: {fileID: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1827131555 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1827131557} + - component: {fileID: 1827131556} + m_Layer: 0 + m_Name: OrbitalSettings + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1827131556 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1827131555} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1b1a209741ad95946a6f0138e93431c4, type: 3} + m_Name: + m_EditorClassIdentifier: + m_RadiusSpeed: 4.72 + m_DistanceSpeed: 0.6 + m_GapDistance: 1 + m_RingPrefab: {fileID: 8276642441649562681, guid: 2b69b065f2beade4d91167a23508e29e, type: 3} +--- !u!4 &1827131557 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1827131555} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1660057539 &9223372036854775807 SceneRoots: m_ObjectHideFlags: 0 m_Roots: + - {fileID: 1827131557} - {fileID: 519420032} - {fileID: 104400498} - {fileID: 1486841468} diff --git a/Assets/Scripts/GlobalOrbitalSettings.cs b/Assets/Scripts/GlobalOrbitalSettings.cs new file mode 100644 index 0000000..1f9c624 --- /dev/null +++ b/Assets/Scripts/GlobalOrbitalSettings.cs @@ -0,0 +1,20 @@ +using UnityEngine; + +public class GlobalOrbitalSettings : MonoBehaviour +{ + private static GlobalOrbitalSettings Instance = null; + + [SerializeField, Range(0f, Mathf.PI * 2)] float m_RadiusSpeed = 2f; + public static float RadiusSpeed => Instance.m_RadiusSpeed; + + [SerializeField, Range(0f, 2f)] float m_DistanceSpeed = 0.6f; + public static float DistanceSpeed => Instance.m_DistanceSpeed; + + [SerializeField, Range(0f, 1f)] float m_GapDistance = 0.3f; + public static float GapDistance => Instance.m_GapDistance; + + [SerializeField] GameObject m_RingPrefab; + public static GameObject RingPrefab => Instance.m_RingPrefab; + + void Start() => Instance = this; +} diff --git a/Assets/Scripts/GlobalOrbitalSettings.cs.meta b/Assets/Scripts/GlobalOrbitalSettings.cs.meta new file mode 100644 index 0000000..37aaf0d --- /dev/null +++ b/Assets/Scripts/GlobalOrbitalSettings.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 1b1a209741ad95946a6f0138e93431c4 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/OrbitalPosition.cs b/Assets/Scripts/OrbitalPosition.cs index 67271ed..d21a9e0 100644 --- a/Assets/Scripts/OrbitalPosition.cs +++ b/Assets/Scripts/OrbitalPosition.cs @@ -1,11 +1,18 @@ using System.Collections.Generic; using UnityEngine; -public class OrbitalPosition : MonoBehaviour +public class OrbitalPosition { public float DistanceFromCentre = 0; public float RadiusDistance = 0; + public Transform owner = null; + + public OrbitalPosition(GameObject _owner) + { + owner = _owner.transform; + } + public Vector3 TranslateToVec3() => new ( x: DistanceFromCentre * Mathf.Cos(RadiusDistance), @@ -17,13 +24,11 @@ public class GlobalOrbitalPositionManager : MonoBehaviour { static GlobalOrbitalPositionManager s_Instance = null; private readonly List m_ObjectInstances = new(); + private readonly List m_Rings = new(); - [SerializeField, Range(0f, Mathf.PI * 2)] float m_RadiusSpeed = 2f; - [SerializeField, Range(0f, 2f)] float m_DistanceSpeed = 0.6f; - [SerializeField, Range(0f, 1f)] float m_GapDistance = 0.3f; + private float m_TimeOfLastRingSpawn = float.NegativeInfinity; - [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)] - private static void OnApplicationStart() + [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)] private static void OnApplicationStart() { GameObject manager = new("GLOBAL ORBITAL MANAGER"); DontDestroyOnLoad(manager); @@ -33,12 +38,39 @@ public class GlobalOrbitalPositionManager : MonoBehaviour public void Update() { + 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); + + m_TimeOfLastRingSpawn = Time.time; + } + foreach (OrbitalPosition orbitalPosition in m_ObjectInstances) { - orbitalPosition.DistanceFromCentre = Mathf.Clamp(orbitalPosition.DistanceFromCentre - (m_DistanceSpeed * Time.deltaTime * m_DistanceSpeed), 0f, float.PositiveInfinity); - orbitalPosition.RadiusDistance = (orbitalPosition.RadiusDistance + (m_RadiusSpeed * Time.deltaTime * m_RadiusSpeed)) % (Mathf.PI * 2); + orbitalPosition.DistanceFromCentre = Mathf.Clamp(orbitalPosition.DistanceFromCentre - (Time.deltaTime * GlobalOrbitalSettings.DistanceSpeed), 0f, float.PositiveInfinity); + orbitalPosition.RadiusDistance = (orbitalPosition.RadiusDistance + (Time.deltaTime * GlobalOrbitalSettings.RadiusSpeed)) % (Mathf.PI * 2); - orbitalPosition.gameObject.transform.position = orbitalPosition.TranslateToVec3(); + orbitalPosition.owner.position = orbitalPosition.TranslateToVec3(); + } + + List toRemove = new(); + foreach (Transform ring in m_Rings) + { + float diff = Time.deltaTime * GlobalOrbitalSettings.DistanceSpeed; + ring.localScale -= new Vector3(diff, diff, 0f); + + if (ring.localScale.x < 0) + { + toRemove.Add(ring); + } + } + + foreach (Transform ring in toRemove) + { + m_Rings.Remove(ring); + Destroy(ring.gameObject); } } @@ -47,19 +79,15 @@ public class GlobalOrbitalPositionManager : MonoBehaviour public static void UnregisterOrbitalPositionInstance(OrbitalPosition removedInstance) => s_Instance.m_ObjectInstances.Remove(removedInstance); - - public static float GetGapDistance() => - s_Instance.m_GapDistance; } -[RequireComponent(typeof(OrbitalPosition))] public abstract class OrbitalPositionBehaviour : MonoBehaviour { protected OrbitalPosition m_OrbitalPosition = null; private void Start() { - m_OrbitalPosition = GetComponent(); + m_OrbitalPosition = new OrbitalPosition(gameObject); GlobalOrbitalPositionManager.RegisterOrbitalPositionInstance(m_OrbitalPosition); OnStart(); diff --git a/Assets/Scripts/PlayerController.cs b/Assets/Scripts/PlayerController.cs index 193b751..2039d75 100644 --- a/Assets/Scripts/PlayerController.cs +++ b/Assets/Scripts/PlayerController.cs @@ -4,16 +4,18 @@ using UnityEngine; public class PlayerController : OrbitalPositionBehaviour { + float m_StartPosition; + public override void OnStart() { - m_OrbitalPosition.DistanceFromCentre = 4; + m_OrbitalPosition.DistanceFromCentre = m_StartPosition; } public void Update() { if (Input.GetKeyDown(KeyCode.Space)) { - m_OrbitalPosition.DistanceFromCentre += GlobalOrbitalPositionManager.GetGapDistance(); + m_OrbitalPosition.DistanceFromCentre += GlobalOrbitalSettings.GapDistance; } } }