26 Commits
V1.0 ... main

Author SHA1 Message Date
Pasha Bibko
b97eaf1475 Fixed formatting in GameDesignDoc.md 2025-08-14 14:48:00 +01:00
Pasha Bibko
c2cd9f3466 Added game design doc 2025-05-14 21:40:20 +01:00
Pasha Bibko
f538eae622 Added images to README.md 2025-05-13 22:21:46 +01:00
Pasha Bibko
d7dc1503bc Updated README.md 2025-05-13 22:19:28 +01:00
Pasha Bibko
a50e6fe3c5 Centered image 2025-05-13 22:18:00 +01:00
Pasha Bibko
9820decad0 Tried to make image take up more space 2025-05-13 22:14:24 +01:00
Pasha Bibko
a481fbbc89 Test 2025-05-13 22:11:03 +01:00
Pasha Bibko
c742b06311 Made menu decorations work on all resolutions 2025-05-12 09:41:46 +01:00
Pasha Bibko
95a2c4b43b Fixed shaders
Removed unused shaders from project
2025-05-12 09:35:02 +01:00
Pasha Bibko
8a89758ae5 Updated README.md 2025-05-09 15:26:41 +01:00
abfc6cd910 ghfghgfhgf 2025-05-02 14:58:30 +01:00
e706d5577a jxckjgx, 2025-05-02 14:58:26 +01:00
b2530ee2b7 Did suff 2025-05-02 14:57:55 +01:00
c191af0d4b Updated In-Game GUI to match the menu UI 2025-05-02 11:57:19 +01:00
728238edaf Removed faces from mesh to stop visual glitches 2025-05-02 11:44:59 +01:00
57c0acbab9 Made menus much nicer to look at
Also added a changeable FOV
2025-05-02 11:28:36 +01:00
cc701b5a00 Added font 2025-04-30 15:56:05 +01:00
8325f34ead Fixed Sensitvity bar position 2025-04-30 15:05:03 +01:00
d1c3d2cbfb Added a pause-menu 2025-04-30 14:21:48 +01:00
fa756dfa24 Made hazards visible 2025-04-30 13:42:31 +01:00
73191ec39b Touched-up the UI 2025-04-30 13:31:00 +01:00
3aa57df640 Made default sens a playable value 2025-04-30 11:52:00 +01:00
dde1651647 Added main menu 2025-04-30 11:51:29 +01:00
9d8ada0d64 Portals Actually Work 2025-04-30 09:51:58 +01:00
e1be308f05 Added a back renderer to the portal 2025-04-30 09:41:19 +01:00
Pasha Bibko
b86c9f7a14 Improved Timer QOL
Made it start on the player first moving and show on the game HUD.
2025-04-29 21:05:23 +01:00
54 changed files with 10280 additions and 4363 deletions

83
Assets/EdgeDetMat.mat Normal file
View File

@@ -0,0 +1,83 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!21 &2100000
Material:
serializedVersion: 8
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: EdgeDetMat
m_Shader: {fileID: 4800000, guid: 211b73cf71b1f6a48aa152214d4a886d, type: 3}
m_Parent: {fileID: 0}
m_ModifiedSerializedProperties: 0
m_ValidKeywords: []
m_InvalidKeywords: []
m_LightmapFlags: 4
m_EnableInstancingVariants: 0
m_DoubleSidedGI: 0
m_CustomRenderQueue: -1
stringTagMap: {}
disabledShaderPasses: []
m_LockedProperties:
m_SavedProperties:
serializedVersion: 3
m_TexEnvs:
- _BumpMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailAlbedoMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailMask:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailNormalMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _EmissionMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MainTex:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MetallicGlossMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _OcclusionMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _ParallaxMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
m_Ints: []
m_Floats:
- _BumpScale: 1
- _Cutoff: 0.5
- _DetailNormalMapScale: 1
- _DstBlend: 0
- _GlossMapScale: 1
- _Glossiness: 0.5
- _GlossyReflections: 1
- _Metallic: 0
- _Mode: 0
- _OcclusionStrength: 1
- _Parallax: 0.02
- _SmoothnessTextureChannel: 0
- _SpecularHighlights: 1
- _SrcBlend: 1
- _UVSec: 0
- _ZWrite: 1
m_Colors:
- _Color: {r: 1, g: 1, b: 1, a: 1}
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
m_BuildTextureStacks: []

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: b4f28ecf1d1c85941ae7097df1b9f763
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 2100000
userData:
assetBundleName:
assetBundleVariant:

8
Assets/Fonts.meta Normal file
View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 4194d8a65c567a940a05a157382c1598
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

View File

@@ -0,0 +1,21 @@
fileFormatVersion: 2
guid: e99e45d2b51e60d42a63e313b9e7cb5a
TrueTypeFontImporter:
externalObjects: {}
serializedVersion: 4
fontSize: 16
forceTextureCase: -2
characterSpacing: 0
characterPadding: 1
includeFontData: 1
fontNames:
- London Underground
fallbackFontReferences: []
customCharacters:
fontRenderingMode: 0
ascentCalculationMode: 1
useLegacyBoundsCalculation: 0
shouldRoundAdvanceValue: 1
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

View File

@@ -0,0 +1,21 @@
fileFormatVersion: 2
guid: f7a9652d55bbf1b4b9e093541f545c71
TrueTypeFontImporter:
externalObjects: {}
serializedVersion: 4
fontSize: 16
forceTextureCase: -2
characterSpacing: 0
characterPadding: 1
includeFontData: 1
fontNames:
- London Underground
fallbackFontReferences: []
customCharacters:
fontRenderingMode: 0
ascentCalculationMode: 1
useLegacyBoundsCalculation: 0
shouldRoundAdvanceValue: 1
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

View File

@@ -0,0 +1,21 @@
fileFormatVersion: 2
guid: 69d03deba79cd4c44a1454b13e8b7ca4
TrueTypeFontImporter:
externalObjects: {}
serializedVersion: 4
fontSize: 16
forceTextureCase: -2
characterSpacing: 0
characterPadding: 1
includeFontData: 1
fontNames:
- London Underground
fallbackFontReferences: []
customCharacters:
fontRenderingMode: 0
ascentCalculationMode: 1
useLegacyBoundsCalculation: 0
shouldRoundAdvanceValue: 1
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

View File

@@ -0,0 +1,21 @@
fileFormatVersion: 2
guid: bf6083ece8bcc9d45bd5648f518e6acb
TrueTypeFontImporter:
externalObjects: {}
serializedVersion: 4
fontSize: 16
forceTextureCase: -2
characterSpacing: 0
characterPadding: 1
includeFontData: 1
fontNames:
- London Underground
fallbackFontReferences: []
customCharacters:
fontRenderingMode: 0
ascentCalculationMode: 1
useLegacyBoundsCalculation: 0
shouldRoundAdvanceValue: 1
userData:
assetBundleName:
assetBundleVariant:

8
Assets/Images.meta Normal file
View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 56abd45bc6085e2408798211808b1b0e
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

After

Width:  |  Height:  |  Size: 128 KiB

View File

@@ -0,0 +1,127 @@
fileFormatVersion: 2
guid: 9c912b02f75402d4097a852a67645330
TextureImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 13
mipmaps:
mipMapMode: 0
enableMipMap: 1
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: 1
aniso: 1
mipBias: 0
wrapU: 1
wrapV: 1
wrapW: 1
nPOTScale: 1
lightmap: 0
compressionQuality: 50
spriteMode: 0
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 0
spriteTessellationDetail: -1
textureType: 0
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: 1024
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 0
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:
internalID: 0
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
nameFileIdTable: {}
mipmapLimitGroupName:
pSDRemoveMatte: 0
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: f2bc64aa294deac43aa459351fa32981
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,83 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!21 &2100000
Material:
serializedVersion: 8
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: BlurryTube
m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0}
m_Parent: {fileID: 0}
m_ModifiedSerializedProperties: 0
m_ValidKeywords: []
m_InvalidKeywords: []
m_LightmapFlags: 4
m_EnableInstancingVariants: 0
m_DoubleSidedGI: 0
m_CustomRenderQueue: -1
stringTagMap: {}
disabledShaderPasses: []
m_LockedProperties:
m_SavedProperties:
serializedVersion: 3
m_TexEnvs:
- _BumpMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailAlbedoMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailMask:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailNormalMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _EmissionMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MainTex:
m_Texture: {fileID: 2800000, guid: 9c912b02f75402d4097a852a67645330, type: 3}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MetallicGlossMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _OcclusionMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _ParallaxMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
m_Ints: []
m_Floats:
- _BumpScale: 1
- _Cutoff: 0.5
- _DetailNormalMapScale: 1
- _DstBlend: 0
- _GlossMapScale: 1
- _Glossiness: 0.5
- _GlossyReflections: 1
- _Metallic: 0
- _Mode: 0
- _OcclusionStrength: 1
- _Parallax: 0.02
- _SmoothnessTextureChannel: 0
- _SpecularHighlights: 1
- _SrcBlend: 1
- _UVSec: 0
- _ZWrite: 1
m_Colors:
- _Color: {r: 1, g: 1, b: 1, a: 1}
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
m_BuildTextureStacks: []

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 482b4cf328fe6a7418478d4415a064a5
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 2100000
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -12,7 +12,7 @@ GameObject:
- component: {fileID: 1283727424014209401}
- component: {fileID: 3306552328080128736}
m_Layer: 5
m_Name: Image (1)
m_Name: InnerCrosshair
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
@@ -25,12 +25,12 @@ RectTransform:
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 235339326246289039}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
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: 5671584535948009389}
m_Father: {fileID: 2457658704519817442}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
@@ -75,7 +75,7 @@ MonoBehaviour:
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1
--- !u!1 &2567258029979818048
--- !u!1 &5750698633402363283
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
@@ -83,109 +83,23 @@ GameObject:
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 6793247590988510300}
- component: {fileID: 4215272941060588095}
- component: {fileID: 7396474193888481675}
- component: {fileID: 2572485633640502460}
- component: {fileID: 7325803566019935124}
- component: {fileID: 4004420671527004376}
m_Layer: 5
m_Name: Speed (1)
m_TagString: NoTag
m_Name: OuterBox
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &6793247590988510300
--- !u!224 &2572485633640502460
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2567258029979818048}
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: 5671584535948009389}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 100, y: -100}
m_SizeDelta: {x: 160, y: 150}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &4215272941060588095
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2567258029979818048}
m_CullTransparentMesh: 1
--- !u!114 &7396474193888481675
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2567258029979818048}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 0, g: 0, b: 0, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_FontData:
m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
m_FontSize: 30
m_FontStyle: 0
m_BestFit: 0
m_MinSize: 0
m_MaxSize: 40
m_Alignment: 0
m_AlignByGeometry: 0
m_RichText: 1
m_HorizontalOverflow: 1
m_VerticalOverflow: 1
m_LineSpacing: 1
m_Text: 'Controls:
WASD - Move
LSHIFT - Wall Run (Red Walls)
SPACE
- Jump'
--- !u!1 &5244928208465755154
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 6414998190209660209}
- component: {fileID: 3397843830819786604}
- component: {fileID: 5086944111385116840}
m_Layer: 5
m_Name: Speed (2)
m_TagString: NoTag
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &6414998190209660209
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5244928208465755154}
m_GameObject: {fileID: 5750698633402363283}
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}
@@ -195,27 +109,27 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 0, y: 0}
m_AnchoredPosition: {x: 100, y: 100}
m_SizeDelta: {x: 160, y: 30}
m_AnchoredPosition: {x: 125, y: 50}
m_SizeDelta: {x: 275, y: 125}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &3397843830819786604
--- !u!222 &7325803566019935124
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5244928208465755154}
m_GameObject: {fileID: 5750698633402363283}
m_CullTransparentMesh: 1
--- !u!114 &5086944111385116840
--- !u!114 &4004420671527004376
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5244928208465755154}
m_GameObject: {fileID: 5750698633402363283}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3}
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
@@ -226,22 +140,16 @@ MonoBehaviour:
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_FontData:
m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
m_FontSize: 30
m_FontStyle: 0
m_BestFit: 0
m_MinSize: 0
m_MaxSize: 40
m_Alignment: 3
m_AlignByGeometry: 0
m_RichText: 1
m_HorizontalOverflow: 1
m_VerticalOverflow: 1
m_LineSpacing: 1
m_Text: 'Goal:
Get to the green wall as fast as possible'
m_Sprite: {fileID: 0}
m_Type: 0
m_PreserveAspect: 0
m_FillCenter: 1
m_FillMethod: 4
m_FillAmount: 1
m_FillClockwise: 1
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1
--- !u!1 &5857485381795871981
GameObject:
m_ObjectHideFlags: 0
@@ -254,7 +162,7 @@ GameObject:
- component: {fileID: 4719150856852200805}
- component: {fileID: 3186319404658750655}
m_Layer: 5
m_Name: Speed
m_Name: SpeedDisplay
m_TagString: NoTag
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
@@ -274,10 +182,10 @@ RectTransform:
m_Children: []
m_Father: {fileID: 5671584535948009389}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: 0, y: -79}
m_SizeDelta: {x: 160, y: 30}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 0, y: 0}
m_AnchoredPosition: {x: 115, y: 75}
m_SizeDelta: {x: 200, y: 30}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &4719150856852200805
CanvasRenderer:
@@ -300,7 +208,7 @@ MonoBehaviour:
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 0, g: 0, b: 0, a: 1}
m_Color: {r: 1, g: 0.654902, b: 0.1764706, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
@@ -308,13 +216,13 @@ MonoBehaviour:
m_PersistentCalls:
m_Calls: []
m_FontData:
m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
m_Font: {fileID: 12800000, guid: bf6083ece8bcc9d45bd5648f518e6acb, type: 3}
m_FontSize: 30
m_FontStyle: 0
m_BestFit: 0
m_MinSize: 0
m_MaxSize: 40
m_Alignment: 4
m_Alignment: 3
m_AlignByGeometry: 0
m_RichText: 1
m_HorizontalOverflow: 1
@@ -352,11 +260,11 @@ RectTransform:
m_LocalScale: {x: 0, y: 0, z: 0}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 2572485633640502460}
- {fileID: 188346468300870370}
- {fileID: 3955103952048326661}
- {fileID: 6793247590988510300}
- {fileID: 6414998190209660209}
- {fileID: 8335740897561854244}
- {fileID: 2457658704519817442}
- {fileID: 232158275427744802}
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
@@ -439,7 +347,7 @@ GameObject:
- component: {fileID: 3891287044146437727}
- component: {fileID: 6436371931853766171}
m_Layer: 5
m_Name: Image
m_Name: OuterCrosshair
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
@@ -456,7 +364,8 @@ RectTransform:
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Children:
- {fileID: 232158275427744802}
m_Father: {fileID: 5671584535948009389}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5}
@@ -502,3 +411,157 @@ MonoBehaviour:
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1
--- !u!1 &8883880397071342217
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 8335740897561854244}
- component: {fileID: 3941313279583122886}
- component: {fileID: 4448638729554205736}
m_Layer: 5
m_Name: TimeDisplay
m_TagString: NoTag
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &8335740897561854244
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8883880397071342217}
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: 5671584535948009389}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 0, y: 0}
m_AnchoredPosition: {x: 115, y: 30}
m_SizeDelta: {x: 200, y: 30}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &3941313279583122886
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8883880397071342217}
m_CullTransparentMesh: 1
--- !u!114 &4448638729554205736
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8883880397071342217}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 0.654902, b: 0.1764706, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_FontData:
m_Font: {fileID: 12800000, guid: bf6083ece8bcc9d45bd5648f518e6acb, type: 3}
m_FontSize: 30
m_FontStyle: 0
m_BestFit: 0
m_MinSize: 0
m_MaxSize: 40
m_Alignment: 3
m_AlignByGeometry: 0
m_RichText: 1
m_HorizontalOverflow: 1
m_VerticalOverflow: 1
m_LineSpacing: 1
m_Text: 0.00s
--- !u!1 &9086158836249204896
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 188346468300870370}
- component: {fileID: 5426269780674238028}
- component: {fileID: 5174691003681843927}
m_Layer: 5
m_Name: InnerBox
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &188346468300870370
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 9086158836249204896}
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: 5671584535948009389}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 0, y: 0}
m_AnchoredPosition: {x: 125, y: 50}
m_SizeDelta: {x: 250, y: 100}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &5426269780674238028
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 9086158836249204896}
m_CullTransparentMesh: 1
--- !u!114 &5174691003681843927
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 9086158836249204896}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 0.24705882, g: 0.24705882, b: 0.24705882, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_Sprite: {fileID: 0}
m_Type: 0
m_PreserveAspect: 0
m_FillCenter: 1
m_FillMethod: 4
m_FillAmount: 1
m_FillClockwise: 1
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1

View File

@@ -97,7 +97,7 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 5cfd42fc2ed2f504dae2b9e7095401cf, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Sensitivity: {x: 1200, y: 800}
m_Sensitivity: {x: 12, y: 8}
m_MaxAngle: 85
m_Orientation: {fileID: 0}
m_Tracking: {fileID: 0}

View File

@@ -49,7 +49,9 @@ MonoBehaviour:
m_AngleDif: 0
m_CamDif: 0
m_CameraPrefab: {fileID: 1179287573507601862, guid: 1a28b9e152b1d3d419d1881ea498fcbf, type: 3}
m_PortalRenderer: {fileID: 4162196787169641245}
m_Renderers:
- {fileID: 4162196787169641245}
- {fileID: 4134581380583201958}
m_PlayerPoint: {fileID: 6158405577604730568}
--- !u!65 &5568742943214540714
BoxCollider:
@@ -103,6 +105,89 @@ Transform:
m_Children: []
m_Father: {fileID: 3117384245817137028}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &3792217788487949262
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 8495484525370355397}
- component: {fileID: 6225447176941520143}
- component: {fileID: 4134581380583201958}
m_Layer: 12
m_Name: BackRender
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &8495484525370355397
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3792217788487949262}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: -2, z: -0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 2772991262862259612}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!33 &6225447176941520143
MeshFilter:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3792217788487949262}
m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0}
--- !u!23 &4134581380583201958
MeshRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3792217788487949262}
m_Enabled: 1
m_CastShadows: 1
m_ReceiveShadows: 1
m_DynamicOccludee: 1
m_StaticShadowCaster: 0
m_MotionVectors: 1
m_LightProbeUsage: 1
m_ReflectionProbeUsage: 1
m_RayTracingMode: 2
m_RayTraceProcedural: 0
m_RenderingLayerMask: 1
m_RendererPriority: 0
m_Materials:
- {fileID: 2100000, guid: b8370180ee45f7948b513305ba938a27, type: 2}
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: 3
m_MinimumChartSize: 4
m_AutoUVMaxDistance: 0.5
m_AutoUVMaxAngle: 89
m_LightmapParameters: {fileID: 0}
m_SortingLayerID: 0
m_SortingLayer: 0
m_SortingOrder: 0
m_AdditionalVertexStreams: {fileID: 0}
--- !u!1 &4525855263416128436
GameObject:
m_ObjectHideFlags: 0
@@ -133,7 +218,8 @@ Transform:
m_LocalPosition: {x: 0, y: 5, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Children:
- {fileID: 8495484525370355397}
m_Father: {fileID: 3117384245817137028}
m_LocalEulerAnglesHint: {x: 90, y: 0, z: 0}
--- !u!33 &5956259521933674024
@@ -231,6 +317,7 @@ GameObject:
m_Component:
- component: {fileID: 8290014685027761188}
- component: {fileID: 4196137517685965440}
- component: {fileID: 848597767875800347}
m_Layer: 0
m_Name: Back
m_TagString: Untagged
@@ -246,7 +333,7 @@ Transform:
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7967144210440699741}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
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
@@ -269,8 +356,21 @@ BoxCollider:
m_Bits: 0
m_LayerOverridePriority: 0
m_IsTrigger: 0
m_ProvidesContacts: 0
m_ProvidesContacts: 1
m_Enabled: 1
serializedVersion: 3
m_Size: {x: 10, y: 10, z: 5}
m_Center: {x: 0, y: 5, z: -3.5}
--- !u!114 &848597767875800347
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7967144210440699741}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 859e4c4c9b11c654a8ab3891fbd8c5b3, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Manager: {fileID: 4470023418895194988}

