Files
RoomAwareVR/Assets/VRMPAssets/Scripts/Helpers/CharacterResetter.cs
2025-05-26 00:46:28 +02:00

85 lines
2.4 KiB
C#

using UnityEngine;
using UnityEngine.XR.Interaction.Toolkit.Locomotion.Teleportation;
namespace XRMultiplayer
{
public class CharacterResetter : MonoBehaviour
{
[SerializeField] Vector2 m_MinMaxHeight = new Vector2(-2.5f, 25.0f);
[SerializeField] float m_ResetDistance = 75.0f;
[SerializeField] Vector3 offlinePosition = new Vector3(0, .5f, -12.0f);
[SerializeField] Vector3 onlinePosition = new Vector3(0, .15f, 0);
TeleportationProvider m_TeleportationProvider;
Vector3 m_ResetPosition;
private void Start()
{
XRINetworkGameManager.Connected.Subscribe(UpdateResetPosition);
m_TeleportationProvider = GetComponentInChildren<TeleportationProvider>();
m_ResetPosition = offlinePosition;
ResetPlayer();
}
void UpdateResetPosition(bool connected)
{
if (connected)
{
m_ResetPosition = onlinePosition;
}
else
{
m_ResetPosition = offlinePosition;
ResetPlayer();
}
}
// Update is called once per frame
void Update()
{
if (transform.position.y < m_MinMaxHeight.x)
{
ResetPlayer();
}
else if (transform.position.y > m_MinMaxHeight.y)
{
ResetPlayer();
}
if (Mathf.Abs(transform.position.x) > m_ResetDistance || Mathf.Abs(transform.position.z) > m_ResetDistance)
{
ResetPlayer();
}
}
public void ResetPlayer()
{
ResetPlayer(m_ResetPosition);
}
void ResetPlayer(Vector3 destination)
{
TeleportRequest teleportRequest = new()
{
destinationPosition = destination,
destinationRotation = Quaternion.identity
};
if (!m_TeleportationProvider.QueueTeleportRequest(teleportRequest))
{
Utils.LogWarning("Failed to queue teleport request");
}
}
[ContextMenu("Set Player To Online Position")]
void SetPlayerToOnlinePosition()
{
ResetPlayer(onlinePosition);
}
[ContextMenu("Set Player To Offline Position")]
void SetPlayerToOfflinePosition()
{
ResetPlayer(offlinePosition);
}
}
}