mirror of
https://github.com/Raicuparta/nomai-vr.git
synced 2025-12-11 20:15:08 +01:00
* 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>
76 lines
2.1 KiB
C#
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;
|
|
}
|
|
}
|
|
} |