diff --git a/Assets/Desert/Assets/Models/Desert Portal.blend b/Assets/Desert/Assets/Models/Desert Portal.blend index 15766aa..9eaca69 100644 --- a/Assets/Desert/Assets/Models/Desert Portal.blend +++ b/Assets/Desert/Assets/Models/Desert Portal.blend @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:8b33453ef10342c8972321be7c23b10e675632a9935ee9683473a963385cf667 -size 887896 +oid sha256:76d0412d7d37d4969b84036e62760230d520e00529a05594f3d8e7d00b1029a2 +size 902320 diff --git a/Assets/Desert/Assets/Models/Desert Portal.blend1 b/Assets/Desert/Assets/Models/Desert Portal.blend1 index 5782022..271d2a2 100644 Binary files a/Assets/Desert/Assets/Models/Desert Portal.blend1 and b/Assets/Desert/Assets/Models/Desert Portal.blend1 differ diff --git a/Assets/Desert/Assets/Modules/Portal/Desert Portal Entrance.prefab b/Assets/Desert/Assets/Modules/Portal/Desert Portal Entrance.prefab index 4317eec..195e703 100644 --- a/Assets/Desert/Assets/Modules/Portal/Desert Portal Entrance.prefab +++ b/Assets/Desert/Assets/Modules/Portal/Desert Portal Entrance.prefab @@ -1,5 +1,65 @@ %YAML 1.1 %TAG !u! tag:unity3d.com,2011: +--- !u!1 &2356004090473610063 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 7774350221631063992} + - component: {fileID: 752629358185251236} + - component: {fileID: 8065077931921476553} + m_Layer: 7 + m_Name: Collider + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &7774350221631063992 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2356004090473610063} + m_LocalRotation: {x: 0, y: -0.7071068, z: 0.7071068, w: 0} + m_LocalPosition: {x: 0, y: 0, z: -0.2} + m_LocalScale: {x: -1, y: -1, z: -1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 8069972016317824103} + m_RootOrder: -1 + m_LocalEulerAnglesHint: {x: 90, y: 0, z: 180} +--- !u!64 &752629358185251236 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2356004090473610063} + m_Material: {fileID: 0} + m_IsTrigger: 1 + m_Enabled: 1 + serializedVersion: 4 + m_Convex: 1 + m_CookingOptions: 30 + m_Mesh: {fileID: 713088202772470133, guid: a888d535ef5e563418cb8711b9de7c16, type: 3} +--- !u!114 &8065077931921476553 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2356004090473610063} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: bcd51a92199746578f25ab67160cc13d, type: 3} + m_Name: + m_EditorClassIdentifier: + portal: {fileID: 1249363658} --- !u!1 &2892577287002708294 GameObject: m_ObjectHideFlags: 0 @@ -9,7 +69,7 @@ GameObject: serializedVersion: 6 m_Component: - component: {fileID: 2075043192862140148} - m_Layer: 0 + m_Layer: 7 m_Name: Portal Edge m_TagString: Untagged m_Icon: {fileID: 0} @@ -106,8 +166,8 @@ GameObject: - component: {fileID: 297632034835907229} - component: {fileID: 5559679283225865501} - component: {fileID: 6419237152131296747} - m_Layer: 0 - m_Name: Portal Surface + m_Layer: 7 + m_Name: Surface m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 @@ -120,14 +180,14 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 6999744959693749346} - m_LocalRotation: {x: 0.000000030908623, y: 0.7071068, z: -0.7071067, w: -0.000000030908616} - m_LocalPosition: {x: -0, y: 0, z: -0.20000009} + m_LocalRotation: {x: 0, y: -0.7071068, z: 0.7071068, w: 0} + m_LocalPosition: {x: -0, y: 0, z: -0.2} m_LocalScale: {x: -1, y: -1, z: -1} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 8069972016317824103} m_RootOrder: -1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_LocalEulerAnglesHint: {x: 90, y: 0, z: 180} --- !u!33 &5559679283225865501 MeshFilter: m_ObjectHideFlags: 0 @@ -187,8 +247,8 @@ GameObject: serializedVersion: 6 m_Component: - component: {fileID: 8069972016317824103} - m_Layer: 0 - m_Name: Desert Portal Entrance + m_Layer: 7 + m_Name: Portal m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 @@ -206,6 +266,7 @@ Transform: m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: + - {fileID: 7774350221631063992} - {fileID: 2731753372031835923} - {fileID: 297632034835907229} - {fileID: 2075043192862140148} @@ -224,7 +285,7 @@ GameObject: - component: {fileID: 7791795762741173939} - component: {fileID: 5969531196797302096} - component: {fileID: 17691322601746172} - m_Layer: 0 + m_Layer: 7 m_Name: Camera m_TagString: Untagged m_Icon: {fileID: 0} @@ -380,8 +441,8 @@ GameObject: - component: {fileID: 2731753372031835923} - component: {fileID: 8717415820407753879} - component: {fileID: 4905517471767474057} - m_Layer: 0 - m_Name: Portal Frame + m_Layer: 7 + m_Name: Frame m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 @@ -394,14 +455,14 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 9139844951969793274} - m_LocalRotation: {x: 0.000000030908623, y: 0.7071068, z: -0.7071067, w: -0.000000030908616} - m_LocalPosition: {x: -0, y: 0, z: -0.20000009} + m_LocalRotation: {x: 0, y: -0.7071068, z: 0.7071068, w: 0} + m_LocalPosition: {x: -0, y: 0, z: -0.2} m_LocalScale: {x: -1, y: -1, z: -1} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 8069972016317824103} m_RootOrder: -1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_LocalEulerAnglesHint: {x: 90, y: 0, z: 180} --- !u!33 &8717415820407753879 MeshFilter: m_ObjectHideFlags: 0 diff --git a/Assets/Desert/Assets/Modules/Portal/Desert Portal Exit.prefab b/Assets/Desert/Assets/Modules/Portal/Desert Portal Exit.prefab index 2074681..be1dec5 100644 --- a/Assets/Desert/Assets/Modules/Portal/Desert Portal Exit.prefab +++ b/Assets/Desert/Assets/Modules/Portal/Desert Portal Exit.prefab @@ -1,5 +1,65 @@ %YAML 1.1 %TAG !u! tag:unity3d.com,2011: +--- !u!1 &506243319273626502 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8079730491061412845} + - component: {fileID: 884126343611003350} + - component: {fileID: 974784683793812549} + m_Layer: 7 + m_Name: Collider + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &8079730491061412845 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 506243319273626502} + m_LocalRotation: {x: -0.7071068, y: 0, z: 0, w: 0.7071068} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 534778217790596785} + m_RootOrder: -1 + m_LocalEulerAnglesHint: {x: -90, y: 0, z: 0} +--- !u!64 &884126343611003350 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 506243319273626502} + m_Material: {fileID: 0} + m_IsTrigger: 1 + m_Enabled: 1 + serializedVersion: 4 + m_Convex: 1 + m_CookingOptions: 30 + m_Mesh: {fileID: 1373837989805601541, guid: a888d535ef5e563418cb8711b9de7c16, type: 3} +--- !u!114 &974784683793812549 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 506243319273626502} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: bcd51a92199746578f25ab67160cc13d, type: 3} + m_Name: + m_EditorClassIdentifier: + portal: {fileID: 1249363658} --- !u!1 &698537097821251252 GameObject: m_ObjectHideFlags: 0 @@ -11,8 +71,8 @@ GameObject: - component: {fileID: 7833101140158502987} - component: {fileID: 2716330164156348363} - component: {fileID: 3566871879873967933} - m_Layer: 0 - m_Name: Portal Surface + m_Layer: 7 + m_Name: Surface m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 @@ -25,14 +85,14 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 698537097821251252} - m_LocalRotation: {x: -0.7071068, y: 0, z: -0, w: 0.7071067} + m_LocalRotation: {x: -0.7071068, y: 0, z: 0, w: 0.7071068} m_LocalPosition: {x: -0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 534778217790596785} m_RootOrder: -1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_LocalEulerAnglesHint: {x: -90, y: 0, z: 0} --- !u!33 &2716330164156348363 MeshFilter: m_ObjectHideFlags: 0 @@ -92,8 +152,8 @@ GameObject: serializedVersion: 6 m_Component: - component: {fileID: 534778217790596785} - m_Layer: 0 - m_Name: Desert Portal + m_Layer: 7 + m_Name: Portal m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 @@ -111,6 +171,7 @@ Transform: m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: + - {fileID: 8079730491061412845} - {fileID: 5583485013713733061} - {fileID: 7833101140158502987} - {fileID: 2075043192862140148} @@ -128,8 +189,8 @@ GameObject: - component: {fileID: 5583485013713733061} - component: {fileID: 1184410134851835457} - component: {fileID: 3208325555222820191} - m_Layer: 0 - m_Name: Portal Frame + m_Layer: 7 + m_Name: Frame m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 @@ -142,14 +203,14 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1604096967460232748} - m_LocalRotation: {x: -0.7071068, y: 0, z: -0, w: 0.7071067} + m_LocalRotation: {x: -0.7071068, y: 0, z: 0, w: 0.7071068} m_LocalPosition: {x: -0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 534778217790596785} m_RootOrder: -1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_LocalEulerAnglesHint: {x: -90, y: 0, z: 0} --- !u!33 &1184410134851835457 MeshFilter: m_ObjectHideFlags: 0 @@ -209,7 +270,7 @@ GameObject: serializedVersion: 6 m_Component: - component: {fileID: 2075043192862140148} - m_Layer: 0 + m_Layer: 7 m_Name: Portal Edge m_TagString: Untagged m_Icon: {fileID: 0} @@ -242,7 +303,6 @@ GameObject: m_Component: - component: {fileID: 2246995198243242195} - component: {fileID: 1249363658} - - component: {fileID: 7604291350124895408} m_Layer: 7 m_Name: Desert Portal Exit m_TagString: Untagged @@ -282,19 +342,6 @@ MonoBehaviour: linkedPortal: {fileID: 0} portalCamera: {fileID: 17691322601746172} portalTransform: {fileID: 2075043192862140148} ---- !u!65 &7604291350124895408 -BoxCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 5635962022185625128} - m_Material: {fileID: 0} - m_IsTrigger: 1 - m_Enabled: 1 - serializedVersion: 2 - m_Size: {x: 1, y: 2.05, z: 0.3} - m_Center: {x: 0.5, y: 1.025, z: 0.55} --- !u!1 &7398326895463990628 GameObject: m_ObjectHideFlags: 0 @@ -307,7 +354,7 @@ GameObject: - component: {fileID: 7791795762741173939} - component: {fileID: 5969531196797302096} - component: {fileID: 17691322601746172} - m_Layer: 0 + m_Layer: 7 m_Name: Camera m_TagString: Untagged m_Icon: {fileID: 0} diff --git a/Assets/Portal/Runtime/Portal.cs b/Assets/Portal/Runtime/Portal.cs index d93df1a..421a673 100644 --- a/Assets/Portal/Runtime/Portal.cs +++ b/Assets/Portal/Runtime/Portal.cs @@ -24,9 +24,8 @@ namespace EscapeRoomEngine.Portal.Runtime /// [BoxGroup("Internal")] public Transform portalTransform; - private bool Connected => linkedPortal != null; - - private readonly List _closePortalDrivers = new(); + internal bool Connected => linkedPortal != null; + internal readonly List closePortalDrivers = new(); private void Awake() { @@ -45,9 +44,9 @@ namespace EscapeRoomEngine.Portal.Runtime { if (Connected) { - for (var i = 0; i < _closePortalDrivers.Count; i++) + for (var i = 0; i < closePortalDrivers.Count; i++) { - var portalDriver = _closePortalDrivers[i]; + var portalDriver = closePortalDrivers[i]; if (portalDriver.entrySide < 0 && CalculateSide(portalDriver.transform) >= 0) // must have entered from the front and exited the back { StopTrackingDriver(portalDriver); @@ -59,44 +58,20 @@ namespace EscapeRoomEngine.Portal.Runtime } } - private void StartTrackingDriver(PortalDriver portalDriver, int entrySide) + internal void StartTrackingDriver(PortalDriver portalDriver, int entrySide) { - _closePortalDrivers.Add(portalDriver); + closePortalDrivers.Add(portalDriver); portalDriver.EnableClone(linkedPortal); portalDriver.entrySide = entrySide; } - private void StopTrackingDriver(PortalDriver portalDriver) + internal void StopTrackingDriver(PortalDriver portalDriver) { - _closePortalDrivers.Remove(portalDriver); + closePortalDrivers.Remove(portalDriver); portalDriver.DisableClone(linkedPortal); } - private void OnTriggerEnter(Collider other) - { - if (Connected) - { - var portalDriver = other.GetComponent(); - if (portalDriver && !_closePortalDrivers.Contains(portalDriver)) - { - StartTrackingDriver(portalDriver, CalculateSide(portalDriver.transform)); - } - } - } - - private void OnTriggerExit(Collider other) - { - if (Connected) - { - var portalDriver = other.GetComponent(); - if (portalDriver) - { - StopTrackingDriver(portalDriver); - } - } - } - - private int CalculateSide(Transform portalDriverTransform) + internal int CalculateSide(Transform portalDriverTransform) { return Math.Sign(Vector3.Dot(portalTransform.forward, portalDriverTransform.position - portalTransform.position)); } diff --git a/Assets/Portal/Runtime/PortalCollider.cs b/Assets/Portal/Runtime/PortalCollider.cs new file mode 100644 index 0000000..2a4450c --- /dev/null +++ b/Assets/Portal/Runtime/PortalCollider.cs @@ -0,0 +1,42 @@ +using EscapeRoomEngine.Engine.Runtime.Utilities; +using NaughtyAttributes; +using UnityEngine; + +namespace EscapeRoomEngine.Portal.Runtime +{ + [RequireComponent(typeof(Collider))] + public class PortalCollider : MonoBehaviour + { + [BoxGroup("Internal")] [SerializeField] private Portal portal; + + private void Awake() + { + // check whether the collider is set up correctly + if (!GetComponent().isTrigger) throw new EngineException("Collider must be a trigger."); + } + + private void OnTriggerEnter(Collider other) + { + if (portal.Connected) + { + var portalDriver = other.GetComponent(); + if (portalDriver && !portal.closePortalDrivers.Contains(portalDriver)) + { + portal.StartTrackingDriver(portalDriver, portal.CalculateSide(portalDriver.transform)); + } + } + } + + private void OnTriggerExit(Collider other) + { + if (portal.Connected) + { + var portalDriver = other.GetComponent(); + if (portalDriver) + { + portal.StopTrackingDriver(portalDriver); + } + } + } + } +} \ No newline at end of file diff --git a/Assets/Portal/Runtime/PortalCollider.cs.meta b/Assets/Portal/Runtime/PortalCollider.cs.meta new file mode 100644 index 0000000..390357d --- /dev/null +++ b/Assets/Portal/Runtime/PortalCollider.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: bcd51a92199746578f25ab67160cc13d +timeCreated: 1669678918 \ No newline at end of file diff --git a/Assets/Scenes/TestScene.unity b/Assets/Scenes/TestScene.unity index 4a50eae..a0ce6d7 100644 --- a/Assets/Scenes/TestScene.unity +++ b/Assets/Scenes/TestScene.unity @@ -806,7 +806,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: loggingEnabled: 1 - typeFilter: 0000000008000000 + typeFilter: 00000000 --- !u!1 &1943716334 GameObject: m_ObjectHideFlags: 0