View File

@@ -110,7 +110,7 @@ Camera:
width: 1
height: 1
near clip plane: 0.3
far clip plane: 100
far clip plane: 500
field of view: 60
orthographic: 0
orthographic size: 5

View File

@@ -78,6 +78,6 @@ Material:
- _UVSec: 0
- _ZWrite: 1
m_Colors:
- _Color: {r: 1, g: 0, b: 0, a: 1}
- _Color: {r: 0, g: 0, b: 1, a: 1}
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
m_BuildTextureStacks: []

File diff suppressed because one or more lines are too long

5853
Assets/Scenes/MainMenu.unity Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: e22ef2f7c91cf3c4c9aff93d62cc2f5b
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -8,6 +8,10 @@ public class GravityController
// Constant gravity scale
const float m_GravityScale = -20.0f;
Vector3 m_Up = Vector3.zero;
public static Vector3 up => s_Instance.m_Up;
// Private constructor to stop accidental creation
private GravityController() { }
@@ -27,5 +31,6 @@ public class GravityController
{
// Sets the gravity
Physics.gravity = new Vector3(0, m_GravityScale * scale, 0);
m_Up = Physics.gravity;
}
}

View File

@@ -28,6 +28,8 @@ public class CameraController : MonoBehaviour
// Start is called before the first frame update
void Start()
{
gameObject.GetComponent<Camera>().fieldOfView = MainMenu.fov;
// Checks it is the only instance
if (s_Instance == null)
{
@@ -40,10 +42,6 @@ public class CameraController : MonoBehaviour
{
Debug.LogError("Multiple instances of CameraController within Scene");
}
// Locks the cursor and makes it invisible
Cursor.lockState = CursorLockMode.Locked;
Cursor.visible = false;
}
// Update is called once per frame
@@ -58,8 +56,8 @@ public class CameraController : MonoBehaviour
// Gets the mouse input from the user
Vector2 mouse = new Vector2
(
Input.GetAxisRaw("Mouse X") * Time.deltaTime * m_Sensitivity.x,
Input.GetAxisRaw("Mouse Y") * Time.deltaTime * m_Sensitivity.y
Input.GetAxisRaw("Mouse X") * Time.deltaTime * m_Sensitivity.x * MainMenu.sens,
Input.GetAxisRaw("Mouse Y") * Time.deltaTime * m_Sensitivity.y * MainMenu.sens
);
// Applies the mouse movement to the camera angle

View File

@@ -36,6 +36,16 @@ public partial class PlayerMovement : MonoBehaviour
// Calculates the movement direction
m_MoveDir = (m_Orientation.forward * m_Input.y) + (m_Orientation.right * m_Input.x);
if (m_MoveDir != Vector3.zero && m_StartTime == 0.0f)
{
m_StartTime = Time.time;
}
if (m_StartTime != 0.0f)
{
m_TimeText.text = (Time.time - m_StartTime).ToString("0.00") + " s";
}
//
if (m_OnSlope)
{

View File

@@ -46,6 +46,7 @@ public partial class PlayerMovement : MonoBehaviour
[SerializeField] Canvas m_DeadCanvas;
[SerializeField] Canvas m_CompletedCanvas;
[SerializeField] Text m_CompletedText;
[SerializeField] Text m_TimeText;
[Header("Debug Settings")]
[SerializeField] Text m_SpeedDisplay;
@@ -93,7 +94,7 @@ public partial class PlayerMovement : MonoBehaviour
bool m_IsDead = false;
float m_StartTime;
float m_StartTime = 0.0f;
// Only instance of the player
static PlayerMovement s_Instance;
@@ -108,8 +109,6 @@ public partial class PlayerMovement : MonoBehaviour
// Start is called before the first frame update
private void Start()
{
m_StartTime = Time.time;
//
m_CompletedCanvas.enabled = false;
m_DeadCanvas.enabled = false;

View File

@@ -0,0 +1,10 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PortalBack : MonoBehaviour
{
[SerializeField] PortalManager m_Manager;
// private void OnCollisionEnter(Collision collision) => m_Manager.ForceTeleport();
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 859e4c4c9b11c654a8ab3891fbd8c5b3
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -19,7 +19,7 @@ public class PortalCamera : MonoBehaviour
Vector3 m_Rot;
// Initialistion function for the camera
public void InitCamera(MeshRenderer renderer, PortalManager creator, Vector3 rot)
public void InitCamera(MeshRenderer[] renderers, PortalManager creator, Vector3 rot)
{
// Transfers the passed rotation to be stored within the class
m_Rot = rot;
@@ -30,6 +30,7 @@ public class PortalCamera : MonoBehaviour
// Gets the camera from the component
m_Camera = gameObject.GetComponent<Camera>();
m_Camera.fieldOfView = MainMenu.fov;
// Creates the render texture
RenderTextureDescriptor descriptor = new(Screen.width, Screen.height);
@@ -42,11 +43,14 @@ public class PortalCamera : MonoBehaviour
// Links the camera to the mesh renderer
m_Camera.targetTexture = m_RenderTexture; // Sets it's camera to display to the render texture instead of the screen
m_RenderMaterial.mainTexture = m_RenderTexture; // Sets the material to use the render texture as it's texture
renderer.material = m_RenderMaterial; // Set's the renderer to use the material
foreach (Renderer renderer in renderers)
{
renderer.material = m_RenderMaterial;
}
}
// Update is called every frame
void Update()
void LateUpdate()
{
// Gets the offset of the player from the display portal
Vector3 offset = m_DisplayPortal.PlayerOffset();
@@ -59,8 +63,6 @@ public class PortalCamera : MonoBehaviour
float angle = Quaternion.Angle(m_DisplayPortal.transform.parent.rotation, m_CapturePortal.transform.parent.rotation);
Quaternion rotDif = Quaternion.AngleAxis(angle, Vector3.up);
Vector3 newCamDir = rotDif * CameraController.Instance().transform.forward;
//Vector3 d = new(m_CapturePortal.CamDif(), 0f, 0f);
//Vector3 d = new(0f, 0f, m_CapturePortal.CamDif());
Vector3 d = new(0f, m_CapturePortal.CamDif(), 0f);
transform.parent.eulerAngles = Quaternion.LookRotation(newCamDir, Vector3.up).eulerAngles + m_Rot + d;
}

View File

@@ -1,3 +1,4 @@
using System.Collections.Generic;
using UnityEngine;
public class PortalManager : MonoBehaviour
@@ -9,7 +10,7 @@ public class PortalManager : MonoBehaviour
[Header("Set References")]
[SerializeField] GameObject m_CameraPrefab;
[SerializeField] MeshRenderer m_PortalRenderer;
[SerializeField] MeshRenderer[] m_Renderers;
[Header("Points")]
[SerializeField] Transform m_PlayerPoint;
@@ -17,7 +18,7 @@ public class PortalManager : MonoBehaviour
// Private variables //
PortalManager m_OtherManager;
PortalCamera m_PortalCamera;
[SerializeField] PortalCamera m_PortalCamera;
// Gets the other end of the portal
public PortalManager Linked() => m_OtherManager;
@@ -27,8 +28,6 @@ public class PortalManager : MonoBehaviour
public float CamDif() => m_CamDif;
static bool s_TeleportedThisFrame = false;
// Start is called before the first frame update
void Start()
{
@@ -45,19 +44,29 @@ public class PortalManager : MonoBehaviour
m_PortalCamera = cam.GetComponentInChildren<PortalCamera>();
// Initialises the camera so it renders to the portal and not the screen
m_PortalCamera.InitCamera(m_PortalRenderer, this, transform.parent.localEulerAngles * 2.0f);
}
// Updates is called every frame
void Update()
{
// Updates the player position relative to the portal
m_PlayerPoint.position = CameraController.Instance().transform.position;
m_PortalCamera.InitCamera(m_Renderers, this, transform.parent.localEulerAngles * 2.0f);
}
void LateUpdate()
{
s_TeleportedThisFrame = true;
m_PlayerPoint.position = CameraController.Instance().transform.position;
}
public void ForceTeleport()
{
// Calculates if the player is going towards the portal
Vector3 difference = PlayerMovement.Pos() - transform.position;
// Rotates the player
float rotDif = -Quaternion.Angle(transform.rotation, m_OtherManager.transform.rotation) + m_AngleDif;
CameraController.Instance().RotatePlayerDirection(new Vector2(0f, rotDif));
// Tellss the player it went through a portal
PlayerMovement.Instance().WentThroughPortal(rotDif);
// Teleports the player
Vector3 offset = Quaternion.Euler(0f, rotDif, 0f) * difference;
PlayerMovement.SetPos(m_OtherManager.transform.position + offset - new Vector3(0, 1.0f, 0));
}
// When something enters the portal
@@ -70,7 +79,7 @@ public class PortalManager : MonoBehaviour
Vector3 difference = PlayerMovement.Pos() - transform.position;
// If this is true the player has crossed the portal
if (PlayerMovement.CanGoThroughPortals() && s_TeleportedThisFrame == true)
if (PlayerMovement.CanGoThroughPortals())
{
// Rotates the player
float rotDif = -Quaternion.Angle(transform.rotation, m_OtherManager.transform.rotation) + m_AngleDif;

8
Assets/Scripts/UI.meta Normal file
View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: af65e72fa15f06447a658f311edb101d
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,78 @@
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
public class MainMenu : MonoBehaviour
{
[Header("Settings")]
[SerializeField] int m_TransitionFrames;
[Header("References")]
[SerializeField] Camera m_Camera;
[Header("Canvases")]
[SerializeField] Canvas m_StartCanvas;
[SerializeField] Canvas m_OptionsCanvas;
[SerializeField] Canvas m_ControlsCanvas;
[Header("Options References")]
[SerializeField] Text m_SensText;
[SerializeField] Slider m_SensitivitySlider;
[SerializeField] Text m_FOVText;
[SerializeField] Slider m_FOVSlider;
public static float sens = 35;
public static float fov = 90;
private void Start()
{
m_StartCanvas.enabled = true;
m_ControlsCanvas.enabled = false;
m_OptionsCanvas.enabled = false;
Cursor.visible = true;
Cursor.lockState = CursorLockMode.Confined;
m_FOVSlider.value = fov;
m_SensitivitySlider.value = sens;
}
public void StartGame() => SceneManager.LoadScene(1);
public void OptionsMenu()
{
m_StartCanvas.enabled = false;
m_ControlsCanvas.enabled = false;
m_OptionsCanvas.enabled = true;
}
public void ControlsMenu()
{
m_StartCanvas.enabled = false;
m_OptionsCanvas.enabled = false;
m_ControlsCanvas.enabled = true;
}
public void StartMenu()
{
m_ControlsCanvas.enabled = false;
m_OptionsCanvas.enabled = false;
m_StartCanvas.enabled = true;
}
private void Update()
{
if (Input.GetKey(KeyCode.Tab))
{
StartMenu();
}
sens = m_SensitivitySlider.value;
m_SensText.text = sens.ToString();
fov = m_FOVSlider.value;
m_FOVText.text = fov.ToString();
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: a1feb454d15b4714f9e36e541f9eaca7
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,46 @@
using UnityEngine;
using UnityEngine.SceneManagement;
public class PauseMenu : MonoBehaviour
{
[SerializeField] Canvas m_Canvas;
private bool m_Paused = false;
private void UpdateState()
{
m_Canvas.enabled = m_Paused;
Time.timeScale = m_Paused ? 0.0f : 1.0f;
Cursor.visible = m_Paused;
Cursor.lockState = m_Paused ? CursorLockMode.None : CursorLockMode.Locked;
}
private void Start()
{
UpdateState();
}
private void Update()
{
// Toggles the paused state if the ESC key is pressed //
if (Input.GetKeyDown(KeyCode.Tab) && PlayerMovement.Instance().IsDead() == false)
{
m_Paused = !m_Paused;
UpdateState();
}
}
public void Unpause()
{
m_Paused = false;
UpdateState();
}
public void MainMenu()
{
Time.timeScale = 1.0f;
SceneManager.LoadScene(0);
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 6f2655985e3537742ae98052acd79cc3
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.4 KiB

After

Width:  |  Height:  |  Size: 2.2 KiB

View File

@@ -1,9 +1,9 @@
fileFormatVersion: 2
guid: ed0c2c8a99e92e14ba740ac8aa428288
TextureImporter:
internalIDToNameTable: []
fileIDToRecycleName: {}
externalObjects: {}
serializedVersion: 11
serializedVersion: 7
mipmaps:
mipMapMode: 0
enableMipMap: 1
@@ -57,33 +57,30 @@ TextureImporter:
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
applyGammaDecoding: 1
platformSettings:
- serializedVersion: 3
- serializedVersion: 2
buildTarget: DefaultTexturePlatform
maxTextureSize: 512
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
textureCompression: 2
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 3
- serializedVersion: 2
buildTarget: Standalone
maxTextureSize: 512
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
textureCompression: 2
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 3
- serializedVersion: 2
buildTarget: iPhone
maxTextureSize: 512
resizeAlgorithm: 0
@@ -94,8 +91,7 @@ TextureImporter:
allowsAlphaSplitting: 0
overridden: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 1
- serializedVersion: 3
- serializedVersion: 2
buildTarget: WebGL
maxTextureSize: 512
resizeAlgorithm: 0
@@ -106,7 +102,6 @@ TextureImporter:
allowsAlphaSplitting: 0
overridden: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 1
spriteSheet:
serializedVersion: 2
sprites: []
@@ -114,12 +109,10 @@ TextureImporter:
physicsShape: []
bones: []
spriteID:
internalID: 0
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
spritePackingTag:
pSDRemoveMatte: 0
pSDShowRemoveMatteOption: 0

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 29720fcdf33dc1c44900e42bb5835507
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 7abb74942295fc244bdfe8bb8236881d
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,110 @@
/*
███████╗██████╗░░██████╗░███████╗  ██████╗░███████╗████████╗███████╗░█████╗░████████╗██╗░█████╗░███╗░░██╗
██╔════╝██╔══██╗██╔════╝░██╔════╝  ██╔══██╗██╔════╝╚══██╔══╝██╔════╝██╔══██╗╚══██╔══╝██║██╔══██╗████╗░██║
█████╗░░██║░░██║██║░░██╗░█████╗░░  ██║░░██║█████╗░░░░░██║░░░█████╗░░██║░░╚═╝░░░██║░░░██║██║░░██║██╔██╗██║
██╔══╝░░██║░░██║██║░░╚██╗██╔══╝░░  ██║░░██║██╔══╝░░░░░██║░░░██╔══╝░░██║░░██╗░░░██║░░░██║██║░░██║██║╚████║
███████╗██████╔╝╚██████╔╝███████╗  ██████╔╝███████╗░░░██║░░░███████╗╚█████╔╝░░░██║░░░██║╚█████╔╝██║░╚███║
╚══════╝╚═════╝░░╚═════╝░╚══════╝  ╚═════╝░╚══════╝░░░╚═╝░░░╚══════╝░╚════╝░░░░╚═╝░░░╚═╝░╚════╝░╚═╝░░╚══╝
░██████╗██╗░░██╗░█████╗░██████╗░███████╗██████╗░
██╔════╝██║░░██║██╔══██╗██╔══██╗██╔════╝██╔══██╗
╚█████╗░███████║███████║██║░░██║█████╗░░██████╔╝
░╚═══██╗██╔══██║██╔══██║██║░░██║██╔══╝░░██╔══██╗
██████╔╝██║░░██║██║░░██║██████╔╝███████╗██║░░██║
╚═════╝░╚═╝░░╚═╝╚═╝░░╚═╝╚═════╝░╚══════╝╚═╝░░╚═╝
█▀▀▄ █──█   ▀▀█▀▀ █──█ █▀▀   ░█▀▀▄ █▀▀ ▀█─█▀ █▀▀ █── █▀▀█ █▀▀█ █▀▀ █▀▀█
█▀▀▄ █▄▄█   ─░█── █▀▀█ █▀▀   ░█─░█ █▀▀ ─█▄█─ █▀▀ █── █──█ █──█ █▀▀ █▄▄▀
▀▀▀─ ▄▄▄█   ─░█── ▀──▀ ▀▀▀   ░█▄▄▀ ▀▀▀ ──▀── ▀▀▀ ▀▀▀ ▀▀▀▀ █▀▀▀ ▀▀▀ ▀─▀▀
____________________________________________________________________________________________________________________________________________
▄▀█ █▀ █▀ █▀▀ ▀█▀ ▀   █░█ █░░ ▀█▀ █ █▀▄▀█ ▄▀█ ▀█▀ █▀▀   ▄█ █▀█ ▄█▄   █▀ █░█ ▄▀█ █▀▄ █▀▀ █▀█ █▀
█▀█ ▄█ ▄█ ██▄ ░█░ ▄   █▄█ █▄▄ ░█░ █ █░▀░█ █▀█ ░█░ ██▄   ░█ █▄█ ░▀░   ▄█ █▀█ █▀█ █▄▀ ██▄ █▀▄ ▄█
____________________________________________________________________________________________________________________________________________
License:
The license is ATTRIBUTION 3.0
More license info here:
https://creativecommons.org/licenses/by/3.0/
____________________________________________________________________________________________________________________________________________
This shader has NOT been tested on any other PC configuration except the following:
CPU: Intel Core i5-6400
GPU: NVidia GTX 750Ti
RAM: 16GB
Windows: 10 x64
DirectX: 11
____________________________________________________________________________________________________________________________________________
*/
Shader "Ultimate 10+ Shaders/Edge Detection" /* The edge detection algorithm that is implemented in this shader is named "Sobel Edge Detection" */
{
Properties
{
_Color ("Color", Color) = (1,1,1,1)
}
SubShader
{
Tags { "Queue"="Transparent" }
Cull Back
GrabPass { }
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
float3 normal : NORMAL;
};
struct v2f
{
float4 position : POSITION;
float4 screenPos : TEXCOORD0;
};
fixed4 _Color;
sampler2D _GrabTexture : register(s0);
v2f vert(appdata input)
{
v2f output;
output.position = UnityObjectToClipPos(input.vertex);
output.screenPos = output.position;
return output;
}
half4 pixel;
half2 uv;
fixed onePixelW, onePixelH;
half4 frag(v2f input) : SV_Target
{
uv = input.screenPos.xy / input.screenPos.w;
uv.x = (uv.x + 1) * .5;
uv.y = 1.0 - (uv.y + 1) * .5;
onePixelW = 1.0 / _ScreenParams.x;
onePixelH = 1.0 / _ScreenParams.y;
pixel = 0;
pixel = abs(
tex2D(_GrabTexture, half2(uv.x - onePixelW, uv.y)) -
tex2D(_GrabTexture, half2(uv.x + onePixelW, uv.y)) +
tex2D(_GrabTexture, half2(uv.x, uv.y + onePixelH)) -
tex2D(_GrabTexture, half2(uv.x, uv.y - onePixelH))
);
return pixel * _Color;
}
ENDCG
}
}
}

View File

@@ -0,0 +1,9 @@
fileFormatVersion: 2
guid: 211b73cf71b1f6a48aa152214d4a886d
ShaderImporter:
externalObjects: {}
defaultTextures: []
nonModifiableTextures: []
userData:
assetBundleName:
assetBundleVariant:

96
GameDesignDoc.md Normal file
View File

@@ -0,0 +1,96 @@
# **The Mobius Line**
Your job is to get to the other train platform as fast as possible. There is just one problem, no geometric rules are guaranteed to work.
### **Contents**
- 1.1 Genres
- 1.2 Target audience
- 1.3 Unique selling points
- 2.1 Player experience
- 2.2 Visual and audio style
- 2.3 Game world fiction
- 2.4 Platforms, Technology and Scope
- 3.1 Core loops
- 3.2 Objectives and Progression
- 3.3 Game systems
- 3.4 Interactivity
### **1.1 Main Genres**
The main genres for my game will be speed and non-Euclidean. Speed is implemented as a genre in my game as your goal is to get to the end of the level as fast as possible. If you do not get to the train fast enough you will have to replay the level until you reach the desired speed.
Non-Euclidean is a lesser known genre and is the description for any geometric space that does not follow Euler's rules of geometry. This can mean a variety of things but in "The Mobius Line" it is simpler to think of it as portals that teleport the player around without them noticing. This will be implemented in the levels to make it more challenging to the player to figure out the fastest way to reach the end.
### **1.2 Target audiences**
##### **Groups**
The main target audience of "The Mobius Line" will be people who like to traverse through game levels as fast as possible. The game will be interesting to them as it is the main concept of the core loop.
A secondary target audience of the game will be people who are interested in non-Euclidean geometry as it is the main way the levels are constructed. They may not be as interested in completing the levels as fast as possible but they will want to explore the levels with their unique geometry.
##### **Age rating**
Within the game there will be nothing that means the game is not appropriate for younger players as I do not want to stop someone playing my game just because of their age. Whilst the game is appropriate for all ages it will be designed for 12+ audiences with its high mechanical skill and patience requirements.
### **1.3 Unique selling points**
##### **- Competitive community**
Due to the nature of "The Mobius Line" it will have a competitive community. To facilitate this and help support it I will implement a speedrun clock for players to monitor their time as well as providing a replay feature so players can see how they got their fastest time.
##### **- Non-Euclidean gameplay**
Non-Euclidean geometry will be a large part of the game. It will attract players that would have not originally found my game interesting as well as creating a more interesting experience as exploring the levels will be a more complex task than just walking around.
##### **- High skill ceilings**
The movement in "The Mobius Line" will be designed to have a high skill ceiling. There will be a variety of mechanics that the player can use but they will not be explained to the player at the start and they will have to find special areas to learn them. This will make sure the player is always learning and improving at the game.
### **2.1 Player experience**
The game is set in the London Underground where the end and start of levels will be different platforms within a station. This should feel somewhat familiar to most players as most modern cities have an underground train system which are often quite similar to the London Underground. The player will be a person of Russian/Eastern European heritage and will be able to choose if they are a male or female. The main way the players will be kept engaged is by challenging themself to get a faster time on that level, and by exploring the levels which will intrigue their brains as they will not make sense.
### **2.2 Visual and Audio style**
The look and sound of the game is heavily inspired by the London Underground as that is where the setting of the game is. The goal of this is to make it feel familiar despite the game being set in a world that follows very different rules to ours. The game will use as much as it can from actual London Underground stations and the rest of the assets will be inspired by their real life counterparts.
The design of the tunnels is meant to mirror the differences between UK and eastern European culture. The familiarity of the tunnels echoes the similarities between the cultures. Whereas the confusing non-Euclidean aspects of the tunnels mirror the unaccepting environment.
### **2.3 Game world fiction**
The in-game world is meant to be imagined as part of our world, entering a train station in the game should feel the same as entering one on a trip into London. Real world events such as the invasions of Ukraine will be hinted at but never explicitly stated. The non-Euclidean aspects of the tunnels are meant to be something only the player experiences and no explanation of why the player and only the player experiences them is given.
### **2.4 Platforms, Technology and Scope**
The game will be made for PC only as designing it for consoles or mobile would not only require time to make it work on those devices but the controls would have to be massively redesigned due to the accuracy that mouse and keyboard provides when compared to touchscreen or controller. It is a 3 dimensional game made in Unity, which should take around a month to create with the first playable version being around 2 weeks in. The final version will take around 10 to 15 minutes to complete but will provide challenges that allow people to play for a couple hours whilst still providing incentives.
### **3.1 Core loops**
The main loop of the game will be to:
1. Explore the level
2. Find a faster route to the exit
3. Beat your personal record
4. Repeat on the same or new level
It will engage players because there will almost always be a faster time they are able to achieve and they will be able to set target times that they want to beat.
### **3.2 Objectives and Progression**
The way the player physically moves through the level will be through a variety of basic skills such as running, wall running and sliding. They will also learn more complicated skills such as bunny hopping. The short term goal of the player will be to get a faster time either to progress to the next level or beat their personal best. Whereas the long term will be to beat all of the levels and learn all of the advanced techniques to get faster times.
Throughout the player's journey through the tunnels they will also learn what the consequences of the treatment of eastern European culture have on people from those backgrounds. This will be shown to the player through dialog with non-player characters through different levels. The more severe issues will be only hinted at through the gameplay so the game will still be appropriate for younger audiences.
### **3.3 Game systems**
Portals - to achieve the appearance of non-Euclidean Changing gravity direction - used in some of the puzzles Trains - start/end of levels as well as being travel between levels (interacted by player) Ticket barriers - act as one way barriers in levels (interacted by player)
One of the main game systems that will need to be implemented is portals. They are how non-Euclidean concepts within the game will be implemented. In order for them to have the desired effect they must be able to be travelled through without realising. Another feature that will need implementing for the appearance of non-Euclidean concepts is changing gravity directions which is not natively supported within Unity.
Throughout their journey through the stations of the London Underground the way the player will travel between stations is via a train. It will also serve as the beginning and end of levels. One way barriers are a common concept in games and they will be implemented in "The Mobius Line" through the use of ticket barriers. They will make the player only be able to travel through them one way upon their first encounter, however once travelled through the player will be able to go both ways through them.

View File

@@ -2,6 +2,7 @@
"dependencies": {
"com.unity.collab-proxy": "2.7.1",
"com.unity.feature.development": "1.0.1",
"com.unity.postprocessing": "3.4.0",
"com.unity.probuilder": "5.2.4",
"com.unity.textmeshpro": "3.0.6",
"com.unity.timeline": "1.7.6",

View File

@@ -67,6 +67,15 @@
"dependencies": {},
"url": "https://packages.unity.com"
},
"com.unity.postprocessing": {
"version": "3.4.0",
"depth": 0,
"source": "registry",
"dependencies": {
"com.unity.modules.physics": "1.0.0"
},
"url": "https://packages.unity.com"
},
"com.unity.probuilder": {
"version": "5.2.4",
"depth": 0,

View File

@@ -5,6 +5,9 @@ EditorBuildSettings:
m_ObjectHideFlags: 0
serializedVersion: 2
m_Scenes:
- enabled: 1
path: Assets/Scenes/MainMenu.unity
guid: e22ef2f7c91cf3c4c9aff93d62cc2f5b
- enabled: 1
path: Assets/Scenes/ActualLevel1.unity
guid: 4c98b5cb307000847b781a1a2cda472e

View File

@@ -144,7 +144,7 @@
{
"type": "UnityEngine.ProBuilder.SelectMode, Unity.ProBuilder, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null",
"key": "editor.lastMeshSelectMode",
"value": "{\"m_Value\":4}"
"value": "{\"m_Value\":8}"
},
{
"type": "UnityEngine.ProBuilder.SelectionModifierBehavior, Unity.ProBuilder, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null",

View File

@@ -834,7 +834,20 @@ PlayerSettings:
webGLMemoryGeometricGrowthStep: 0.2
webGLMemoryGeometricGrowthCap: 96
webGLPowerPreference: 2
scriptingDefineSymbols: {}
scriptingDefineSymbols:
Android: UNITY_POST_PROCESSING_STACK_V2
EmbeddedLinux: UNITY_POST_PROCESSING_STACK_V2
GameCoreXboxOne: UNITY_POST_PROCESSING_STACK_V2
Nintendo Switch: UNITY_POST_PROCESSING_STACK_V2
PS4: UNITY_POST_PROCESSING_STACK_V2
PS5: UNITY_POST_PROCESSING_STACK_V2
QNX: UNITY_POST_PROCESSING_STACK_V2
Stadia: UNITY_POST_PROCESSING_STACK_V2
Standalone: UNITY_POST_PROCESSING_STACK_V2
VisionOS: UNITY_POST_PROCESSING_STACK_V2
WebGL: UNITY_POST_PROCESSING_STACK_V2
XboxOne: UNITY_POST_PROCESSING_STACK_V2
tvOS: UNITY_POST_PROCESSING_STACK_V2
additionalCompilerArguments: {}
platformArchitecture: {}
scriptingBackend: {}

View File

@@ -1,2 +1,13 @@
# TheMobiusLine
# The Mobius Line
This is my FMP (final major project) that I created for my first year of Level 3 Game development. Windows downloads can be found under releases but if you wish to play via your browser you can play [here](https://pashabibko.itch.io/the-mobius-line).
### About
The mobius line is a speedrunning game built around non-Euclidean concepts set in the London Underground. Your goal is to get from one platform (the starting area) to the other (green wall) as fast as possible.
![](md-res/screenshot1.png)
![](md-res/screenshot2.png)
![](md-res/screenshot3.png)
If you would like to find out more about the plans for the game you can find the game design document [here](GameDesignDoc.md)

BIN
md-res/screenshot1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 298 KiB

BIN
md-res/screenshot2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 421 KiB

BIN
md-res/screenshot3.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 385 KiB