mirror of
https://github.com/Raicuparta/nomai-vr.git
synced 2025-12-11 20:15:08 +01:00
124 lines
4.4 KiB
C#
124 lines
4.4 KiB
C#
using NomaiVR.Hands;
|
|
using NomaiVR.Helpers;
|
|
using NomaiVR.ModConfig;
|
|
using NomaiVR.Tools;
|
|
using UnityEngine;
|
|
|
|
namespace NomaiVR.UI
|
|
{
|
|
internal class HoldPrompts : NomaiVRModule<HoldPrompts.Behaviour, NomaiVRModule.EmptyPatch>
|
|
{
|
|
protected override bool IsPersistent => false;
|
|
protected override OWScene[] Scenes => PlayableScenes;
|
|
|
|
public class Behaviour : MonoBehaviour
|
|
{
|
|
private Transform holdTransform;
|
|
private Canvas promptCanvas;
|
|
private bool isTranslatorPosition;
|
|
|
|
internal void Start()
|
|
{
|
|
promptCanvas = GameObject.Find("ScreenPromptCanvas").GetComponent<Canvas>();
|
|
promptCanvas.gameObject.layer = LayerMask.NameToLayer("VisibleToPlayer");
|
|
promptCanvas.transform.localScale = Vector3.one * 0.0015f;
|
|
|
|
promptCanvas.renderMode = RenderMode.WorldSpace;
|
|
promptCanvas.transform.localPosition = Vector3.zero;
|
|
promptCanvas.transform.localRotation = Quaternion.identity;
|
|
|
|
holdTransform = new GameObject("VrHoldPrompt").transform;
|
|
HandsController.Behaviour.DominantHandBehaviour.Initialized += ParentToDominantHand;
|
|
|
|
promptCanvas.transform.SetParent(holdTransform, false);
|
|
promptCanvas.transform.localPosition = Vector3.down * 0.1f;
|
|
promptCanvas.transform.localRotation = Quaternion.identity;
|
|
SetPositionToHand();
|
|
|
|
foreach (Transform child in promptCanvas.transform)
|
|
{
|
|
child.localPosition = Vector3.zero;
|
|
}
|
|
|
|
ModSettings.OnConfigChange += ParentToDominantHand;
|
|
VRToolSwapper.Equipped += ParentToInteractingHand;
|
|
VRToolSwapper.UnEquipped += ParentToDominantHand;
|
|
}
|
|
|
|
internal void OnDestroy()
|
|
{
|
|
ModSettings.OnConfigChange -= ParentToDominantHand;
|
|
VRToolSwapper.Equipped -= ParentToInteractingHand;
|
|
VRToolSwapper.UnEquipped -= ParentToDominantHand;
|
|
}
|
|
|
|
internal void ParentToInteractingHand()
|
|
{
|
|
if (VRToolSwapper.InteractingHand != null)
|
|
{
|
|
holdTransform.SetParent(VRToolSwapper.InteractingHand.Palm, false);
|
|
UpdateHandPosition();
|
|
}
|
|
else
|
|
ParentToDominantHand();
|
|
}
|
|
|
|
internal void ParentToDominantHand()
|
|
{
|
|
var dominantHand = HandsController.Behaviour.DominantHandBehaviour.Palm;
|
|
holdTransform.SetParent(dominantHand, false);
|
|
UpdateHandPosition();
|
|
}
|
|
|
|
internal void UpdateHandPosition()
|
|
{
|
|
if (isTranslatorPosition)
|
|
SetPositionToTranslator();
|
|
else
|
|
SetPositionToHand();
|
|
}
|
|
|
|
internal void Update()
|
|
{
|
|
UpdateRotation();
|
|
UpdatePosition();
|
|
}
|
|
|
|
private void UpdateRotation()
|
|
{
|
|
if (!Camera.main)
|
|
{
|
|
return;
|
|
}
|
|
holdTransform.LookAt(2 * holdTransform.position - Camera.main.transform.position, PlayerHelper.PlayerHead.up);
|
|
}
|
|
|
|
private void UpdatePosition()
|
|
{
|
|
var isUsingTool = ToolHelper.Swapper.IsInToolMode(ToolMode.Translator, ToolGroup.Suit);
|
|
if (!isTranslatorPosition && isUsingTool)
|
|
{
|
|
SetPositionToTranslator();
|
|
}
|
|
else if (isTranslatorPosition && !isUsingTool)
|
|
{
|
|
SetPositionToHand();
|
|
}
|
|
}
|
|
|
|
private void SetPositionToHand()
|
|
{
|
|
var isRightHanded = holdTransform.parent == HandsController.Behaviour.RightHandBehaviour.Palm;
|
|
promptCanvas.transform.localPosition = new Vector3(-0.1f, -0.05f, 0.1f);
|
|
isTranslatorPosition = false;
|
|
}
|
|
|
|
private void SetPositionToTranslator()
|
|
{
|
|
var isRightHanded = holdTransform.parent == HandsController.Behaviour.RightHandBehaviour.Palm;
|
|
promptCanvas.transform.localPosition = Vector3.down * 0.1f;
|
|
isTranslatorPosition = true;
|
|
}
|
|
}
|
|
}
|
|
} |