From a75f8a7a6a52e39a561bc9cfed43ceb347ef24d6 Mon Sep 17 00:00:00 2001 From: Jeremy Smitherman Date: Fri, 24 Apr 2026 12:48:50 -0500 Subject: [PATCH 1/3] added state machine --- .idea/.idea.SpringJam2026/.idea/workspace.xml | 8 +++--- Assets/Scripts/State.meta | 8 ++++++ Assets/Scripts/State/GameState.cs | 17 ++++++++++++ Assets/Scripts/State/GameState.cs.meta | 2 ++ Assets/Scripts/State/Machine.cs | 26 +++++++++++++++++++ Assets/Scripts/State/Machine.cs.meta | 2 ++ 6 files changed, 58 insertions(+), 5 deletions(-) create mode 100644 Assets/Scripts/State.meta create mode 100644 Assets/Scripts/State/GameState.cs create mode 100644 Assets/Scripts/State/GameState.cs.meta create mode 100644 Assets/Scripts/State/Machine.cs create mode 100644 Assets/Scripts/State/Machine.cs.meta diff --git a/.idea/.idea.SpringJam2026/.idea/workspace.xml b/.idea/.idea.SpringJam2026/.idea/workspace.xml index 232051c..03da7ee 100644 --- a/.idea/.idea.SpringJam2026/.idea/workspace.xml +++ b/.idea/.idea.SpringJam2026/.idea/workspace.xml @@ -5,9 +5,7 @@ - - - + diff --git a/Assets/Scripts/State.meta b/Assets/Scripts/State.meta new file mode 100644 index 0000000..3d13d18 --- /dev/null +++ b/Assets/Scripts/State.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 67f88045e5c39dd42af3559790c4c117 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/State/GameState.cs b/Assets/Scripts/State/GameState.cs new file mode 100644 index 0000000..46d3300 --- /dev/null +++ b/Assets/Scripts/State/GameState.cs @@ -0,0 +1,17 @@ +using UnityEngine; + +namespace State +{ + public class GameState + { + protected Machine StateMachine; + public virtual void OnEnter(Machine machine) + { + StateMachine = machine; + } + + public virtual void OnExit() {} + public virtual void OnUpdate(float deltaTime) {} + public virtual void OnFixedUpdate(float deltaTime) {} + } +} diff --git a/Assets/Scripts/State/GameState.cs.meta b/Assets/Scripts/State/GameState.cs.meta new file mode 100644 index 0000000..ae58e8e --- /dev/null +++ b/Assets/Scripts/State/GameState.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: aece5e36c5691b84592b559518dc979c \ No newline at end of file diff --git a/Assets/Scripts/State/Machine.cs b/Assets/Scripts/State/Machine.cs new file mode 100644 index 0000000..b28ffea --- /dev/null +++ b/Assets/Scripts/State/Machine.cs @@ -0,0 +1,26 @@ +using UnityEngine; + +namespace State +{ + public class Machine : MonoBehaviour + { + private GameState _currentState; + + public void Update() + { + _currentState?.OnUpdate(Time.deltaTime); + } + + public void FixedUpdate() + { + _currentState?.OnFixedUpdate(Time.fixedDeltaTime); + } + + public void ChangeState(GameState newState) + { + _currentState?.OnExit(); + _currentState = newState; + _currentState.OnEnter(this); + } + } +} diff --git a/Assets/Scripts/State/Machine.cs.meta b/Assets/Scripts/State/Machine.cs.meta new file mode 100644 index 0000000..9cf93a7 --- /dev/null +++ b/Assets/Scripts/State/Machine.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: c58c43f9d69af404f997461c6348049d \ No newline at end of file -- 2.40.1 From 5091983da64c87f933a9f6172aedbdc960bdce08 Mon Sep 17 00:00:00 2001 From: Jeremy Smitherman Date: Fri, 24 Apr 2026 13:28:52 -0500 Subject: [PATCH 2/3] Added basic state bootstrapping and a lot of comments --- .idea/.idea.SpringJam2026/.idea/workspace.xml | 14 +- Assets/Scenes/Bootstrap.unity | 14 + Assets/Scenes/MainMenu.unity | 319 ++ Assets/Scenes/MainMenu.unity.meta | 7 + Assets/Scripts/Management/BGM.cs | 14 + Assets/Scripts/Management/Bootstrap.cs | 76 + Assets/Scripts/Management/Bootstrap.cs.meta | 2 + Assets/Scripts/Management/SFX.cs | 16 + Assets/Scripts/Management/Services.cs | 12 + Assets/Scripts/State/Game.meta | 3 + Assets/Scripts/State/Game/MainMenuState.cs | 14 + .../Scripts/State/Game/MainMenuState.cs.meta | 3 + Assets/Scripts/State/GameState.cs | 10 + Assets/Scripts/State/Machine.cs | 8 +- Assets/UI Toolkit.meta | 8 + Assets/UI Toolkit/PanelSettings.asset | 52 + Assets/UI Toolkit/PanelSettings.asset.meta | 8 + Assets/UI Toolkit/UnityThemes.meta | 8 + .../UnityThemes/UnityDefaultRuntimeTheme.tss | 1 + .../UnityDefaultRuntimeTheme.tss.meta | 12 + Assets/UI.meta | 8 + Assets/UI/Main.uss | 6 + Assets/UI/Main.uss.meta | 12 + Assets/UI/MainMenu.uxml | 8 + Assets/UI/MainMenu.uxml.meta | 10 + ProjectSettings/EditorBuildSettings.asset | 3 + UIElementsSchema/UIElements.xsd | 34 + .../Unity.Multiplayer.PlayMode.Editor.xsd | 50 + .../Unity.Profiling.Editor.UI.xsd | 142 + UIElementsSchema/Unity.Profiling.Editor.xsd | 130 + UIElementsSchema/Unity.UI.Builder.xsd | 2762 +++++++++++++++++ UIElementsSchema/Unity.UIToolkit.Editor.xsd | 126 + .../UnityEditor.Accessibility.xsd | 121 + .../UnityEditor.Audio.UIElements.xsd | 101 + .../UnityEditor.Experimental.GraphView.xsd | 75 + ...r.Inspector.GraphicsSettingsInspectors.xsd | 27 + UIElementsSchema/UnityEditor.Inspector.xsd | 31 + UIElementsSchema/UnityEditor.Overlays.xsd | 130 + ...UnityEditor.PackageManager.UI.Internal.xsd | 970 ++++++ UIElementsSchema/UnityEditor.Rendering.xsd | 82 + UIElementsSchema/UnityEditor.Search.xsd | 31 + .../UnityEditor.ShaderGraph.Drawing.xsd | 97 + .../UnityEditor.ShortcutManagement.xsd | 52 + .../UnityEditor.Tilemaps.External.xsd | 38 + UIElementsSchema/UnityEditor.Tilemaps.xsd | 364 +++ UIElementsSchema/UnityEditor.Toolbars.xsd | 37 + ...itor.U2D.Animation.SpriteLibraryEditor.xsd | 177 ++ .../UnityEditor.U2D.Animation.Upgrading.xsd | 30 + .../UnityEditor.U2D.Animation.xsd | 395 +++ UIElementsSchema/UnityEditor.U2D.Layout.xsd | 73 + ...ityEditor.U2D.Sprites.SpriteEditorTool.xsd | 27 + ...2D.Tooling.Analyzer.UIElement.OKCancel.xsd | 27 + ...yEditor.U2D.Tooling.Analyzer.UIElement.xsd | 107 + .../UnityEditor.U2D.Tooling.Analyzer.xsd | 122 + .../UnityEditor.UIElements.Debugger.xsd | 28 + ...UnityEditor.UIElements.ProjectSettings.xsd | 127 + UIElementsSchema/UnityEditor.UIElements.xsd | 793 +++++ UIElementsSchema/UnityEngine.UIElements.xsd | 2495 +++++++++++++++ 58 files changed, 10445 insertions(+), 4 deletions(-) create mode 100644 Assets/Scenes/MainMenu.unity create mode 100644 Assets/Scenes/MainMenu.unity.meta create mode 100644 Assets/Scripts/Management/Bootstrap.cs create mode 100644 Assets/Scripts/Management/Bootstrap.cs.meta create mode 100644 Assets/Scripts/State/Game.meta create mode 100644 Assets/Scripts/State/Game/MainMenuState.cs create mode 100644 Assets/Scripts/State/Game/MainMenuState.cs.meta create mode 100644 Assets/UI Toolkit.meta create mode 100644 Assets/UI Toolkit/PanelSettings.asset create mode 100644 Assets/UI Toolkit/PanelSettings.asset.meta create mode 100644 Assets/UI Toolkit/UnityThemes.meta create mode 100644 Assets/UI Toolkit/UnityThemes/UnityDefaultRuntimeTheme.tss create mode 100644 Assets/UI Toolkit/UnityThemes/UnityDefaultRuntimeTheme.tss.meta create mode 100644 Assets/UI.meta create mode 100644 Assets/UI/Main.uss create mode 100644 Assets/UI/Main.uss.meta create mode 100644 Assets/UI/MainMenu.uxml create mode 100644 Assets/UI/MainMenu.uxml.meta create mode 100644 UIElementsSchema/UIElements.xsd create mode 100644 UIElementsSchema/Unity.Multiplayer.PlayMode.Editor.xsd create mode 100644 UIElementsSchema/Unity.Profiling.Editor.UI.xsd create mode 100644 UIElementsSchema/Unity.Profiling.Editor.xsd create mode 100644 UIElementsSchema/Unity.UI.Builder.xsd create mode 100644 UIElementsSchema/Unity.UIToolkit.Editor.xsd create mode 100644 UIElementsSchema/UnityEditor.Accessibility.xsd create mode 100644 UIElementsSchema/UnityEditor.Audio.UIElements.xsd create mode 100644 UIElementsSchema/UnityEditor.Experimental.GraphView.xsd create mode 100644 UIElementsSchema/UnityEditor.Inspector.GraphicsSettingsInspectors.xsd create mode 100644 UIElementsSchema/UnityEditor.Inspector.xsd create mode 100644 UIElementsSchema/UnityEditor.Overlays.xsd create mode 100644 UIElementsSchema/UnityEditor.PackageManager.UI.Internal.xsd create mode 100644 UIElementsSchema/UnityEditor.Rendering.xsd create mode 100644 UIElementsSchema/UnityEditor.Search.xsd create mode 100644 UIElementsSchema/UnityEditor.ShaderGraph.Drawing.xsd create mode 100644 UIElementsSchema/UnityEditor.ShortcutManagement.xsd create mode 100644 UIElementsSchema/UnityEditor.Tilemaps.External.xsd create mode 100644 UIElementsSchema/UnityEditor.Tilemaps.xsd create mode 100644 UIElementsSchema/UnityEditor.Toolbars.xsd create mode 100644 UIElementsSchema/UnityEditor.U2D.Animation.SpriteLibraryEditor.xsd create mode 100644 UIElementsSchema/UnityEditor.U2D.Animation.Upgrading.xsd create mode 100644 UIElementsSchema/UnityEditor.U2D.Animation.xsd create mode 100644 UIElementsSchema/UnityEditor.U2D.Layout.xsd create mode 100644 UIElementsSchema/UnityEditor.U2D.Sprites.SpriteEditorTool.xsd create mode 100644 UIElementsSchema/UnityEditor.U2D.Tooling.Analyzer.UIElement.OKCancel.xsd create mode 100644 UIElementsSchema/UnityEditor.U2D.Tooling.Analyzer.UIElement.xsd create mode 100644 UIElementsSchema/UnityEditor.U2D.Tooling.Analyzer.xsd create mode 100644 UIElementsSchema/UnityEditor.UIElements.Debugger.xsd create mode 100644 UIElementsSchema/UnityEditor.UIElements.ProjectSettings.xsd create mode 100644 UIElementsSchema/UnityEditor.UIElements.xsd create mode 100644 UIElementsSchema/UnityEngine.UIElements.xsd diff --git a/.idea/.idea.SpringJam2026/.idea/workspace.xml b/.idea/.idea.SpringJam2026/.idea/workspace.xml index 03da7ee..092ef95 100644 --- a/.idea/.idea.SpringJam2026/.idea/workspace.xml +++ b/.idea/.idea.SpringJam2026/.idea/workspace.xml @@ -6,6 +6,11 @@ + + + + + - + + + + diff --git a/Assets/Scenes/Bootstrap.unity b/Assets/Scenes/Bootstrap.unity index 4c2613f..6b75066 100644 --- a/Assets/Scenes/Bootstrap.unity +++ b/Assets/Scenes/Bootstrap.unity @@ -271,6 +271,7 @@ GameObject: serializedVersion: 6 m_Component: - component: {fileID: 1671688485} + - component: {fileID: 1671688486} - component: {fileID: 1671688484} m_Layer: 0 m_Name: Services @@ -308,6 +309,19 @@ Transform: m_Children: [] m_Father: {fileID: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1671688486 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1671688483} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4b256c4001284134990a2af43c375455, type: 3} + m_Name: + m_EditorClassIdentifier: Assembly-CSharp::Bootstrap + startType: 1 --- !u!1 &1755353616 GameObject: m_ObjectHideFlags: 0 diff --git a/Assets/Scenes/MainMenu.unity b/Assets/Scenes/MainMenu.unity new file mode 100644 index 0000000..15fbf97 --- /dev/null +++ b/Assets/Scenes/MainMenu.unity @@ -0,0 +1,319 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!29 &1 +OcclusionCullingSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_OcclusionBakeSettings: + smallestOccluder: 5 + smallestHole: 0.25 + backfaceThreshold: 100 + m_SceneGUID: 00000000000000000000000000000000 + m_OcclusionCullingData: {fileID: 0} +--- !u!104 &2 +RenderSettings: + m_ObjectHideFlags: 0 + serializedVersion: 10 + m_Fog: 0 + m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} + m_FogMode: 3 + m_FogDensity: 0.01 + m_LinearFogStart: 0 + m_LinearFogEnd: 300 + m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} + m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} + m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} + m_AmbientIntensity: 1 + m_AmbientMode: 3 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} + m_SkyboxMaterial: {fileID: 0} + m_HaloStrength: 0.5 + m_FlareStrength: 1 + m_FlareFadeSpeed: 3 + m_HaloTexture: {fileID: 0} + m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} + m_DefaultReflectionMode: 0 + m_DefaultReflectionResolution: 128 + m_ReflectionBounces: 1 + m_ReflectionIntensity: 1 + m_CustomReflection: {fileID: 0} + m_Sun: {fileID: 0} + m_UseRadianceAmbientProbe: 0 +--- !u!157 &3 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 13 + m_BakeOnSceneLoad: 0 + m_GISettings: + serializedVersion: 2 + m_BounceScale: 1 + m_IndirectOutputScale: 1 + m_AlbedoBoost: 1 + m_EnvironmentLightingMode: 0 + m_EnableBakedLightmaps: 0 + m_EnableRealtimeLightmaps: 0 + m_LightmapEditorSettings: + serializedVersion: 12 + m_Resolution: 2 + m_BakeResolution: 40 + m_AtlasSize: 1024 + m_AO: 0 + m_AOMaxDistance: 1 + m_CompAOExponent: 1 + m_CompAOExponentDirect: 0 + m_ExtractAmbientOcclusion: 0 + m_Padding: 2 + m_LightmapParameters: {fileID: 0} + m_LightmapsBakeMode: 1 + m_TextureCompression: 1 + m_ReflectionCompression: 2 + m_MixedBakeMode: 2 + m_BakeBackend: 2 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 512 + m_PVRBounces: 2 + m_PVREnvironmentSampleCount: 256 + m_PVREnvironmentReferencePointCount: 2048 + m_PVRFilteringMode: 1 + m_PVRDenoiserTypeDirect: 1 + m_PVRDenoiserTypeIndirect: 1 + m_PVRDenoiserTypeAO: 1 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVREnvironmentMIS: 1 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 1 + m_PVRFilteringGaussRadiusAO: 1 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 + m_ExportTrainingData: 0 + m_TrainingDataDestination: TrainingData + m_LightProbeSampleCountMultiplier: 4 + m_LightingDataAsset: {fileID: 20201, guid: 0000000000000000f000000000000000, type: 0} + m_LightingSettings: {fileID: 0} +--- !u!196 &4 +NavMeshSettings: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_BuildSettings: + serializedVersion: 3 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.4 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666667 + manualTileSize: 0 + tileSize: 256 + buildHeightMesh: 0 + maxJobWorkers: 0 + preserveTilesOutsideBounds: 0 + debug: + m_Flags: 0 + m_NavMeshData: {fileID: 0} +--- !u!1 &478016687 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 478016690} + - component: {fileID: 478016689} + - component: {fileID: 478016688} + - component: {fileID: 478016691} + m_Layer: 0 + m_Name: Main Camera + m_TagString: MainCamera + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!81 &478016688 +AudioListener: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 478016687} + m_Enabled: 1 +--- !u!20 &478016689 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 478016687} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 1 + m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} + m_projectionMatrixMode: 1 + m_GateFitMode: 2 + m_FOVAxisMode: 0 + m_Iso: 200 + m_ShutterSpeed: 0.005 + m_Aperture: 16 + m_FocusDistance: 10 + m_FocalLength: 50 + m_BladeCount: 5 + m_Curvature: {x: 2, y: 11} + m_BarrelClipping: 0.25 + m_Anamorphism: 0 + m_SensorSize: {x: 36, y: 24} + m_LensShift: {x: 0, y: 0} + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.3 + far clip plane: 1000 + field of view: 60 + orthographic: 1 + orthographic size: 5 + m_Depth: -1 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 3 + m_HDR: 1 + m_AllowMSAA: 1 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!4 &478016690 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 478016687} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: -10} + 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!114 &478016691 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 478016687} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: a79441f348de89743a2939f4d699eac1, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.RenderPipelines.Universal.Runtime::UnityEngine.Rendering.Universal.UniversalAdditionalCameraData + m_RenderShadows: 1 + m_RequiresDepthTextureOption: 2 + m_RequiresOpaqueTextureOption: 2 + m_CameraType: 0 + m_Cameras: [] + m_RendererIndex: -1 + m_VolumeLayerMask: + serializedVersion: 2 + m_Bits: 1 + m_VolumeTrigger: {fileID: 0} + m_VolumeFrameworkUpdateModeOption: 2 + m_RenderPostProcessing: 0 + m_Antialiasing: 0 + m_AntialiasingQuality: 2 + m_StopNaN: 0 + m_Dithering: 0 + m_ClearDepth: 1 + m_AllowXRRendering: 1 + m_AllowHDROutput: 1 + m_UseScreenCoordOverride: 0 + m_ScreenSizeOverride: {x: 0, y: 0, z: 0, w: 0} + m_ScreenCoordScaleBias: {x: 0, y: 0, z: 0, w: 0} + m_RequiresDepthTexture: 0 + m_RequiresColorTexture: 0 + m_TaaSettings: + m_Quality: 3 + m_FrameInfluence: 0.1 + m_JitterScale: 1 + m_MipBias: 0 + m_VarianceClampScale: 0.9 + m_ContrastAdaptiveSharpening: 0 + m_Version: 2 +--- !u!1 &1819373722 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1819373724} + - component: {fileID: 1819373723} + m_Layer: 5 + m_Name: MainMenu + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1819373723 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1819373722} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 19102, guid: 0000000000000000e000000000000000, type: 0} + m_Name: + m_EditorClassIdentifier: UnityEngine.dll::UnityEngine.UIElements.UIDocument + m_PanelSettings: {fileID: 11400000, guid: 4f01bbaf43abd294b9e7341d0530a9aa, type: 2} + m_ParentUI: {fileID: 0} + sourceAsset: {fileID: 9197481963319205126, guid: d29bfcc0217a10b488edd76a7ae59cf2, type: 3} + m_SortingOrder: 0 + m_Position: 0 + m_WorldSpaceSizeMode: 1 + m_WorldSpaceWidth: 1920 + m_WorldSpaceHeight: 1080 + m_PivotReferenceSize: 0 + m_Pivot: 0 + m_WorldSpaceCollider: {fileID: 0} +--- !u!4 &1819373724 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1819373722} + 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: 478016690} + - {fileID: 1819373724} diff --git a/Assets/Scenes/MainMenu.unity.meta b/Assets/Scenes/MainMenu.unity.meta new file mode 100644 index 0000000..81205d2 --- /dev/null +++ b/Assets/Scenes/MainMenu.unity.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: d9e43626d738a3f448e4acc7b2c1dfe3 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Management/BGM.cs b/Assets/Scripts/Management/BGM.cs index 63b498e..f7a3d20 100644 --- a/Assets/Scripts/Management/BGM.cs +++ b/Assets/Scripts/Management/BGM.cs @@ -3,13 +3,26 @@ using UnityEngine; namespace Management { + /// + /// Singleton pattern object that holds an audio source, designed as single source of + /// truth and driver for the BGM music. + /// [RequireComponent(typeof(AudioSource))] public class BGM : MonoBehaviour { + // hold a static reference to enforce singleton pattern private static BGM _instance; + + // the audiosource that will play the music private AudioSource _audioSource; + + // get the original volume set in the editor so when we fade in/out we know + // what volume to return to. private float _originalVolume; + // Fades out the currently playing music if playing, then fades in + // the provided clip over the amount of time specified. + // if t == 0 swap is instant. public void FadeIn(AudioClip clip, float t = 1f) { if (clip == null) @@ -66,6 +79,7 @@ namespace Management private void Awake() { + // enforce singleton if (_instance != null && _instance != this) { Destroy(gameObject); diff --git a/Assets/Scripts/Management/Bootstrap.cs b/Assets/Scripts/Management/Bootstrap.cs new file mode 100644 index 0000000..9f11d77 --- /dev/null +++ b/Assets/Scripts/Management/Bootstrap.cs @@ -0,0 +1,76 @@ +using System; +using State; +using State.Game; +using UnityEngine; + +namespace Management +{ + /// + /// Bootstrap is the first user added object that should be run. + /// It should be added to a game object in the Bootstrap scene, which should be the first + /// scene loaded when the game starts. + /// + /// Bootstrap initializes the game state machine, and starts it based on + /// the value of "Start Type" selected in the Inspector. + /// + public class Bootstrap : MonoBehaviour + { + // Hold a static reference to this instance so we can enforce singleton + private static Bootstrap _instance; + + // Determines what state the configure state machine will start in + private enum StartType + { + Splash, + MainMenu, + Game + } + + [SerializeField] private StartType startType = StartType.Splash; + [SerializeField] private Machine gameStateMachine; + + private void Awake() + { + // enforce singleton + if (_instance != null && _instance != this) + { + Destroy(gameObject); + return; + } + + // if we got this far, this object didn't exist, set the static instance to this and continue normally. + _instance = this; + + // ensure object survives scene loads + DontDestroyOnLoad(gameObject); + } + + private void Start() + { + // exit game early if we're misconfigured. + if (gameStateMachine == null) + { + Debug.LogError("no state machine for bootstrap"); + #if UNITY_EDITOR + UnityEditor.EditorApplication.isPlaying = false; + #else + Application.Quit(); + #endif + return; + } + + // determine what state to start machine in. Useful for quick testing. + // Should be "Splash" for release. + switch (startType) + { + case StartType.Splash: + case StartType.Game: + throw new NotImplementedException(); + case StartType.MainMenu: + default: + gameStateMachine.ChangeState(new MainMenuState()); + break; + } + } + } +} diff --git a/Assets/Scripts/Management/Bootstrap.cs.meta b/Assets/Scripts/Management/Bootstrap.cs.meta new file mode 100644 index 0000000..cc0a968 --- /dev/null +++ b/Assets/Scripts/Management/Bootstrap.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 4b256c4001284134990a2af43c375455 \ No newline at end of file diff --git a/Assets/Scripts/Management/SFX.cs b/Assets/Scripts/Management/SFX.cs index 89b3df0..abd58cd 100644 --- a/Assets/Scripts/Management/SFX.cs +++ b/Assets/Scripts/Management/SFX.cs @@ -4,15 +4,30 @@ using UnityEngine; namespace Management { + /// + /// Single drive to play all SFX in game. Contains a limiter that limits amount of times + /// any one clip will play to prevent volume runaways and other sound wave based oddities. + /// [RequireComponent(typeof(AudioSource))] public class SFX : MonoBehaviour { + // The maximum number any individual clip can be played. [SerializeField] private int maxActiveClips; + // singleton pattern private static SFX _instance; + + // audio driver private AudioSource _audioSource; + + // Playing clip registry. Used as data source to limit amount of times a clip will play simultaneously private Dictionary _clipsInProgress; + /// + /// Plpays the given audio clip through the audio driver + /// + /// The sound to play + /// The normalized volume it will play at public void PlayOneShot(AudioClip clip, float volume = 1f) { if (clip == null) return; @@ -26,6 +41,7 @@ namespace Management StartCoroutine(ClearClip(clip)); } + // Coroutine to clear registry once sound is finished. private IEnumerator ClearClip(AudioClip clip) { yield return new WaitForSeconds(clip.length); diff --git a/Assets/Scripts/Management/Services.cs b/Assets/Scripts/Management/Services.cs index e60fe09..31e043c 100644 --- a/Assets/Scripts/Management/Services.cs +++ b/Assets/Scripts/Management/Services.cs @@ -2,10 +2,19 @@ using UnityEngine; namespace Management { + /// + /// Global access pattern for services. + /// If you need a component or some data that needs to be used in many places, here's a good spot. + /// public class Services : MonoBehaviour { + // Enforce singleton pattern public static Services Instance { get; private set; } + + // BGM service for playing/changing background music. public BGM BGM => bgm; + + // SFX service to serve as single spot SFX plays from. public SFX SFX => sfx; [SerializeField] private BGM bgm; @@ -13,6 +22,7 @@ namespace Management private void Awake() { + // enforce singleton if (Instance != null && Instance != this) { Destroy(gameObject); @@ -20,6 +30,8 @@ namespace Management } Instance = this; + + // survive scene reloads DontDestroyOnLoad(gameObject); } } diff --git a/Assets/Scripts/State/Game.meta b/Assets/Scripts/State/Game.meta new file mode 100644 index 0000000..3bd0bb2 --- /dev/null +++ b/Assets/Scripts/State/Game.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: c5e93b34c6364ca0ad208993a593ac33 +timeCreated: 1777053968 \ No newline at end of file diff --git a/Assets/Scripts/State/Game/MainMenuState.cs b/Assets/Scripts/State/Game/MainMenuState.cs new file mode 100644 index 0000000..11e2d3c --- /dev/null +++ b/Assets/Scripts/State/Game/MainMenuState.cs @@ -0,0 +1,14 @@ +using UnityEngine.SceneManagement; + +namespace State.Game +{ + public class MainMenuState : GameState + { + public override void OnEnter(Machine machine) + { + base.OnEnter(machine); + SceneManager.LoadScene("MainMenu", LoadSceneMode.Additive); + SceneManager.SetActiveScene(SceneManager.GetSceneByName("MainMenu")); + } + } +} \ No newline at end of file diff --git a/Assets/Scripts/State/Game/MainMenuState.cs.meta b/Assets/Scripts/State/Game/MainMenuState.cs.meta new file mode 100644 index 0000000..9ba2c76 --- /dev/null +++ b/Assets/Scripts/State/Game/MainMenuState.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: c84ce8701033494696a7447eb5c58b8b +timeCreated: 1777054000 \ No newline at end of file diff --git a/Assets/Scripts/State/GameState.cs b/Assets/Scripts/State/GameState.cs index 46d3300..3c303ad 100644 --- a/Assets/Scripts/State/GameState.cs +++ b/Assets/Scripts/State/GameState.cs @@ -2,14 +2,24 @@ using UnityEngine; namespace State { + /// + /// State that drives the engine. OnEnter, OnUpdate, OnFixedUpdate, and OnExit called by parent state machine + /// public class GameState { protected Machine StateMachine; + + /// + /// Called when parent state machine loads this state. + /// Gives a reference to the parent state machine to the state. + /// + /// public virtual void OnEnter(Machine machine) { StateMachine = machine; } + // Called when parent StateMachine ChangeState is about to leave this state public virtual void OnExit() {} public virtual void OnUpdate(float deltaTime) {} public virtual void OnFixedUpdate(float deltaTime) {} diff --git a/Assets/Scripts/State/Machine.cs b/Assets/Scripts/State/Machine.cs index b28ffea..c8af3f5 100644 --- a/Assets/Scripts/State/Machine.cs +++ b/Assets/Scripts/State/Machine.cs @@ -2,10 +2,14 @@ using UnityEngine; namespace State { + /// + /// Simple state machine that provides OnEnter, OnExit, Update and FixedUpdate callbacks + /// to the current state. + /// public class Machine : MonoBehaviour { private GameState _currentState; - + public void Update() { _currentState?.OnUpdate(Time.deltaTime); @@ -16,6 +20,8 @@ namespace State _currentState?.OnFixedUpdate(Time.fixedDeltaTime); } + // ChangeState calls the Exit callback on the currently loaded state if one is loaded, + // then loads up the new given state, and calls OnEnter on it. public void ChangeState(GameState newState) { _currentState?.OnExit(); diff --git a/Assets/UI Toolkit.meta b/Assets/UI Toolkit.meta new file mode 100644 index 0000000..7b0b3d9 --- /dev/null +++ b/Assets/UI Toolkit.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 18adb73a18667c6418f049d06cd8d6be +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/UI Toolkit/PanelSettings.asset b/Assets/UI Toolkit/PanelSettings.asset new file mode 100644 index 0000000..85cda34 --- /dev/null +++ b/Assets/UI Toolkit/PanelSettings.asset @@ -0,0 +1,52 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 19101, guid: 0000000000000000e000000000000000, type: 0} + m_Name: PanelSettings + m_EditorClassIdentifier: UnityEngine.dll::UnityEngine.UIElements.PanelSettings + themeUss: {fileID: -4733365628477956816, guid: 58921a6697b5f2645bb2c58938819639, type: 3} + m_DisableNoThemeWarning: 0 + m_TargetTexture: {fileID: 0} + m_RenderMode: 0 + m_ColliderUpdateMode: 0 + m_ColliderIsTrigger: 1 + m_ScaleMode: 1 + m_ReferenceSpritePixelsPerUnit: 100 + m_PixelsPerUnit: 100 + m_Scale: 1 + m_ReferenceDpi: 96 + m_FallbackDpi: 96 + m_ReferenceResolution: {x: 1200, y: 800} + m_ScreenMatchMode: 0 + m_Match: 0 + m_SortingOrder: 0 + m_TargetDisplay: 0 + m_BindingLogLevel: 0 + m_ClearDepthStencil: 1 + m_ClearColor: 0 + m_ColorClearValue: {r: 0, g: 0, b: 0, a: 0} + m_VertexBudget: 0 + m_TextureSlotCount: 8 + m_DynamicAtlasSettings: + m_MinAtlasSize: 64 + m_MaxAtlasSize: 4096 + m_MaxSubTextureSize: 64 + m_ActiveFilters: 31 + m_AtlasBlitShader: {fileID: 9101, guid: 0000000000000000f000000000000000, type: 0} + m_DefaultShader: {fileID: 9100, guid: 0000000000000000f000000000000000, type: 0} + m_RuntimeGaussianBlurShader: {fileID: 20300, guid: 0000000000000000f000000000000000, type: 0} + m_RuntimeColorEffectShader: {fileID: 20301, guid: 0000000000000000f000000000000000, type: 0} + m_SDFShader: {fileID: 19011, guid: 0000000000000000f000000000000000, type: 0} + m_BitmapShader: {fileID: 9001, guid: 0000000000000000f000000000000000, type: 0} + m_SpriteShader: {fileID: 19012, guid: 0000000000000000f000000000000000, type: 0} + m_ICUDataAsset: {fileID: 0} + forceGammaRendering: 0 + textSettings: {fileID: 0} diff --git a/Assets/UI Toolkit/PanelSettings.asset.meta b/Assets/UI Toolkit/PanelSettings.asset.meta new file mode 100644 index 0000000..bff26b0 --- /dev/null +++ b/Assets/UI Toolkit/PanelSettings.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 4f01bbaf43abd294b9e7341d0530a9aa +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/UI Toolkit/UnityThemes.meta b/Assets/UI Toolkit/UnityThemes.meta new file mode 100644 index 0000000..13ad6ce --- /dev/null +++ b/Assets/UI Toolkit/UnityThemes.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 9c870383b86663a409998c89414854a9 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/UI Toolkit/UnityThemes/UnityDefaultRuntimeTheme.tss b/Assets/UI Toolkit/UnityThemes/UnityDefaultRuntimeTheme.tss new file mode 100644 index 0000000..1056e07 --- /dev/null +++ b/Assets/UI Toolkit/UnityThemes/UnityDefaultRuntimeTheme.tss @@ -0,0 +1 @@ +@import url("unity-theme://default"); \ No newline at end of file diff --git a/Assets/UI Toolkit/UnityThemes/UnityDefaultRuntimeTheme.tss.meta b/Assets/UI Toolkit/UnityThemes/UnityDefaultRuntimeTheme.tss.meta new file mode 100644 index 0000000..900a2cb --- /dev/null +++ b/Assets/UI Toolkit/UnityThemes/UnityDefaultRuntimeTheme.tss.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 58921a6697b5f2645bb2c58938819639 +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 12388, guid: 0000000000000000e000000000000000, type: 0} + disableValidation: 0 + unsupportedSelectorAction: 0 diff --git a/Assets/UI.meta b/Assets/UI.meta new file mode 100644 index 0000000..00cf6fb --- /dev/null +++ b/Assets/UI.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c8f710d9569c77b4b8d7a4a9950fb2e5 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/UI/Main.uss b/Assets/UI/Main.uss new file mode 100644 index 0000000..6b32600 --- /dev/null +++ b/Assets/UI/Main.uss @@ -0,0 +1,6 @@ +VisualElement { +} + +.menuContainer { + align-items: center; +} diff --git a/Assets/UI/Main.uss.meta b/Assets/UI/Main.uss.meta new file mode 100644 index 0000000..7606dbd --- /dev/null +++ b/Assets/UI/Main.uss.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 82ec75a97412ed44d9199e9605a0bd44 +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 12385, guid: 0000000000000000e000000000000000, type: 0} + disableValidation: 0 + unsupportedSelectorAction: 0 diff --git a/Assets/UI/MainMenu.uxml b/Assets/UI/MainMenu.uxml new file mode 100644 index 0000000..100c018 --- /dev/null +++ b/Assets/UI/MainMenu.uxml @@ -0,0 +1,8 @@ + +