Init
This commit is contained in:
@@ -0,0 +1,253 @@
|
||||
using UnityEngine.InputSystem;
|
||||
using UnityEngine.UI;
|
||||
using UnityEngine.XR.Interaction.Toolkit.Inputs.Simulation;
|
||||
|
||||
namespace UnityEngine.XR.Interaction.Toolkit.Samples.DeviceSimulator
|
||||
{
|
||||
[RequireComponent(typeof(XRDeviceSimulatorUI))]
|
||||
class XRDeviceSimulatorControllerUI : MonoBehaviour
|
||||
{
|
||||
[Header("General")]
|
||||
|
||||
[SerializeField]
|
||||
Image m_ControllerImage;
|
||||
|
||||
[SerializeField]
|
||||
Image m_ControllerOverlayImage;
|
||||
|
||||
[Header("Primary Button")]
|
||||
|
||||
[SerializeField]
|
||||
Image m_PrimaryButtonImage;
|
||||
|
||||
[SerializeField]
|
||||
Text m_PrimaryButtonText;
|
||||
|
||||
[SerializeField]
|
||||
Image m_PrimaryButtonIcon;
|
||||
|
||||
[Header("Secondary Button")]
|
||||
|
||||
[SerializeField]
|
||||
Image m_SecondaryButtonImage;
|
||||
|
||||
[SerializeField]
|
||||
Text m_SecondaryButtonText;
|
||||
|
||||
[SerializeField]
|
||||
Image m_SecondaryButtonIcon;
|
||||
|
||||
[Header("Trigger")]
|
||||
|
||||
[SerializeField]
|
||||
Image m_TriggerButtonImage;
|
||||
|
||||
[SerializeField]
|
||||
Text m_TriggerButtonText;
|
||||
|
||||
[SerializeField]
|
||||
Image m_TriggerButtonIcon;
|
||||
|
||||
[Header("Grip")]
|
||||
|
||||
[SerializeField]
|
||||
Image m_GripButtonImage;
|
||||
|
||||
[SerializeField]
|
||||
Text m_GripButtonText;
|
||||
|
||||
[SerializeField]
|
||||
Image m_GripButtonIcon;
|
||||
|
||||
[Header("Thumbstick")]
|
||||
|
||||
[SerializeField]
|
||||
Image m_ThumbstickButtonImage;
|
||||
|
||||
[SerializeField]
|
||||
Text m_ThumbstickButtonText;
|
||||
|
||||
[SerializeField]
|
||||
Image m_ThumbstickButtonIcon;
|
||||
|
||||
[Header("Menu")]
|
||||
|
||||
[SerializeField]
|
||||
Image m_MenuButtonImage;
|
||||
|
||||
[SerializeField]
|
||||
Text m_MenuButtonText;
|
||||
|
||||
[SerializeField]
|
||||
Image m_MenuButtonIcon;
|
||||
|
||||
XRDeviceSimulatorUI m_MainUIManager;
|
||||
|
||||
bool m_PrimaryButtonActivated;
|
||||
bool m_SecondaryButtonActivated;
|
||||
bool m_TriggerActivated;
|
||||
bool m_GripActivated;
|
||||
bool m_MenuActivated;
|
||||
bool m_XAxisTranslateActivated;
|
||||
bool m_YAxisTranslateActivated;
|
||||
|
||||
protected void Awake()
|
||||
{
|
||||
m_MainUIManager = GetComponent<XRDeviceSimulatorUI>();
|
||||
}
|
||||
|
||||
internal void Initialize(XRDeviceSimulator simulator)
|
||||
{
|
||||
m_PrimaryButtonText.text = simulator.primaryButtonAction.action.controls[0].displayName;
|
||||
m_SecondaryButtonText.text = simulator.secondaryButtonAction.action.controls[0].displayName;
|
||||
m_GripButtonText.text = simulator.gripAction.action.controls[0].displayName;
|
||||
m_TriggerButtonText.text = simulator.triggerAction.action.controls[0].displayName;
|
||||
m_MenuButtonText.text = simulator.menuAction.action.controls[0].displayName;
|
||||
|
||||
var disabledImgColor = m_MainUIManager.disabledColor;
|
||||
m_ThumbstickButtonImage.color = disabledImgColor;
|
||||
m_ControllerImage.color = m_MainUIManager.disabledDeviceColor;
|
||||
m_ControllerOverlayImage.color = disabledImgColor;
|
||||
}
|
||||
|
||||
internal void SetAsActiveController(bool active, XRDeviceSimulator simulator, bool isRestingHand = false)
|
||||
{
|
||||
var controls = isRestingHand ?
|
||||
simulator.restingHandAxis2DAction.action.controls :
|
||||
simulator.axis2DAction.action.controls;
|
||||
|
||||
m_ThumbstickButtonText.text = $"{controls[0].displayName}, {controls[1].displayName}, {controls[2].displayName}, {controls[3].displayName}";
|
||||
|
||||
UpdateButtonVisuals(active, m_PrimaryButtonIcon, m_PrimaryButtonText, simulator.primaryButtonAction.action.controls[0]);
|
||||
UpdateButtonVisuals(active, m_SecondaryButtonIcon, m_SecondaryButtonText, simulator.secondaryButtonAction.action.controls[0]);
|
||||
UpdateButtonVisuals(active, m_TriggerButtonIcon, m_TriggerButtonText, simulator.triggerAction.action.controls[0]);
|
||||
UpdateButtonVisuals(active, m_GripButtonIcon, m_GripButtonText, simulator.gripAction.action.controls[0]);
|
||||
UpdateButtonVisuals(active, m_MenuButtonIcon, m_MenuButtonText, simulator.menuAction.action.controls[0]);
|
||||
UpdateButtonVisuals(active || isRestingHand, m_ThumbstickButtonIcon, m_ThumbstickButtonText, simulator.axis2DAction.action.controls[0]);
|
||||
|
||||
if (active)
|
||||
{
|
||||
UpdateButtonColor(m_PrimaryButtonImage, m_PrimaryButtonActivated);
|
||||
UpdateButtonColor(m_SecondaryButtonImage, m_SecondaryButtonActivated);
|
||||
UpdateButtonColor(m_TriggerButtonImage, m_TriggerActivated);
|
||||
UpdateButtonColor(m_GripButtonImage, m_GripActivated);
|
||||
UpdateButtonColor(m_MenuButtonImage, m_MenuActivated);
|
||||
UpdateButtonColor(m_ThumbstickButtonImage, m_XAxisTranslateActivated || m_YAxisTranslateActivated);
|
||||
|
||||
m_ControllerImage.color = m_MainUIManager.deviceColor;
|
||||
m_ControllerOverlayImage.color = m_MainUIManager.enabledColor;
|
||||
}
|
||||
else
|
||||
{
|
||||
UpdateDisableControllerButton(m_PrimaryButtonActivated, m_PrimaryButtonImage, m_PrimaryButtonIcon, m_PrimaryButtonText);
|
||||
UpdateDisableControllerButton(m_SecondaryButtonActivated, m_SecondaryButtonImage, m_SecondaryButtonIcon, m_SecondaryButtonText);
|
||||
UpdateDisableControllerButton(m_TriggerActivated, m_TriggerButtonImage, m_TriggerButtonIcon, m_TriggerButtonText);
|
||||
UpdateDisableControllerButton(m_GripActivated, m_GripButtonImage, m_GripButtonIcon, m_GripButtonText);
|
||||
UpdateDisableControllerButton(m_MenuActivated, m_MenuButtonImage, m_MenuButtonIcon, m_MenuButtonText);
|
||||
|
||||
if (!isRestingHand)
|
||||
UpdateDisableControllerButton(m_XAxisTranslateActivated || m_YAxisTranslateActivated, m_ThumbstickButtonImage, m_ThumbstickButtonIcon, m_ThumbstickButtonText);
|
||||
else
|
||||
m_ThumbstickButtonImage.color = m_MainUIManager.buttonColor;
|
||||
|
||||
m_ControllerImage.color = m_MainUIManager.disabledDeviceColor;
|
||||
m_ControllerOverlayImage.color = m_MainUIManager.disabledColor;
|
||||
}
|
||||
}
|
||||
|
||||
// This function keeps the button selected color active if the key if hold when the controller is disabled.
|
||||
// Other buttons are disabled to avoid adding extra noise.
|
||||
void UpdateDisableControllerButton(bool active, Image button, Image buttonIcon, Text buttonText)
|
||||
{
|
||||
if (active)
|
||||
{
|
||||
var tmpColor = m_MainUIManager.selectedColor;
|
||||
tmpColor.a = 0.5f;
|
||||
button.color = tmpColor;
|
||||
buttonText.gameObject.SetActive(true);
|
||||
buttonIcon.gameObject.SetActive(true);
|
||||
}
|
||||
else
|
||||
{
|
||||
button.color = m_MainUIManager.disabledButtonColor;
|
||||
buttonText.gameObject.SetActive(false);
|
||||
buttonIcon.gameObject.SetActive(false);
|
||||
}
|
||||
}
|
||||
|
||||
void UpdateButtonVisuals(bool active, Image buttonIcon, Text buttonText, InputControl control)
|
||||
{
|
||||
buttonText.gameObject.SetActive(active);
|
||||
buttonIcon.gameObject.SetActive(active);
|
||||
|
||||
var color = active ? m_MainUIManager.enabledColor : m_MainUIManager.disabledColor;
|
||||
buttonText.color = color;
|
||||
buttonIcon.color = color;
|
||||
|
||||
buttonIcon.transform.localScale = Vector3.one;
|
||||
buttonIcon.sprite = m_MainUIManager.GetInputIcon(control);
|
||||
switch (control.name)
|
||||
{
|
||||
case "leftButton":
|
||||
buttonText.text = "L Mouse";
|
||||
buttonIcon.color = Color.white;
|
||||
buttonIcon.transform.localScale = new Vector3(-1f, 1f, 1f);
|
||||
break;
|
||||
case "rightButton":
|
||||
buttonText.text = "R Mouse";
|
||||
buttonIcon.color = Color.white;
|
||||
break;
|
||||
default:
|
||||
buttonIcon.sprite = m_MainUIManager.keyboardSprite;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void UpdateButtonColor(Image image, bool activated)
|
||||
{
|
||||
image.color = activated ? m_MainUIManager.selectedColor : m_MainUIManager.buttonColor;
|
||||
}
|
||||
|
||||
internal void OnPrimaryButton(bool activated)
|
||||
{
|
||||
m_PrimaryButtonActivated = activated;
|
||||
UpdateButtonColor(m_PrimaryButtonImage, activated);
|
||||
}
|
||||
|
||||
internal void OnSecondaryButton(bool activated)
|
||||
{
|
||||
m_SecondaryButtonActivated = activated;
|
||||
UpdateButtonColor(m_SecondaryButtonImage, activated);
|
||||
}
|
||||
|
||||
internal void OnTrigger(bool activated)
|
||||
{
|
||||
m_TriggerActivated = activated;
|
||||
UpdateButtonColor(m_TriggerButtonImage, activated);
|
||||
}
|
||||
|
||||
internal void OnGrip(bool activated)
|
||||
{
|
||||
m_GripActivated = activated;
|
||||
UpdateButtonColor(m_GripButtonImage, activated);
|
||||
}
|
||||
|
||||
internal void OnMenu(bool activated)
|
||||
{
|
||||
m_MenuActivated = activated;
|
||||
UpdateButtonColor(m_MenuButtonImage, activated);
|
||||
}
|
||||
|
||||
internal void OnXAxisTranslatePerformed(bool activated)
|
||||
{
|
||||
m_XAxisTranslateActivated = activated;
|
||||
UpdateButtonColor(m_ThumbstickButtonImage, activated);
|
||||
}
|
||||
|
||||
internal void OnZAxisTranslatePerformed(bool activated)
|
||||
{
|
||||
m_YAxisTranslateActivated = activated;
|
||||
UpdateButtonColor(m_ThumbstickButtonImage, activated);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: a907ece591e731e49b5d7be45f089972
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,181 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine.InputSystem;
|
||||
using UnityEngine.UI;
|
||||
using UnityEngine.XR.Interaction.Toolkit.Inputs.Simulation;
|
||||
|
||||
namespace UnityEngine.XR.Interaction.Toolkit.Samples.DeviceSimulator
|
||||
{
|
||||
[RequireComponent(typeof(XRDeviceSimulatorUI))]
|
||||
class XRDeviceSimulatorHandsUI : MonoBehaviour
|
||||
{
|
||||
[Serializable]
|
||||
class HandExpressionUI
|
||||
{
|
||||
[SerializeField]
|
||||
Sprite m_Sprite;
|
||||
[SerializeField]
|
||||
Image m_ButtonImage;
|
||||
[SerializeField]
|
||||
Image m_Icon;
|
||||
[SerializeField]
|
||||
Text m_BindText;
|
||||
[SerializeField]
|
||||
Text m_TitleText;
|
||||
|
||||
InputAction m_Action;
|
||||
|
||||
public Sprite sprite
|
||||
{
|
||||
get => m_Sprite;
|
||||
set => m_Sprite = value;
|
||||
}
|
||||
|
||||
public void Initialize(InputAction action, string name, Sprite icon)
|
||||
{
|
||||
m_Action = action;
|
||||
m_BindText.text = m_Action.controls[0].displayName;
|
||||
m_TitleText.text = $"[{name}]";
|
||||
if (icon != null)
|
||||
m_Sprite = icon;
|
||||
}
|
||||
|
||||
public void UpdateButtonVisuals(bool active, XRDeviceSimulatorUI uiManager)
|
||||
{
|
||||
UpdateButtonActive(active);
|
||||
|
||||
Color color = active ? uiManager.enabledColor : uiManager.disabledColor;
|
||||
m_BindText.color = color;
|
||||
m_TitleText.color = color;
|
||||
m_Icon.color = color;
|
||||
|
||||
m_Icon.transform.localScale = Vector3.one;
|
||||
m_Icon.sprite = uiManager.GetInputIcon(m_Action?.controls[0]);
|
||||
}
|
||||
|
||||
public void SetButtonColor(Color color)
|
||||
{
|
||||
m_ButtonImage.color = color;
|
||||
}
|
||||
|
||||
public void UpdateButtonActive(bool active)
|
||||
{
|
||||
m_BindText.gameObject.SetActive(active);
|
||||
m_TitleText.gameObject.SetActive(active);
|
||||
m_Icon.gameObject.SetActive(active);
|
||||
}
|
||||
}
|
||||
|
||||
[Header("General")]
|
||||
|
||||
[SerializeField]
|
||||
Image m_HandImage;
|
||||
|
||||
[SerializeField]
|
||||
Sprite m_HandDefaultSprite;
|
||||
|
||||
[SerializeField]
|
||||
List<HandExpressionUI> m_Expressions = new List<HandExpressionUI>();
|
||||
|
||||
XRDeviceSimulatorUI m_MainUIManager;
|
||||
HandExpressionUI m_ActiveExpression;
|
||||
|
||||
protected void Awake()
|
||||
{
|
||||
m_MainUIManager = GetComponent<XRDeviceSimulatorUI>();
|
||||
}
|
||||
|
||||
internal void Initialize(XRDeviceSimulator simulator)
|
||||
{
|
||||
for (var index = 0; index < simulator.simulatedHandExpressions.Count; ++index)
|
||||
{
|
||||
var simulatedExpression = simulator.simulatedHandExpressions[index];
|
||||
if (index >= m_Expressions.Count)
|
||||
{
|
||||
Debug.LogWarning("The Device Simulator has more expressions than the UI can display.", this);
|
||||
}
|
||||
else
|
||||
{
|
||||
m_Expressions[index].Initialize(simulatedExpression.toggleAction, simulatedExpression.name, simulatedExpression.icon);
|
||||
}
|
||||
}
|
||||
|
||||
m_HandImage.color = m_MainUIManager.disabledDeviceColor;
|
||||
}
|
||||
|
||||
internal void SetActive(bool active, XRDeviceSimulator simulator)
|
||||
{
|
||||
foreach (var expression in m_Expressions)
|
||||
{
|
||||
expression.UpdateButtonVisuals(active, m_MainUIManager);
|
||||
}
|
||||
|
||||
if (active)
|
||||
{
|
||||
foreach (var expression in m_Expressions)
|
||||
{
|
||||
var isActiveExpression = m_ActiveExpression == expression;
|
||||
expression.SetButtonColor(isActiveExpression ? m_MainUIManager.selectedColor : m_MainUIManager.buttonColor);
|
||||
}
|
||||
|
||||
m_HandImage.color = m_MainUIManager.deviceColor;
|
||||
}
|
||||
else
|
||||
{
|
||||
var disabledSelectedColor = m_MainUIManager.selectedColor;
|
||||
disabledSelectedColor.a = 0.5f;
|
||||
foreach (var expression in m_Expressions)
|
||||
{
|
||||
var isActiveExpression = m_ActiveExpression == expression;
|
||||
expression.SetButtonColor(isActiveExpression ? disabledSelectedColor : m_MainUIManager.disabledButtonColor);
|
||||
expression.UpdateButtonActive(isActiveExpression);
|
||||
}
|
||||
|
||||
m_HandImage.color = m_MainUIManager.disabledDeviceColor;
|
||||
}
|
||||
}
|
||||
|
||||
internal void ToggleExpression(XRDeviceSimulator.SimulatedHandExpression simulatedExpression, XRDeviceSimulator simulator)
|
||||
{
|
||||
// The index of the hand expression corresponds 1:1 with the index of the UI button
|
||||
var index = simulator.simulatedHandExpressions.IndexOf(simulatedExpression);
|
||||
if (index >= m_Expressions.Count)
|
||||
{
|
||||
Debug.LogWarning("The Device Simulator has more expressions than the UI can display.", this);
|
||||
}
|
||||
else if (index < 0)
|
||||
{
|
||||
Debug.LogError($"The Device Simulator tried to toggle {simulatedExpression.name} but it was not found in the list of simulated hand expressions, the UI can not be updated.", this);
|
||||
}
|
||||
else
|
||||
{
|
||||
ToggleExpression(m_Expressions[index]);
|
||||
}
|
||||
}
|
||||
|
||||
void ToggleExpression(HandExpressionUI expression)
|
||||
{
|
||||
if (m_ActiveExpression == expression)
|
||||
{
|
||||
SetExpressionActiveStatus(false, expression);
|
||||
m_ActiveExpression = null;
|
||||
m_HandImage.sprite = m_HandDefaultSprite;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (m_ActiveExpression != null)
|
||||
SetExpressionActiveStatus(false, m_ActiveExpression);
|
||||
|
||||
SetExpressionActiveStatus(true, expression);
|
||||
m_ActiveExpression = expression;
|
||||
}
|
||||
}
|
||||
|
||||
void SetExpressionActiveStatus(bool isActive, HandExpressionUI expression)
|
||||
{
|
||||
expression.SetButtonColor(isActive ? m_MainUIManager.selectedColor : m_MainUIManager.buttonColor);
|
||||
if (isActive)
|
||||
m_HandImage.sprite = expression.sprite;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: f35ac646ecbef4ece8c3eac9e74e1828
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: e8b922481d9264546b97958b2c7cf0a0
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Reference in New Issue
Block a user