CarmenSandiego/Assets/UdonSharp/Cameras/CameraControllerRound3.cs
Jamie Greunbaum 001be2af0e - Refactored CameraTimedSwitcher to use an internal timer instead of delays.
- Added extra switchers to rounds 1 and 2 to better control camera transitions.
- Fixed improper camera switches on incorrect answers during round 2.
2026-03-24 05:16:30 -04:00

249 lines
6.3 KiB
C#

using UdonSharp;
using UnityEngine;
using VRC.SDKBase;
[UdonBehaviourSyncMode(BehaviourSyncMode.Manual)]
public class CameraControllerRound3 : CameraControllerBase
{
[Space]
[SerializeField] public Camera PlayerCamera;
[SerializeField] public Camera HostCamera;
[SerializeField] public Camera OverheadCamera;
[SerializeField] public Camera FrontCamera;
[SerializeField] public Camera PrimaryFocusCamera;
[SerializeField] public Camera VideoPlayerCamera;
[Space]
[SerializeField] public GameObject PlayfieldSwitchTriggerGroup;
[Space]
[SerializeField] public CameraTimedSwitcher HostPlayerTimerToggle;
[Space]
[SerializeField] public Animator _CameraAnimator;
[Space]
[SerializeField] public CameraAnchor HostStartingCameraAnchor;
[SerializeField] public CameraAnchor PlayerStartingCameraAnchor;
[SerializeField] public CameraAnchor OverheadCameraAnchor;
[SerializeField] public CameraAnchor FrontCameraAnchor;
[SerializeField] public CameraAnchor NewspaperCameraAnchor;
[SerializeField] public CameraAnchor VideoPlayerCameraAnchor;
[Space]
[SerializeField] public CameraAnchor[] HostCameraAnchorSequence;
[SerializeField] public CameraAnchor[] PlayerCameraAnchorSequence;
[UdonSynced, FieldChangeCallback(nameof(ActivatePlayfieldSwitchTriggerGroup))] private bool _ActivatePlayfieldSwitchTriggerGroup = false;
[UdonSynced, FieldChangeCallback(nameof(MarkerCameraAnchorPosition))] private int _MarkerCameraAnchorPosition = -1;
[UdonSynced, FieldChangeCallback(nameof(_PlayIFeelGoodCallback))] private bool _PlayIFeelGood = false;
[UdonSynced, FieldChangeCallback(nameof(_PlayDoItRockapellaCallback))] private bool _PlayDoItRockapella = false;
public override void InitialiseCameras()
{
DisableAllSwitchers();
DisableAllTriggers();
HostStartingCameraAnchor.AttachCamera(PlayerCamera);
PlayerStartingCameraAnchor.AttachCamera(HostCamera);
OverheadCameraAnchor.AttachCamera(OverheadCamera);
FrontCameraAnchor.AttachCamera(FrontCamera);
NewspaperCameraAnchor.AttachCamera(PrimaryFocusCamera);
VideoPlayerCameraAnchor.AttachCamera(VideoPlayerCamera);
HostCameraAnchorSequence[0].AttachCamera(HostCamera);
PlayerCameraAnchorSequence[0].AttachCamera(PlayerCamera);
ActivatePlayfieldSwitchTriggerGroup = false;
PlayIFeelGood(false);
PlayDoItRockapella(false);
}
public override void DeinitialiseCameras()
{
PlayIFeelGood(false);
PlayDoItRockapella(false);
base.DeinitialiseCameras();
}
public override void OnOwnershipTransferred(VRCPlayerApi Player)
{
Networking.SetOwner(Player, PlayerCamera.gameObject);
Networking.SetOwner(Player, HostCamera.gameObject);
Networking.SetOwner(Player, OverheadCamera.gameObject);
Networking.SetOwner(Player, FrontCamera.gameObject);
Networking.SetOwner(Player, PrimaryFocusCamera.gameObject);
Networking.SetOwner(Player, VideoPlayerCamera.gameObject);
Networking.SetOwner(Player, PlayfieldSwitchTriggerGroup);
Networking.SetOwner(Player, HostPlayerTimerToggle.gameObject);
Networking.SetOwner(Player, _CameraAnimator.gameObject);
Networking.SetOwner(Player, HostStartingCameraAnchor.gameObject);
Networking.SetOwner(Player, PlayerStartingCameraAnchor.gameObject);
Networking.SetOwner(Player, OverheadCameraAnchor.gameObject);
Networking.SetOwner(Player, FrontCameraAnchor.gameObject);
Networking.SetOwner(Player, NewspaperCameraAnchor.gameObject);
Networking.SetOwner(Player, VideoPlayerCameraAnchor.gameObject);
base.OnOwnershipTransferred(Player);
}
public void SwitchToPlayerCamera()
{
SwitchToLiveCamera(PlayerCamera);
}
public void SwitchToHostCamera()
{
SwitchToLiveCamera(HostCamera);
}
public void SwitchToOverheadCamera()
{
SwitchToLiveCamera(OverheadCamera);
}
public void SwitchToFrontCamera()
{
SwitchToLiveCamera(FrontCamera);
}
public void SwitchToVideoPlayerCamera()
{
SwitchToLiveCamera(VideoPlayerCamera);
}
public void OverheadCamera_FollowPlayers(string[] Players, float FollowSpeed = 1.0f)
{
OverheadCameraAnchor.FollowPlayers(Players, FollowSpeed);
}
public void OverheadCamera_StopFollowingPlayers()
{
OverheadCameraAnchor.StopFollowingPlayers();
}
public void FrontCamera_FollowPlayers(string[] Players, float FollowSpeed = 1.0f)
{
FrontCameraAnchor.FollowPlayers(Players, FollowSpeed);
}
public void FrontCamera_StopFollowingPlayers()
{
FrontCameraAnchor.StopFollowingPlayers();
}
private void _OnPlayfieldSwitchTriggerGroupChanged()
{
PlayfieldSwitchTriggerGroup.SetActive(ActivatePlayfieldSwitchTriggerGroup);
RequestSerialization();
}
public void ActivateWideShotCamera()
{
//DefaultWideShotCameraAnchor.AttachCamera(PrimaryFocusCamera);
}
public void SwitchToWideShotCamera()
{
//DisableAllSwitchers();
//ActivateWideShotCamera();
//SwitchToLiveCamera(PrimaryFocusCamera);
}
public void ActivateHostPlayerCameraSwitcher()
{
ActivateCameraSwitcher(HostPlayerTimerToggle);
}
public void PlayIFeelGood(bool Play)
{
if (Play)
{
SwitchToOverheadCamera();
}
_PlayIFeelGoodCallback = Play;
RequestSerialization();
}
public void PlayDoItRockapella(bool Play)
{
if (Play)
{
SwitchToOverheadCamera();
}
_PlayDoItRockapellaCallback = Play;
RequestSerialization();
}
public override void DisableAllTriggers()
{
ActivatePlayfieldSwitchTriggerGroup = false;
}
public override void DisableAllSwitchers()
{
ActivateCameraSwitcher(null);
}
public bool ActivatePlayfieldSwitchTriggerGroup
{
set
{
_ActivatePlayfieldSwitchTriggerGroup = value;
_OnPlayfieldSwitchTriggerGroupChanged();
}
get => _ActivatePlayfieldSwitchTriggerGroup;
}
public int MarkerCameraAnchorPosition
{
set
{
_MarkerCameraAnchorPosition = value;
_ChangeMarkerCameraPosition();
}
get => _MarkerCameraAnchorPosition;
}
private void _ChangeMarkerCameraPosition()
{
HostCameraAnchorSequence[MarkerCameraAnchorPosition].AttachCamera(HostCamera);
PlayerCameraAnchorSequence[MarkerCameraAnchorPosition].AttachCamera(PlayerCamera);
RequestSerialization();
}
private bool _PlayIFeelGoodCallback
{
set
{
_PlayIFeelGood = value;
_CameraAnimator.SetBool("Play I Feel Good", _PlayIFeelGood);
}
get => _PlayIFeelGood;
}
private bool _PlayDoItRockapellaCallback
{
set
{
_PlayDoItRockapella = value;
_CameraAnimator.SetBool("Play Do It Rockapella", _PlayDoItRockapella);
}
get => _PlayDoItRockapella;
}
}