Files
dungeons/Assets/ThirdParty/UltimateXR/Samples/FullScene/Scripts/GlobalLogic.cs

186 lines
8.1 KiB
C#

// --------------------------------------------------------------------------------------------------------------------
// <copyright file="GlobalLogic.cs" company="VRMADA">
// Copyright (c) VRMADA, All rights reserved.
// </copyright>
// --------------------------------------------------------------------------------------------------------------------
using UltimateXR.Avatar;
using UltimateXR.CameraUtils;
using UltimateXR.Core;
using UltimateXR.Core.Components;
using UltimateXR.Devices.Keyboard;
using UltimateXR.Examples.FullScene.Doors;
using UltimateXR.Extensions.Unity;
using UltimateXR.Extensions.Unity.Math;
using UltimateXR.Locomotion;
using UnityEngine;
using UnityEngine.SceneManagement;
namespace UltimateXR.Examples.FullScene
{
public class GlobalLogic : UxrComponent
{
#region Inspector Properties/Serialized Fields
[Header("Spawn positions")] [SerializeField] private Transform _spawnMain;
[SerializeField] private Transform _spawnLab;
[SerializeField] private Transform _spawnControllers;
[SerializeField] private Transform _spawnShootingRange;
[Header("Location volumes")] [SerializeField] private BoxCollider _boxSpawnRoomMirror;
[SerializeField] private BoxCollider _boxSpawnRoomDoor;
[SerializeField] private BoxCollider _boxCentralRoom;
[SerializeField] private BoxCollider _boxLabRoom;
[SerializeField] private BoxCollider _boxControllerRoom;
[SerializeField] private BoxCollider _boxShootingRange;
[Header("Relevant elements")] [SerializeField] private GameObject _rootUnrestrictedArea;
[SerializeField] private GameObject _rootRestrictedArea;
[SerializeField] private UxrComponent _mirrorComponent;
[SerializeField] private GameObject _controllerRoomElements;
[SerializeField] private GameObject _rootLabElements;
[SerializeField] private ArmoredDoor _armoredDoor;
#endregion
#region Unity
/// <summary>
/// Subscribes to avatar events.
/// </summary>
protected override void OnEnable()
{
base.OnEnable();
UxrAvatar.LocalAvatarStarted += UxrAvatar_LocalAvatarStarted;
UxrAvatar.GlobalAvatarMoved += UxrAvatar_GlobalAvatarMoved;
UxrManager.AvatarsUpdated += UxrManager_AvatarsUpdated;
}
/// <summary>
/// Unsubscribes from avatar events.
/// </summary>
protected override void OnDisable()
{
base.OnDisable();
UxrAvatar.LocalAvatarStarted -= UxrAvatar_LocalAvatarStarted;
UxrAvatar.GlobalAvatarMoved -= UxrAvatar_GlobalAvatarMoved;
UxrManager.AvatarsUpdated -= UxrManager_AvatarsUpdated;
}
/// <summary>
/// Handles some keyboard shortcuts to reset, quit or quick spawn to different places.
/// </summary>
private void Update()
{
if (UxrKeyboardInput.GetPressDown(UxrKey.Enter))
{
SceneManager.LoadScene(0);
}
else if (UxrKeyboardInput.GetPressDown(UxrKey.Q))
{
Application.Quit();
}
if (UxrKeyboardInput.GetPressDown(UxrKey.Digit1))
{
UxrManager.Instance.TeleportLocalAvatar(_spawnMain.position, _spawnMain.rotation, UxrTranslationType.Fade);
}
else if (UxrKeyboardInput.GetPressDown(UxrKey.Digit2))
{
UxrManager.Instance.TeleportLocalAvatar(_spawnLab.position, _spawnLab.rotation, UxrTranslationType.Fade);
}
else if (UxrKeyboardInput.GetPressDown(UxrKey.Digit3))
{
UxrManager.Instance.TeleportLocalAvatar(_spawnControllers.position, _spawnControllers.rotation, UxrTranslationType.Fade);
}
else if (UxrKeyboardInput.GetPressDown(UxrKey.Digit4))
{
UxrManager.Instance.TeleportLocalAvatar(_spawnShootingRange.position, _spawnShootingRange.rotation, UxrTranslationType.Fade);
}
}
#endregion
#region Event Handling Methods
/// <summary>
/// Called when the local avatar called its Start(). Moves the avatar to the spawn point and initializes the visible
/// elements.
/// </summary>
/// <param name="sender">Event sender</param>
/// <param name="e">Event parameters</param>
private void UxrAvatar_LocalAvatarStarted(object sender, UxrAvatarStartedEventArgs e)
{
UxrManager.Instance.MoveAvatarTo(UxrAvatar.LocalAvatar, _spawnMain);
UpdateVisibility();
}
/// <summary>
/// Called when the avatar moved/teleported. We use it to enable/disable objects based on potential visibility.
/// </summary>
/// <param name="sender">Sender</param>
/// <param name="e">Event parameters</param>
private void UxrAvatar_GlobalAvatarMoved(object sender, UxrAvatarMoveEventArgs e)
{
if (ReferenceEquals(sender, UxrAvatar.LocalAvatar))
{
UpdateVisibility();
}
}
/// <summary>
/// Called each frame after all avatars have been updated.
/// </summary>
private void UxrManager_AvatarsUpdated()
{
if (UxrAvatar.LocalAvatar == null || UxrCameraWallFade.IsAvatarPeekingThroughGeometry(UxrAvatar.LocalAvatar))
{
return;
}
_rootRestrictedArea.CheckSetActive(UxrAvatar.LocalAvatar.CameraPosition.IsInsideBox(_boxShootingRange) || _armoredDoor.OpenValue > 0.0f);
_rootUnrestrictedArea.CheckSetActive(!UxrAvatar.LocalAvatar.CameraPosition.IsInsideBox(_boxShootingRange) || _armoredDoor.OpenValue > 0.0f);
}
#endregion
#region Private Methods
/// <summary>
/// Updates the visible elements based on the current avatar position.
/// </summary>
private void UpdateVisibility()
{
if (UxrAvatar.LocalAvatar == null || UxrCameraWallFade.IsAvatarPeekingThroughGeometry(UxrAvatar.LocalAvatar))
{
return;
}
_mirrorComponent.CheckSetEnabled(UxrAvatar.LocalAvatar.CameraPosition.IsInsideBox(_boxSpawnRoomMirror));
_rootRestrictedArea.CheckSetActive(UxrAvatar.LocalAvatar.CameraPosition.IsInsideBox(_boxShootingRange) || _armoredDoor.OpenValue > 0.0f);
_rootUnrestrictedArea.CheckSetActive(!UxrAvatar.LocalAvatar.CameraPosition.IsInsideBox(_boxShootingRange) || _armoredDoor.OpenValue > 0.0f);
if (UxrAvatar.LocalAvatar.CameraPosition.IsInsideBox(_boxSpawnRoomMirror))
{
_controllerRoomElements.CheckSetActive(false);
_rootLabElements.CheckSetActive(false);
}
else if (UxrAvatar.LocalAvatar.CameraPosition.IsInsideBox(_boxSpawnRoomDoor))
{
_controllerRoomElements.CheckSetActive(false);
_rootLabElements.CheckSetActive(true);
}
else if (UxrAvatar.LocalAvatar.CameraPosition.IsInsideBox(_boxCentralRoom) || UxrAvatar.LocalAvatar.CameraPosition.IsInsideBox(_boxLabRoom) || UxrAvatar.LocalAvatar.CameraPosition.IsInsideBox(_boxControllerRoom))
{
_controllerRoomElements.CheckSetActive(true);
_rootLabElements.CheckSetActive(true);
}
else if (UxrAvatar.LocalAvatar.CameraPosition.IsInsideBox(_boxShootingRange))
{
_controllerRoomElements.CheckSetActive(false);
_rootLabElements.CheckSetActive(false);
}
}
#endregion
}
}