Files
valheim/Assets/Wave/Essence/InputModule/5.5.0-r.10/Scripts/ControllerInputSwitch.cs
2025-07-04 14:16:14 +08:00

150 lines
4.1 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// "Wave SDK
// © 2020 HTC Corporation. All Rights Reserved.
//
// Unless otherwise required by copyright law and practice,
// upon the execution of HTC SDK license agreement,
// HTC grants you access to and use of the Wave SDK(s).
// You shall fully comply with all of HTCs SDK license agreement terms and
// conditions signed by you and all SDK and API requirements,
// specifications, and documentation provided by HTC to You."
using UnityEngine;
using Wave.Native;
#if UNITY_EDITOR
using Wave.Essence.Editor;
#endif
namespace Wave.Essence.InputModule
{
[DisallowMultipleComponent]
sealed class ControllerInputSwitch : MonoBehaviour
{
const string LOG_TAG = "Wave.Essence.InputModule.ControllerInputSwitch";
private void DEBUG(string msg)
{
if (Log.EnableDebugLog)
Log.d(LOG_TAG, msg, true);
}
#region Customized Settings
[Tooltip("True for only one input from one controller. False for double inputs from double controllers.")]
[SerializeField]
private bool m_SingleInput = true;
public bool SingleInput { get { return m_SingleInput; } set { m_SingleInput = value; } }
[Tooltip("If SingleInput is set, PrimaryInput will be used to decide the main input controller.")]
[SerializeField]
private XR_Hand m_PrimaryInput = XR_Hand.Dominant;
public XR_Hand PrimaryInput { get { return m_PrimaryInput; } set { m_PrimaryInput = value; } }
#endregion
// Use a private m_Instance due to .Net3.5 or newer does NOT support default initializer.
private static ControllerInputSwitch m_Instance = null;
public static ControllerInputSwitch Instance
{
get
{
if (m_Instance == null)
{
var gameObject = new GameObject("ControllerInputSwitch");
m_Instance = gameObject.AddComponent<ControllerInputSwitch>();
// This object should survive all scene transitions.
DontDestroyOnLoad(m_Instance);
}
return m_Instance;
}
}
private bool triggerPressed = false;
private bool IsTriggered(XR_Device device)
{
bool value = false;
#if UNITY_EDITOR
if (Application.isEditor)
{
return WXRDevice.ButtonPress((WVR_DeviceType)device, WVR_InputId.WVR_InputId_Alias1_Trigger);
}
else
#endif
{
value = WXRDevice.KeyDown(device, XR_BinaryButton.triggerButton);
}
if (triggerPressed != value)
{
triggerPressed = value;
if (triggerPressed)
return true;
}
return false;
}
private void SetFocusHand()
{
if ((m_PrimaryInput == XR_Hand.Dominant) && IsTriggered(XR_Device.NonDominant))
{
m_PrimaryInput = XR_Hand.NonDominant;
DEBUG("The focus hand is set to " + m_PrimaryInput);
Interop.WVR_SetFocusedController(WVR_DeviceType.WVR_DeviceType_Controller_Left);
}
if ((m_PrimaryInput == XR_Hand.NonDominant) && IsTriggered(XR_Device.Dominant))
{
m_PrimaryInput = XR_Hand.Dominant;
DEBUG("The focus hand is set to " + m_PrimaryInput);
Interop.WVR_SetFocusedController(WVR_DeviceType.WVR_DeviceType_Controller_Right);
}
}
private void GetFocusHand()
{
WVR_DeviceType focus_dev = Interop.WVR_GetFocusedController();
if (focus_dev == WVR_DeviceType.WVR_DeviceType_Controller_Right)
m_PrimaryInput = XR_Hand.Dominant;
if (focus_dev == WVR_DeviceType.WVR_DeviceType_Controller_Left)
m_PrimaryInput = XR_Hand.NonDominant;
DEBUG("GetFocusHand() Focus hand: " + m_PrimaryInput);
}
#region MonoBehaviour overrides
private void Awake()
{
m_Instance = this;
}
void Start()
{
Log.i(LOG_TAG, "Start() Check the focus hand .");
GetFocusHand();
}
void OnApplicationPause(bool pauseStatus)
{
Log.i(LOG_TAG, "OnApplicationPause() pauseStatus: " + pauseStatus, true);
if (!pauseStatus)
{
Log.i(LOG_TAG, "OnApplicationPause() Check the focus hand in resume.");
GetFocusHand();
}
}
private bool hasSystemFocus = true;
void Update()
{
SetFocusHand();
if (hasSystemFocus != ClientInterface.IsFocused)
{
hasSystemFocus = ClientInterface.IsFocused;
DEBUG("Update() " + (hasSystemFocus ? "Gets system focus." : "Focus is captured by system."));
if (hasSystemFocus)
GetFocusHand();
}
}
#endregion
}
}