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

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));
}