improve portal collider to prevent unwanted teleportation

This commit is contained in:
2022-11-28 21:44:00 +01:00
parent efe3cceba1
commit 8398d29f25
8 changed files with 205 additions and 77 deletions

Binary file not shown.

View File

@@ -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

View File

@@ -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}

View File

@@ -24,9 +24,8 @@ namespace EscapeRoomEngine.Portal.Runtime
/// </summary>
[BoxGroup("Internal")] public Transform portalTransform;
private bool Connected => linkedPortal != null;
private readonly List<PortalDriver> _closePortalDrivers = new();
internal bool Connected => linkedPortal != null;
internal readonly List<PortalDriver> 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<PortalDriver>();
if (portalDriver && !_closePortalDrivers.Contains(portalDriver))
{
StartTrackingDriver(portalDriver, CalculateSide(portalDriver.transform));
}
}
}
private void OnTriggerExit(Collider other)
{
if (Connected)
{
var portalDriver = other.GetComponent<PortalDriver>();
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));
}

View File

@@ -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<Collider>().isTrigger) throw new EngineException("Collider must be a trigger.");
}
private void OnTriggerEnter(Collider other)
{
if (portal.Connected)
{
var portalDriver = other.GetComponent<PortalDriver>();
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<PortalDriver>();
if (portalDriver)
{
portal.StopTrackingDriver(portalDriver);
}
}
}
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: bcd51a92199746578f25ab67160cc13d
timeCreated: 1669678918

View File

@@ -806,7 +806,7 @@ MonoBehaviour:
m_Name:
m_EditorClassIdentifier:
loggingEnabled: 1
typeFilter: 0000000008000000
typeFilter: 00000000
--- !u!1 &1943716334
GameObject:
m_ObjectHideFlags: 0