improve portal collider to prevent unwanted teleportation
This commit is contained in:
@@ -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));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user