From 18c19c7c14870bdeb49da19d2a0c2989cc38061a Mon Sep 17 00:00:00 2001 From: Pasha Date: Thu, 15 Jan 2026 18:18:59 +0000 Subject: [PATCH] Added basic portals --- Assets/Prefabs/Portal.prefab | 202 ++++++++++++ Assets/Prefabs/Portal.prefab.meta | 7 + Assets/Prefabs/PortalCamera.prefab | 145 +++++++++ Assets/Prefabs/PortalCamera.prefab.meta | 7 + Assets/Scenes/WorldScene.unity | 303 +++++++++++++++++- Assets/Scripts/Shaders.meta | 8 + .../Scripts/Shaders/ScreenCutoutShader.shader | 58 ++++ .../Shaders/ScreenCutoutShader.shader.meta | 9 + Assets/Scripts/World.meta | 8 + Assets/Scripts/World/PlayerController.cs | 14 + Assets/Scripts/World/PlayerController.cs.meta | 3 + Assets/Scripts/World/PortalCamera.cs | 76 +++++ Assets/Scripts/World/PortalCamera.cs.meta | 3 + Assets/Scripts/World/PortalManager.cs | 62 ++++ Assets/Scripts/World/PortalManager.cs.meta | 11 + 15 files changed, 914 insertions(+), 2 deletions(-) create mode 100644 Assets/Prefabs/Portal.prefab create mode 100644 Assets/Prefabs/Portal.prefab.meta create mode 100644 Assets/Prefabs/PortalCamera.prefab create mode 100644 Assets/Prefabs/PortalCamera.prefab.meta create mode 100644 Assets/Scripts/Shaders.meta create mode 100644 Assets/Scripts/Shaders/ScreenCutoutShader.shader create mode 100644 Assets/Scripts/Shaders/ScreenCutoutShader.shader.meta create mode 100644 Assets/Scripts/World.meta create mode 100644 Assets/Scripts/World/PlayerController.cs create mode 100644 Assets/Scripts/World/PlayerController.cs.meta create mode 100644 Assets/Scripts/World/PortalCamera.cs create mode 100644 Assets/Scripts/World/PortalCamera.cs.meta create mode 100644 Assets/Scripts/World/PortalManager.cs create mode 100644 Assets/Scripts/World/PortalManager.cs.meta diff --git a/Assets/Prefabs/Portal.prefab b/Assets/Prefabs/Portal.prefab new file mode 100644 index 0000000..6e70b15 --- /dev/null +++ b/Assets/Prefabs/Portal.prefab @@ -0,0 +1,202 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &1257543334051943221 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1899517953744655820} + - component: {fileID: 6710144271987578809} + m_Layer: 0 + m_Name: Manager + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1899517953744655820 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1257543334051943221} + 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: 9168768580810178490} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &6710144271987578809 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1257543334051943221} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 68fb822b7ca1a9e489bf21abe980ed13, type: 3} + m_Name: + m_EditorClassIdentifier: + m_OtherPortal: {fileID: 0} + m_PlayerCamera: {fileID: 0} + m_CameraPrefab: {fileID: 6620949641348159012, guid: 0cd50968a40c32243956acc30338a258, + type: 3} + m_Renderers: + - {fileID: 2963162269859711420} + m_PlayerPoint: {fileID: 8909126833140872428} + m_PortalCamera: {fileID: 0} +--- !u!1 &2828900946752256695 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5314959578156838273} + - component: {fileID: 529949781680680418} + - component: {fileID: 2963162269859711420} + m_Layer: 0 + m_Name: RenderSurface + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &5314959578156838273 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2828900946752256695} + serializedVersion: 2 + m_LocalRotation: {x: 0.7071068, y: 0, z: 0, w: 0.7071068} + m_LocalPosition: {x: 0, y: 1, z: 0} + m_LocalScale: {x: 0.2, y: 0.2, z: 0.2} + m_ConstrainProportionsScale: 1 + m_Children: [] + m_Father: {fileID: 9168768580810178490} + m_LocalEulerAnglesHint: {x: 90, y: 0, z: 0} +--- !u!33 &529949781680680418 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2828900946752256695} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &2963162269859711420 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2828900946752256695} + 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: 6412be81563725c40bfc6c75b1a58af8, 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 &6892011779330454626 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 9168768580810178490} + m_Layer: 0 + m_Name: Portal + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &9168768580810178490 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6892011779330454626} + 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: 1899517953744655820} + - {fileID: 5314959578156838273} + - {fileID: 8909126833140872428} + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &6987495362055634066 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8909126833140872428} + m_Layer: 0 + m_Name: PlayerPosition + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &8909126833140872428 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6987495362055634066} + serializedVersion: 2 + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -1.8488195, y: 6.4631767, z: 6.55658} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 9168768580810178490} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} diff --git a/Assets/Prefabs/Portal.prefab.meta b/Assets/Prefabs/Portal.prefab.meta new file mode 100644 index 0000000..561c235 --- /dev/null +++ b/Assets/Prefabs/Portal.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 35a37f1ca60417a4393dc48a27c21574 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Prefabs/PortalCamera.prefab b/Assets/Prefabs/PortalCamera.prefab new file mode 100644 index 0000000..a8985a6 --- /dev/null +++ b/Assets/Prefabs/PortalCamera.prefab @@ -0,0 +1,145 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &6620949641348159012 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1723817412309227941} + - component: {fileID: -5260600561633151711} + - component: {fileID: 3116622595035082484} + - component: {fileID: -8011418237207204536} + m_Layer: 0 + m_Name: PortalCamera + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1723817412309227941 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6620949641348159012} + 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!20 &-5260600561633151711 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6620949641348159012} + 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: 0 + orthographic size: 5 + m_Depth: 0 + 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!114 &3116622595035082484 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6620949641348159012} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: ecef1a55a76c4edd8a7a6154094c3d86, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Shader: {fileID: 4800000, guid: 0a42b0980bf770241920f919faeb44e3, type: 3} + m_WorldCamera: {fileID: -5260600561633151711} +--- !u!114 &-8011418237207204536 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6620949641348159012} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: a79441f348de89743a2939f4d699eac1, type: 3} + m_Name: + m_EditorClassIdentifier: + 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_Version: 2 + m_TaaSettings: + m_Quality: 3 + m_FrameInfluence: 0.1 + m_JitterScale: 1 + m_MipBias: 0 + m_VarianceClampScale: 0.9 + m_ContrastAdaptiveSharpening: 0 diff --git a/Assets/Prefabs/PortalCamera.prefab.meta b/Assets/Prefabs/PortalCamera.prefab.meta new file mode 100644 index 0000000..a0b0025 --- /dev/null +++ b/Assets/Prefabs/PortalCamera.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 0cd50968a40c32243956acc30338a258 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scenes/WorldScene.unity b/Assets/Scenes/WorldScene.unity index 85e818c..4567bae 100644 --- a/Assets/Scenes/WorldScene.unity +++ b/Assets/Scenes/WorldScene.unity @@ -698,6 +698,125 @@ MeshFilter: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1069879340} m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1001 &1184458447 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 0} + m_Modifications: + - target: {fileID: 5314959578156838273, guid: 35a37f1ca60417a4393dc48a27c21574, + type: 3} + propertyPath: m_LocalRotation.w + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5314959578156838273, guid: 35a37f1ca60417a4393dc48a27c21574, + type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5314959578156838273, guid: 35a37f1ca60417a4393dc48a27c21574, + type: 3} + propertyPath: m_LocalRotation.y + value: -0.7071068 + objectReference: {fileID: 0} + - target: {fileID: 5314959578156838273, guid: 35a37f1ca60417a4393dc48a27c21574, + type: 3} + propertyPath: m_LocalRotation.z + value: 0.7071068 + objectReference: {fileID: 0} + - target: {fileID: 5314959578156838273, guid: 35a37f1ca60417a4393dc48a27c21574, + type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 180 + objectReference: {fileID: 0} + - target: {fileID: 6710144271987578809, guid: 35a37f1ca60417a4393dc48a27c21574, + type: 3} + propertyPath: m_OtherPortal + value: + objectReference: {fileID: 1904568119} + - target: {fileID: 6710144271987578809, guid: 35a37f1ca60417a4393dc48a27c21574, + type: 3} + propertyPath: m_PlayerCamera + value: + objectReference: {fileID: 1193332430} + - target: {fileID: 6710144271987578809, guid: 35a37f1ca60417a4393dc48a27c21574, + type: 3} + propertyPath: m_Renderers.Array.size + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 6710144271987578809, guid: 35a37f1ca60417a4393dc48a27c21574, + type: 3} + propertyPath: m_Renderers.Array.data[0] + value: + objectReference: {fileID: 1211206071} + - target: {fileID: 6892011779330454626, guid: 35a37f1ca60417a4393dc48a27c21574, + type: 3} + propertyPath: m_Name + value: Portal + objectReference: {fileID: 0} + - target: {fileID: 9168768580810178490, guid: 35a37f1ca60417a4393dc48a27c21574, + type: 3} + propertyPath: m_LocalPosition.x + value: 3 + objectReference: {fileID: 0} + - target: {fileID: 9168768580810178490, guid: 35a37f1ca60417a4393dc48a27c21574, + type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 9168768580810178490, guid: 35a37f1ca60417a4393dc48a27c21574, + type: 3} + propertyPath: m_LocalPosition.z + value: 8 + objectReference: {fileID: 0} + - target: {fileID: 9168768580810178490, guid: 35a37f1ca60417a4393dc48a27c21574, + type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 9168768580810178490, guid: 35a37f1ca60417a4393dc48a27c21574, + type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 9168768580810178490, guid: 35a37f1ca60417a4393dc48a27c21574, + type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 9168768580810178490, guid: 35a37f1ca60417a4393dc48a27c21574, + type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 9168768580810178490, guid: 35a37f1ca60417a4393dc48a27c21574, + type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 9168768580810178490, guid: 35a37f1ca60417a4393dc48a27c21574, + type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 9168768580810178490, guid: 35a37f1ca60417a4393dc48a27c21574, + type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 35a37f1ca60417a4393dc48a27c21574, type: 3} +--- !u!1 &1184458448 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 6892011779330454626, guid: 35a37f1ca60417a4393dc48a27c21574, + type: 3} + m_PrefabInstance: {fileID: 1184458447} + m_PrefabAsset: {fileID: 0} --- !u!1 &1193332428 GameObject: m_ObjectHideFlags: 0 @@ -709,6 +828,8 @@ GameObject: - component: {fileID: 1193332431} - component: {fileID: 1193332430} - component: {fileID: 1193332429} + - component: {fileID: 1193332432} + - component: {fileID: 1193332433} m_Layer: 0 m_Name: Main Camera m_TagString: MainCamera @@ -734,7 +855,7 @@ Camera: m_Enabled: 1 serializedVersion: 2 m_ClearFlags: 1 - m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} + m_BackGroundColor: {r: 0, g: 0, b: 0, a: 1} m_projectionMatrixMode: 1 m_GateFitMode: 2 m_FOVAxisMode: 0 @@ -784,12 +905,74 @@ Transform: m_GameObject: {fileID: 1193332428} serializedVersion: 2 m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 1, z: -10} + m_LocalPosition: {x: 3.083, y: 1, z: -0.496} 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 &1193332432 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1193332428} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: a79441f348de89743a2939f4d699eac1, type: 3} + m_Name: + m_EditorClassIdentifier: + 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_Version: 2 + m_TaaSettings: + m_Quality: 3 + m_FrameInfluence: 0.1 + m_JitterScale: 1 + m_MipBias: 0 + m_VarianceClampScale: 0.9 + m_ContrastAdaptiveSharpening: 0 +--- !u!114 &1193332433 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1193332428} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 42603e4f95b24efa85355a04450c20e2, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!23 &1211206071 stripped +MeshRenderer: + m_CorrespondingSourceObject: {fileID: 2963162269859711420, guid: 35a37f1ca60417a4393dc48a27c21574, + type: 3} + m_PrefabInstance: {fileID: 1184458447} + m_PrefabAsset: {fileID: 0} --- !u!1 &1559526188 GameObject: m_ObjectHideFlags: 0 @@ -1108,6 +1291,120 @@ MeshFilter: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1791789525} m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1001 &1904568118 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 0} + m_Modifications: + - target: {fileID: 5314959578156838273, guid: 35a37f1ca60417a4393dc48a27c21574, + type: 3} + propertyPath: m_LocalRotation.w + value: 0.7071068 + objectReference: {fileID: 0} + - target: {fileID: 5314959578156838273, guid: 35a37f1ca60417a4393dc48a27c21574, + type: 3} + propertyPath: m_LocalRotation.x + value: 0.7071068 + objectReference: {fileID: 0} + - target: {fileID: 5314959578156838273, guid: 35a37f1ca60417a4393dc48a27c21574, + type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5314959578156838273, guid: 35a37f1ca60417a4393dc48a27c21574, + type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5314959578156838273, guid: 35a37f1ca60417a4393dc48a27c21574, + type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 90 + objectReference: {fileID: 0} + - target: {fileID: 5314959578156838273, guid: 35a37f1ca60417a4393dc48a27c21574, + type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6710144271987578809, guid: 35a37f1ca60417a4393dc48a27c21574, + type: 3} + propertyPath: m_OtherPortal + value: + objectReference: {fileID: 1184458448} + - target: {fileID: 6710144271987578809, guid: 35a37f1ca60417a4393dc48a27c21574, + type: 3} + propertyPath: m_PlayerCamera + value: + objectReference: {fileID: 1193332430} + - target: {fileID: 6892011779330454626, guid: 35a37f1ca60417a4393dc48a27c21574, + type: 3} + propertyPath: m_Name + value: Portal + objectReference: {fileID: 0} + - target: {fileID: 9168768580810178490, guid: 35a37f1ca60417a4393dc48a27c21574, + type: 3} + propertyPath: m_LocalPosition.x + value: -3 + objectReference: {fileID: 0} + - target: {fileID: 9168768580810178490, guid: 35a37f1ca60417a4393dc48a27c21574, + type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 9168768580810178490, guid: 35a37f1ca60417a4393dc48a27c21574, + type: 3} + propertyPath: m_LocalPosition.z + value: -8 + objectReference: {fileID: 0} + - target: {fileID: 9168768580810178490, guid: 35a37f1ca60417a4393dc48a27c21574, + type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 9168768580810178490, guid: 35a37f1ca60417a4393dc48a27c21574, + type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 9168768580810178490, guid: 35a37f1ca60417a4393dc48a27c21574, + type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 9168768580810178490, guid: 35a37f1ca60417a4393dc48a27c21574, + type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 9168768580810178490, guid: 35a37f1ca60417a4393dc48a27c21574, + type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 9168768580810178490, guid: 35a37f1ca60417a4393dc48a27c21574, + type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 9168768580810178490, guid: 35a37f1ca60417a4393dc48a27c21574, + type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 35a37f1ca60417a4393dc48a27c21574, type: 3} +--- !u!1 &1904568119 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 6892011779330454626, guid: 35a37f1ca60417a4393dc48a27c21574, + type: 3} + m_PrefabInstance: {fileID: 1904568118} + m_PrefabAsset: {fileID: 0} --- !u!1 &1979615911 GameObject: m_ObjectHideFlags: 0 @@ -1258,3 +1555,5 @@ SceneRoots: - {fileID: 1193332431} - {fileID: 798257144} - {fileID: 783130826} + - {fileID: 1184458447} + - {fileID: 1904568118} diff --git a/Assets/Scripts/Shaders.meta b/Assets/Scripts/Shaders.meta new file mode 100644 index 0000000..2c4d3a5 --- /dev/null +++ b/Assets/Scripts/Shaders.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: df8306483d8e4d94e8c0548fd23da7fd +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Shaders/ScreenCutoutShader.shader b/Assets/Scripts/Shaders/ScreenCutoutShader.shader new file mode 100644 index 0000000..5545142 --- /dev/null +++ b/Assets/Scripts/Shaders/ScreenCutoutShader.shader @@ -0,0 +1,58 @@ +Shader "Unlit/ScreenCutoutShader" +{ + Properties + { + _MainTex ("Texture", 2D) = "white" {} + } + SubShader + { + Tags{ "Queue" = "Transparent" "IgnoreProjector" = "True" "RenderType" = "Transparent" } + Lighting Off + Cull Back + ZWrite On + ZTest Less + + Fog{ Mode Off } + + Pass + { + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + + #include "UnityCG.cginc" + + struct appdata + { + float4 vertex : POSITION; + float2 uv : TEXCOORD0; + }; + + struct v2f + { + //float2 uv : TEXCOORD0; + float4 vertex : SV_POSITION; + float4 screenPos : TEXCOORD1; + }; + + v2f vert (appdata v) + { + v2f o; + o.vertex = UnityObjectToClipPos(v.vertex); + o.screenPos = ComputeScreenPos(o.vertex); + return o; + } + + sampler2D _MainTex; + + fixed4 frag (v2f i) : SV_Target + { + i.screenPos /= i.screenPos.w; + fixed4 col = tex2D(_MainTex, float2(i.screenPos.x, i.screenPos.y)); + + return col; + } + ENDCG + } + } +} diff --git a/Assets/Scripts/Shaders/ScreenCutoutShader.shader.meta b/Assets/Scripts/Shaders/ScreenCutoutShader.shader.meta new file mode 100644 index 0000000..79eafa6 --- /dev/null +++ b/Assets/Scripts/Shaders/ScreenCutoutShader.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 0a42b0980bf770241920f919faeb44e3 +ShaderImporter: + externalObjects: {} + defaultTextures: [] + nonModifiableTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/World.meta b/Assets/Scripts/World.meta new file mode 100644 index 0000000..e1b9bd1 --- /dev/null +++ b/Assets/Scripts/World.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 57d3d2a9ac7b9104d91c175bc98946c7 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/World/PlayerController.cs b/Assets/Scripts/World/PlayerController.cs new file mode 100644 index 0000000..b4b28ae --- /dev/null +++ b/Assets/Scripts/World/PlayerController.cs @@ -0,0 +1,14 @@ +using UnityEngine; + +namespace InterfaceOff.WorldScene +{ + public class PlayerController : MonoBehaviour + { + private static PlayerController Instance; + + public static void SetPos(Vector3 pos) + { + Instance.transform.position = pos; + } + } +} \ No newline at end of file diff --git a/Assets/Scripts/World/PlayerController.cs.meta b/Assets/Scripts/World/PlayerController.cs.meta new file mode 100644 index 0000000..fb0a26b --- /dev/null +++ b/Assets/Scripts/World/PlayerController.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 42603e4f95b24efa85355a04450c20e2 +timeCreated: 1768499006 \ No newline at end of file diff --git a/Assets/Scripts/World/PortalCamera.cs b/Assets/Scripts/World/PortalCamera.cs new file mode 100644 index 0000000..562485b --- /dev/null +++ b/Assets/Scripts/World/PortalCamera.cs @@ -0,0 +1,76 @@ +using UnityEngine; + +namespace InterfaceOff.WorldScene +{ + [RequireComponent(typeof(Camera))] + public class PortalCamera : MonoBehaviour + { + [Header("Components")] + [SerializeField] Shader m_Shader; + [SerializeField] Camera m_WorldCamera; + + // Private members // + + PortalManager m_DisplayPortal; + PortalManager m_CapturePortal; + + RenderTexture m_RenderTexture; + Material m_RenderMaterial; + + Camera m_Camera; + + Vector3 m_Rot; + + // Initialistion function for the camera + public void InitCamera(MeshRenderer[] renderers, PortalManager creator, Vector3 rot) + { + // Transfers the passed rotation to be stored within the class + m_Rot = rot; + + // Stores both portals + m_CapturePortal = creator.Linked(); + m_DisplayPortal = creator; + + // Gets the camera from the component + m_Camera = gameObject.GetComponent(); + m_Camera.fieldOfView = m_WorldCamera.fieldOfView; + + // Creates the render texture + RenderTextureDescriptor descriptor = new(Screen.width, Screen.height); + m_RenderTexture = new RenderTexture(descriptor); + + // Creates a material from the Cutout shader + // Needs to be created via code as all the materials have different settings + m_RenderMaterial = new Material(m_Shader); + + // 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 + + foreach (Renderer renderer in renderers) + { + renderer.material = m_RenderMaterial; + } + } + + void LateUpdate() + { + // Gets the offset of the player from the display portal + Vector3 offset = m_DisplayPortal.PlayerOffset(); + + // Translates it to the capture portal and assigns it to the camera position + Transform t = m_CapturePortal.transform.parent; + transform.position = t.position + offset; + + // Calculate angle stuff (not needed because angle always stays the same in this duct tape version) + //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(0f, m_CapturePortal.CamDif(), 0f); + //transform.parent.eulerAngles = Quaternion.LookRotation(newCamDir, Vector3.up).eulerAngles + m_Rot + d; + } + } +} diff --git a/Assets/Scripts/World/PortalCamera.cs.meta b/Assets/Scripts/World/PortalCamera.cs.meta new file mode 100644 index 0000000..9caa0ae --- /dev/null +++ b/Assets/Scripts/World/PortalCamera.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: ecef1a55a76c4edd8a7a6154094c3d86 +timeCreated: 1768498426 \ No newline at end of file diff --git a/Assets/Scripts/World/PortalManager.cs b/Assets/Scripts/World/PortalManager.cs new file mode 100644 index 0000000..0aaf139 --- /dev/null +++ b/Assets/Scripts/World/PortalManager.cs @@ -0,0 +1,62 @@ +using UnityEngine; + +namespace InterfaceOff.WorldScene +{ + public class PortalManager : MonoBehaviour + { + [Header("References")] + [SerializeField] GameObject m_OtherPortal; + [SerializeField] Camera m_PlayerCamera; + + [Header("Set References")] + [SerializeField] GameObject m_CameraPrefab; + [SerializeField] MeshRenderer[] m_Renderers; + [SerializeField] Transform m_PlayerPoint; + + // Private variables // + + PortalManager m_OtherManager; + [SerializeField] PortalCamera m_PortalCamera; + + // Gets the other end of the portal + public PortalManager Linked() => m_OtherManager; + + // Gets the location of the player relative to the portal + public Vector3 PlayerOffset() => m_PlayerPoint.localPosition; + + // Start is called before the first frame update + void Start() + { + // Validates that it is a portal + m_OtherManager = m_OtherPortal.GetComponentInChildren(); + if (m_OtherManager == null) + { + Debug.LogError("OtherPortal was not valid portal"); + return; + } + + // Creates the camera in top-level heirachry and stores the PortalCamera script + GameObject cam = Instantiate(m_CameraPrefab, transform.root.parent); + m_PortalCamera = cam.GetComponentInChildren(); + + // Initialises the camera so it renders to the portal and not the screen + m_PortalCamera.InitCamera(m_Renderers, this, transform.parent.localEulerAngles * 2.0f); + } + + void LateUpdate() => m_PlayerPoint.position = m_PlayerCamera.transform.position; + + // When something enters the portal + private void OnTriggerEnter(Collider other) + { + // Changing the state if it is not the player will cause issues + if (!other.CompareTag("Player")) + { + return; + } + + // Calculates if the player is going towards the portal + Vector3 difference = m_PlayerCamera.transform.position - transform.position; + PlayerController.SetPos(m_OtherManager.transform.position + difference - new Vector3(0, 1.0f, 0)); + } + } +} diff --git a/Assets/Scripts/World/PortalManager.cs.meta b/Assets/Scripts/World/PortalManager.cs.meta new file mode 100644 index 0000000..112a9a9 --- /dev/null +++ b/Assets/Scripts/World/PortalManager.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 68fb822b7ca1a9e489bf21abe980ed13 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: