improve portal collider to prevent unwanted teleportation
This commit is contained in:
BIN
Assets/Desert/Assets/Models/Desert Portal.blend
(Stored with Git LFS)
BIN
Assets/Desert/Assets/Models/Desert Portal.blend
(Stored with Git LFS)
Binary file not shown.
Binary file not shown.
@@ -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
|
||||
|
||||
@@ -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}
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
|
||||
42
Assets/Portal/Runtime/PortalCollider.cs
Normal file
42
Assets/Portal/Runtime/PortalCollider.cs
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
3
Assets/Portal/Runtime/PortalCollider.cs.meta
Normal file
3
Assets/Portal/Runtime/PortalCollider.cs.meta
Normal file
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: bcd51a92199746578f25ab67160cc13d
|
||||
timeCreated: 1669678918
|
||||
@@ -806,7 +806,7 @@ MonoBehaviour:
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
loggingEnabled: 1
|
||||
typeFilter: 0000000008000000
|
||||
typeFilter: 00000000
|
||||
--- !u!1 &1943716334
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
|
||||
Reference in New Issue
Block a user