nomai-vr/NomaiVR/UI/HelmetFollowCameraRotation.cs
Ezra Hill aefee463b0
Added Snap Turning (#556)
* Added Snap Turning

- Disabled by default, can be enabled in settings
- Amount per input can be defined in settings (current range is 15 - 90 degrees)
- Default input action is the right thumb stick (same as smooth turn)

* Moved snap turn from slider to selector for settings

* Fixed snap turning with smooth HUD/Helmet

- Previously, the smooth HUD/Helmet would uncomfortably move a long distance after you snap turn
- Now, if smooth HUD and snap turning are both enabled, the helmet snap turns for a frame, then resumes it's previous behavior

* Disable snap turning while in zero-g

---------

Co-authored-by: Raicuparta <Raicuparta@users.noreply.github.com>
2025-03-02 22:55:41 +01:00

76 lines
2.1 KiB
C#

using NomaiVR.ModConfig;
using NomaiVR.Player;
using UnityEngine;
namespace NomaiVR.UI
{
public class HelmetFollowCameraRotation : MonoBehaviour
{
private Quaternion lastFrameRotation;
private const float speed = 0.5f;
private bool smoothEnabled = true;
private bool snapEnabled = false;
private bool snapTurnedLastFrame = false;
private void Start()
{
lastFrameRotation = transform.rotation;
RefreshEnabledSettings();
ModSettings.OnConfigChange += RefreshEnabledSettings;
}
private void OnDestroy()
{
ModSettings.OnConfigChange -= RefreshEnabledSettings;
PlayerBodyPosition.Behaviour.OnSnapTurn -= OnSnapTurn;
}
private void LateUpdate()
{
if (!Camera.main)
{
return;
}
var targetRotation = Camera.main.transform.rotation;
if (!smoothEnabled)
{
transform.rotation = targetRotation;
}
else if (snapEnabled && snapTurnedLastFrame)
{
snapTurnedLastFrame = false;
transform.rotation = targetRotation;
}
else
{
var difference = Mathf.Abs(Quaternion.Angle(lastFrameRotation, targetRotation));
var step = speed * Time.unscaledDeltaTime * difference * difference;
transform.rotation = Quaternion.RotateTowards(lastFrameRotation, targetRotation, step);
}
lastFrameRotation = transform.rotation;
}
private void RefreshEnabledSettings()
{
smoothEnabled = ModSettings.HudSmoothFollow;
snapEnabled = ModSettings.SnapTurning;
PlayerBodyPosition.Behaviour.OnSnapTurn -= OnSnapTurn;
if (snapEnabled)
{
PlayerBodyPosition.Behaviour.OnSnapTurn += OnSnapTurn;
}
}
private void OnSnapTurn()
{
snapTurnedLastFrame = true;
}
}
}