InteractuableInteractable

Interactuable

El componente es un contenedor todo en uno para que cualquier objeto pueda interactuar fácilmente y Interactable responder a la entrada. The Interactable component is an all-in-one container to make any object easily interactable and responsive to input. Interactable actúa como un elemento de entrada para todos los tipos de entrada, incluidos el toque, los rayos de las manos, la voz, etc. y canaliza estas interacciones en eventos y respuestas de temas visuales.Interactable acts as a catch-all for all types of input including touch, hand rays, speech etc and funnel these interactions into events and visual theme responses. Este componente proporciona una manera sencilla de crear botones, cambiar el color de los objetos con el foco, etc.This component provides an easy way to make buttons, change color on objects with focus, and more.

Configuración de InteractableHow to configure Interactable

El componente permite tres secciones principales de configuración:The component allows for three primary sections of configuration:

  1. Configuración de entrada generalGeneral input configuration
  2. Temas visuales dirigidos a varios Objetos GameObjectVisual Themes targeted against multiple GameObjects
  3. Controladores de eventosEvent handlers

Configuración de entrada generalGeneral input settings

Configuración general que se puede interactuar

StatesStates

States es un parámetro ScriptableObject que define las fases de interacción, como presionar o observar, para perfiles interactuables y temas visuales.States is a ScriptableObject parameter that defines the interactions phases, like press or observed, for Interactable Profiles and Visual Themes.

DefaultInteractableStates (Assets/MRTK/SDK/Features/UX/Interactable/States/DefaultInteractableStates.asset) se incluye con MRTK de fábrica y es el parámetro predeterminado para los componentes interactables.The DefaultInteractableStates (Assets/MRTK/SDK/Features/UX/Interactable/States/DefaultInteractableStates.asset) ships with MRTK out-of-box and is the default parameter for Interactable components.

Ejemplo de ScriptableObject de estados en inspector

El recurso DefaultInteractableStates contiene cuatro estados y utiliza la implementación InteractableStates del modelo de estado.The DefaultInteractableStates asset contains four states and utilizes the InteractableStates state model implementation.

  • Valor predeterminado: no ocurre nada, es el estado base más aislado.Default: Nothing is happening, this is the most isolated base state.

  • Foco: el objeto al que se apunta.Focus: The object is being pointed at. Se trata de un estado único, no hay ningún otro estado establecido actualmente, pero se clasificará por rango Predeterminado.This is a single state, no other states are currently set, but it will out rank Default.

  • Presione: se apunta al objeto y se presiona un botón o una mano.Press: The object is being pointed at and a button or hand is pressing. El estado Press (Presionar) clasifica Default (Predeterminado) y Focus (Foco).The Press state out ranks Default and Focus. Este estado también se establecerá como reserva en La presión física.This state will also get set as a fallback to Physical Press.

  • Deshabilitado: el botón no debe ser interactivo y los comentarios visuales permitirán al usuario saber si, por algún motivo, este botón no se puede usar en este momento.Disabled: The button should not be interactive and visual feedback will let the user know if for some reason this button is not usable at this time. En teoría, el estado deshabilitado podría contener todos los demás estados, pero cuando Enabled está desactivado, el estado Disabled (Deshabilitado) se establece en todos los demás estados.In theory, the disabled state could contain all other states, but when Enabled is turned off, the Disabled state trumps all other states.

Un valor de bits (#) se asigna al estado en función del orden de la lista.A bit value (#) is assigned to the state depending on the order in the list.

Nota

Por lo general, se recomienda usar DefaultInteractableStates (Assets/MRTK/SDK/Features/UX/Interactable/States/DefaultInteractableStates.asset) al crear componentes interactuables.It is generally recommended to utilize the DefaultInteractableStates (Assets/MRTK/SDK/Features/UX/Interactable/States/DefaultInteractableStates.asset) when creating Interactable components.

Sin embargo, hay 17 estados interactuables disponibles que se pueden usar para impulsar temas, aunque algunos están diseñados para ser controlados por otros componentes.However, there are 17 Interactable states available that can be used to drive themes, though some are meant to be driven by other components. Esta es una lista de los que tienen funcionalidad integrada.Here is a list of those with built-in functionality.

  • Visitado: se ha hecho clic en interactuable.Visited: the Interactable has been clicked.
  • Alternancia: el botón está en un estado alternado o índice de dimensión es un número impar.Toggled: The button is in a toggled state or Dimension index is an odd number.
  • Gesto: se ha presionado la mano o el controlador y se ha movido desde la posición original.Gesture: The hand or controller was pressed and has moved from the original position.
  • VoiceCommand: se usó un comando de voz para desencadenar interactuable.VoiceCommand: A speech command was used to trigger the Interactable.
  • PhysicalTouch: actualmente se detecta una entrada táctil, use NearInteractionTouchable para habilitar.PhysicalTouch: A touch input is currently detected, use NearInteractionTouchable to enable.
  • Agarrar: una mano está agarrándose actualmente en los límites del objeto, use NearInteractionGrabbable para habilitarGrab: A hand is currently grabbing in the bounds of the object, use NearInteractionGrabbable to enable

HabilitadoEnabled

Alterna si un elemento Interactable se iniciará habilitado o no.Toggles whether an Interactable will start enabled or not. Esto corresponde a en Interactable.IsEnabled el código.This corresponds to the Interactable.IsEnabled in code.

La propiedad habilitada de Interactable es diferente de la propiedad habilitada configurada a través de GameObject/Component (es decir,An Interactable's enabled property is different than the enabled property configured via GameObject/Component (i.e SetActive, etc.).SetActive etc). Al deshabilitar GameObject o MonoBehaviour interactuable, se deshabilitará la ejecución de todo el contenido de la clase, incluidos la entrada, los temas visuales, los eventos, etc. Deshabilitar a través Interactable.IsEnabled de deshabilitará la mayoría del control de entrada y restablecerá los estados de entrada relacionados.Disabling the GameObject or Interactable MonoBehaviour will disable everything in the class from running including input, visual themes, events, etc. Disabling via Interactable.IsEnabled will disable most input handling, resetting related input states. Sin embargo, la clase todavía ejecutará cada fotograma y recibirá eventos de entrada que se omitirán.However, the class will still run every frame and receive input events which will be ignored. Esto es útil para mostrar interactuable en un estado deshabilitado que se puede realizar a través de temas visuales.This is useful for displaying the Interactable in a disabled state which can be done via Visual Themes. Un ejemplo típico de esto sería un botón enviar en espera de que se completen todos los campos de entrada necesarios.A typical example of this would be a submit button waiting for all the required input fields to be completed.

Acciones de entradaInput Actions

Seleccione la acción de entrada del perfil de asignación de controlador o configuración de entrada al que debe reaccionar el componente Interactable.Select the input action from the input configuration or controller mapping profile that the Interactable component should react to.

Esta propiedad se puede configurar en tiempo de ejecución en código a través de Interactable.InputAction .This property can be configured at runtime in code via Interactable.InputAction.

IsGlobalIsGlobal

Si es true, marcará el componente como un agente de escucha de entrada global para la acción de entrada seleccionada.If true, this will mark the component as a global input listener for the selected input action. El comportamiento predeterminado es false, lo que restringirá la entrada solo a este colisionador o GameObject interactuable.Default behavior is false which will restrict input to only this Interactable collider/GameObject.

Esta propiedad se puede configurar en tiempo de ejecución en código a través de Interactable.IsGlobal .This property can be configured at runtime in code via Interactable.IsGlobal.

Comando de vozSpeech Command

Comando de voz, desde el perfil de comandos de voz de MRTK, para desencadenar un evento OnClick para la interacción de voz.Speech command, from the MRTK Speech Commands Profile, to trigger an OnClick event for voice interaction.

Esta propiedad se puede configurar en tiempo de ejecución en código a través de Interactable.VoiceCommand .This property can be configured at runtime in code via Interactable.VoiceCommand.

Requiere focoRequires Focus

Si es true, el comando de voz solo activará interactuable si y solo si ya tiene el foco de un puntero.If true, the voice command will only activate the Interactable if and only if it already has focus from a pointer. Si es false, Interactable actuará como agente de escucha global para el comando de voz seleccionado.If false, then the Interactable will act as a global listener for the selected voice command. El comportamiento predeterminado es true, ya que varios agentes de escucha de voz globales pueden ser difíciles de organizar en una escena.The default behavior is true, as multiple global speech listeners can be difficult to organize in a scene.

Esta propiedad se puede configurar en tiempo de ejecución en código a través de Interactable.VoiceRequiresFocus .This property can be configured at runtime in code via Interactable.VoiceRequiresFocus.

Modo de selecciónSelection Mode

Esta propiedad define la lógica de selección.This property defines the selection logic. Cuando se hace clic en un objeto Interactable, itera en un siguiente nivel de dimensión.When an Interactable is clicked, it iterates into a next Dimension level. Las dimensiones son similares a rank y definen un estado fuera de las entradas (es decir,Dimensions is similar to rank and defines a state outside of inputs (i.e focus, press etc.focus, press etc). Son útiles para definir estados de alternancia u otros estados de varias rangos asociados a un botón.They are useful for defining Toggle states or other multi-rank states associated with a button. Realiza el seguimiento del nivel de dimensión Interactable.DimensionIndex actual.The current Dimension level is tracked by Interactable.DimensionIndex.

Los modos de selección disponibles son:The selection modes available are:

  • Botón - Dimensiones = 1, Simple Clickable InteractableButton - Dimensions = 1, simple clickable Interactable
  • Alternar - Dimensiones = 2, alternativas interactuables entre el estado de on / offToggle - Dimensions = 2, Interactable alternates between on/off state
  • Varias dimensiones - Dimensiones > = 3, cada clic aumenta el nivel de dimensión actual + 1.Multi-dimension - Dimensions >= 3, every click increases the current dimension level + 1. Resulta útil para definir un estado de botón en una lista, etc.Useful for defining a button state to a list, etc.

Interactable también permite definir varios temas por dimensión.Interactable also allows for multiple Themes to be defined per Dimension. Por ejemplo, cuando SelectionMode=Toggle, se puede aplicar un tema cuando se deselecciona Interactable y otro tema cuando se selecciona el componente.For example when SelectionMode=Toggle, one theme may be applied when the Interactable is deselected and another theme applied when the component is selected.

El modo de selección actual se puede consultar en tiempo de ejecución a través de Interactable.ButtonMode .The current Selection Mode can be queried at runtime via Interactable.ButtonMode. La actualización del modo en tiempo de ejecución se puede lograr estableciendo la Interactable.Dimensions propiedad para que coincida con la funcionalidad deseada.Updating the mode at runtime can be achieved by setting the Interactable.Dimensions property to match the desired functionality. Además, se puede acceder a la dimensión actual, útil para los modos Alternar y Multi dimension, a través de Interactable.CurrentDimension .Furthermore, the current dimension, useful for Toggle and Multi-Dimension modes, can be accessed via Interactable.CurrentDimension.

Perfiles interactuablesInteractable profiles

Los perfiles son elementos que crean una relación entre gameobject y tema visual.Profiles are items that create a relationship between a GameObject and a Visual Theme. El perfil define qué contenido va a manipular un tema cuando se produzca un cambio de estado.The profile defines what content will be manipulated by a theme when a state change occurs.

Los temas funcionan muy parecidos a los materiales.Themes work a lot like materials. Son objetos que pueden incluirse en scripts y que contienen una lista de propiedades que se asignarán a un objeto en función del estado actual.They are scriptable objects that contain a list of properties that will be assigned to an object based on the current state. Los temas también se pueden volver a usar y se pueden asignar a través de varios objetos UX interactuables.Themes are also re-usable and can be assigned across multiple Interactable UX objects.

Restablecer al destruirReset On Destroy

Los temas visuales modifican varias propiedades en un GameObject de destino, en función de la clase y el tipo de motor de tema seleccionados.Visual themes modify various properties on a targeted GameObject, dependent on the class and type of theme engine selected. Si restablecer al destruir es true cuando se destruye el componente interactuable, el componente restablecerá todas las propiedades modificadas de los temas activos a sus valores originales.If Reset On Destroy is true when the Interactable component is destroyed, the component will reset all modified properties from active themes to their original values. De lo contrario, cuando se destruye, el componente Interactable dejará las propiedades modificadas tal y como están.Otherwise, when destroyed, the Interactable component will leave any modified properties as-is. En este último caso, el último estado de los valores se conservará a menos que otro componente externo lo haya modificado.In this latter case, the last state of values will persist unless altered by another external component. El valor predeterminado es false.The default is false.

Profile theams

EventosEvents

Cada componente interactuable tiene un evento OnClick que se produce cuando el componente se selecciona simplemente.Every Interactable component has an OnClick event that fires when the component is simply selected. Sin embargo, Interactable se puede usar para detectar eventos de entrada que no sean solo OnClick.However, Interactable can be used to detect input events other than just OnClick.

Haga clic en el botón Agregar evento para agregar un nuevo tipo de definición de receptor de eventos.Click the Add Event button to add a new type of Event Receiver definition. Una vez agregado, seleccione el tipo de evento deseado.Once added, select the type of Event desired.

Ejemplo de eventos))

Hay diferentes tipos de receptores de eventos para responder a distintos tipos de entrada.There are different types of event receivers to respond to different types of input. MRTK se suministra con el siguiente conjunto de receptores de serie.MRTK ships with the following set of receivers out-of-box.

Se puede crear un receptor personalizado creando una nueva clase que extienda ReceiverBase .A custom receiver can be created by making a new class that extends ReceiverBase.

Ejemplo de receptor de alternancia de eventos

Ejemplo de un receptor de eventos toggleExample of a Toggle Event Receiver

Receptores interactuablesInteractable receivers

El componente permite definir eventos fuera del InteractableReceiver componente interactuable de origen.The InteractableReceiver component allows for events to be defined outside of the source Interactable component. InteractableReceiver escuchará un tipo de evento filtrado desencadenado por otro objeto Interactable.The InteractableReceiver will listen for a filtered event type fired by another Interactable. Si la propiedad Interactable no se asigna directamente, la propiedad Ámbito de búsqueda define la dirección en la que InteractableReceiver escucha eventos que están en sí mismo, en un elemento primario o en un Elemento GameObject secundario.If the Interactable property is not directly assigned, then the Search Scope property defines the direction the InteractableReceiver listens for events which is either on itself, in a parent, or in a child GameObject.

InteractableReceiverList actúa de forma similar, pero para obtener una lista de eventos de coincidencia.InteractableReceiverList acts in a similar fashion but for a list of matching events.

Interactable reciver

Creación de eventos personalizadosCreate custom events

Al igual que los temasvisuales, los eventos se pueden extender para detectar cualquier patrón de estado o para exponer la funcionalidad.Like Visual Themes, events can be extended to detect any state pattern or to expose functionality.

Los eventos personalizados se pueden crear de dos maneras principales:Custom events can be created in two main ways:

  1. ReceiverBaseExtienda la clase para crear un evento personalizado que se mostrará en la lista desplegable de tipos de eventos.Extend the ReceiverBase class to create a custom event that will show up in the dropdown list of event types. Se proporciona un evento de Unity de forma predeterminada, pero se pueden agregar eventos de Unity adicionales o se puede establecer el evento para ocultar los eventos de Unity.A Unity event is provided by default, but additional Unity events can be added or the event can be set to hide Unity events. Esta funcionalidad permite a un diseñador trabajar con un ingeniero en un proyecto para crear un evento personalizado que el diseñador puede configurar en el editor.This functionality allows a designer to work with an engineer on a project to create a custom event that the designer can setup in the editor.

  2. ReceiverBaseMonoBehaviorExtienda la clase para crear un componente de evento completamente personalizado que pueda residir en interactuable u otro objeto.Extend the ReceiverBaseMonoBehavior class to create a completely custom event component that can reside on the Interactable or another object. hará ReceiverBaseMonoBehavior referencia a Interactable para detectar cambios de estado.The ReceiverBaseMonoBehavior will reference the Interactable to detect state changes.

Ejemplo de extensión ReceiverBaseExample of extending ReceiverBase

La CustomInteractablesReceiver clase muestra información de estado sobre un objeto Interactable y es un ejemplo de cómo crear un receptor de eventos personalizado.The CustomInteractablesReceiver class displays status information about an Interactable and is an example of how to create a custom Event Receiver.

public CustomInteractablesReceiver(UnityEvent ev) : base(ev, "CustomEvent")
{
    HideUnityEvents = true; // hides Unity events in the receiver - meant to be code only
}

Los métodos siguientes son útiles para invalidar o implementar al crear un receptor de eventos personalizado.The following methods are useful to override/implement when creating a custom Event Receiver. ReceiverBase.OnUpdate() es un método abstracto que se puede usar para detectar patrones de estado o transiciones.ReceiverBase.OnUpdate() is an abstract method that can be used to detect state patterns/transitions. Además, los ReceiverBase.OnVoiceCommand() ReceiverBase.OnClick() métodos y son útiles para crear lógica de eventos personalizada cuando se selecciona Interactable.Furthermore, the ReceiverBase.OnVoiceCommand() and ReceiverBase.OnClick() methods are useful for creating custom event logic when the Interactable is selected.

public override void OnUpdate(InteractableStates state, Interactable source)
{
    if (state.CurrentState() != lastState)
    {
        // the state has changed, do something new
        lastState = state.CurrentState();
        ...
    }
}

public virtual void OnVoiceCommand(InteractableStates state, Interactable source,
                                    string command, int index = 0, int length = 1)
{
    base.OnVoiceCommand(state, source, command, index, length);
    // voice command called, perform some action
}  

public virtual void OnClick(InteractableStates state,
                            Interactable source,
                            IMixedRealityPointer pointer = null)
{
    base.OnClick(state, source);
    // click called, perform some action
}
Mostrar campos de receptor de eventos personalizados en el inspectorDisplaying custom event receiver fields in the inspector

Los scripts de ReceiverBase InspectorField usan atributos para exponer propiedades personalizadas en el inspector.ReceiverBase scripts use InspectorField attributes to expose custom properties in the inspector. Este es un ejemplo de Vector3, una propiedad personalizada con información sobre herramientas y etiquetas.Here's an example of Vector3, a custom property with tooltip and label information. Esta propiedad se mostrará como configurable en el inspector cuando se selecciona un GameObject interactuable y se agrega el tipo de receptor de eventos asociado.This property will show up as configurable in the inspector when an Interactable GameObject is selected and has the associated Event Receiver type added.

[InspectorField(Label = "<Property label>",Tooltip = "<Insert tooltip info>",Type = InspectorField.FieldTypes.Vector3)]
public Vector3 EffectOffset = Vector3.zero;

Uso de InteractableHow to use Interactable

Creación de un botón sencilloBuilding a simple button

Se puede crear un botón simple agregando el componente Interactable a un GameObject que está configurado para recibir eventos de entrada.One can create a simple button by adding the Interactable component to a GameObject that is configured to receive input events. Puede tener un colisionador en él o en un elemento secundario para recibir la entrada.It can have a collider on it or on a child to receive input. Si usa Interactable with a Unity UI based GameObjects (Objetos GameObject basados en interfaz de usuario de Unity), debe estar en Canvas GameObject.If using Interactable with a Unity UI based GameObjects, it should be under the Canvas GameObject.

Tome el botón un paso más allá, creando un nuevo perfil, asignando el propio GameObject y creando un nuevo tema.Take the button one step further, by creating a new profile, assigning the GameObject itself and creating a new theme. Además, use el evento OnClick para que suceda algo.Furthermore, use the OnClick event to make something happen.

Nota

Hacer que un botón se puede presionar requiere el componente PressableButton .Making a button pressable requires the PressableButton component. Además, el componente PhysicalPressEventRouter es necesario para canalizar eventos de presión al componente Interactable.Additionally, the PhysicalPressEventRouter component is needed to funnel press events to the Interactable component.

Creación de botones de alternancia y de varias dimensionesCreating toggle and multi-dimension buttons

Botón de alternanciaToggle button

Para que un botón pueda alternar, cambie el Selection Mode campo para escribir Toggle .To make a button Toggle-able, change the Selection Mode field to type Toggle. En la sección Perfiles, se agrega un nuevo tema alternado para cada perfil que se usa cuando se activa interactuable.In the Profiles section, a new toggled theme is added for each profile that is used when the Interactable is toggled on.

Mientras se establece en Toggle, se puede usar la casilla SelectionMode IsToggled para establecer el valor predeterminado del control en la inicialización en tiempo de ejecución.While the SelectionMode is set to Toggle, the IsToggled check box can be used to set the default value of the control at runtime initialization.

CanSelect significa que Interactable puede pasar de desactivado a on, mientras que CanDeselect significa inverso.CanSelect means the Interactable can go from off to on while the CanDeselect means the inverse.

Ejemplo de temas visuales de alternancia de perfil

Los desarrolladores pueden usar SetToggled IsToggled las interfaces y para obtener o establecer el estado de alternancia de un objeto Interactable mediante código.Developers can utilize the SetToggled and IsToggled interfaces to get/set the toggle state of an Interactable via code.

// If using SelectionMode = Toggle (i.e Dimensions == 2)

// Make the Interactable selected and toggled on
myInteractable.IsToggled = true;

// Get whether the Interactable is selected or not
bool isSelected = myInteractable.IsToggled;
Alternar colección de botonesToggle button collection

Es habitual tener una lista de botones de alternancia donde solo uno puede estar activo en un momento dado, también conocido como un conjunto radial o botones de radio, etc.It is common to have a list of toggle buttons where only one can be active at any given time, also known as a radial set or radio buttons etc.

Use el InteractableToggleCollection componente para habilitar esta funcionalidad.Use the InteractableToggleCollection component to enable this functionality. Este control garantiza que solo se active un interactable en un momento dado.This control ensures only one Interactable is toggled on at any given time. RadialSet (Assets/MRTK/SDK/Features/UX/Interactable/Prefabs/RadialSet.prefab) también es un excelente punto de partida desde el principio.The RadialSet (Assets/MRTK/SDK/Features/UX/Interactable/Prefabs/RadialSet.prefab) is also a great starting point out-of-box.

Para crear un grupo de botones radiales personalizado:To create a custom radial button group:

  1. Creación de varios objetos GameObject o botones interactuablesCreate multiple Interactable GameObjects/buttons
  2. Establecer cada interactable con SelectionMode = Toggle, CanSelect = true y CanDeselect = falseSet each Interactable with SelectionMode = Toggle, CanSelect = true, and CanDeselect = false
  3. Cree un elemento GameObject primario vacío en todos los elementos Interactables y agregue el componente InteractableToggleCollection.Create an empty parent GameObject over all the Interactables and add the InteractableToggleCollection component
  4. Agregar todos los elementos Interactables a ToggleList en InteractableToggleCollectionAdd all Interactables to the ToggleList on the InteractableToggleCollection
  5. Establezca la propiedad InteractableToggleCollection.CurrentIndex para determinar qué botón está seleccionado de forma predeterminada al principio.Set the InteractableToggleCollection.CurrentIndex property to determine which button is selected by default at start
Toggle collection

Botón multidimensionalMulti-dimensional button

El modo de selección de varias dimensiones se usa para crear botones secuenciales, o un botón que tiene más de dos pasos, como controlar la velocidad con tres valores, Rápido (1x), Más rápido (2x) o Más rápido (3x).Multi-Dimension selection mode is used to create sequential buttons, or a button that has more than two steps, like controlling speed with three values, Fast (1x), Faster (2x) or Fastest (3x).

Como las dimensiones son un valor numérico, se pueden agregar hasta 9 temas para controlar la etiqueta de texto o la textura del botón para cada configuración de velocidad, usando un tema diferente para cada paso.With dimensions being a numeric value, up to 9 themes can be added to control the text label or texture of the button for each speed setting, using a different theme for each of step.

Cada evento de clic avanzará en 1 en tiempo DimensionIndex de ejecución hasta que se alcance el Dimensions valor.Every click event will advance the DimensionIndex by 1 at runtime until the Dimensions value is reached. A continuación, el ciclo se restablecerá a 0.Then the cycle will reset to 0.

Ejemplo de perfil multidimensional

Los desarrolladores pueden evaluar DimensionIndex para determinar qué dimensión está activa actualmente.Developers can assess the DimensionIndex to determine which dimension is currently active.

// If using SelectionMode = Multi-dimension (i.e Dimensions >= 3)

//Access the current DimensionIndex
int currentDimension = myInteractable.CurrentDimension;

//Set the current DimensionIndex to 2
myInteractable.CurrentDimension = 2;

// Promote Dimension to next level
myInteractable.IncreaseDimension();

Creación de Interactable en tiempo de ejecuciónCreate Interactable at runtime

Interactable se puede agregar fácilmente a cualquier GameObject en tiempo de ejecución.Interactable can be easily added to any GameObject at runtime. En el ejemplo siguiente se muestra cómo asignar un perfil con un tema visual.The following example demonstrates how to assign a profile with a visual theme.

var interactableObject = GameObject.CreatePrimitive(PrimitiveType.Cylinder);
var interactable = interactableObject.AddComponent<Interactable>();

// Get the default configuration for the Theme engine InteractableColorTheme
var newThemeType = ThemeDefinition.GetDefaultThemeDefinition<InteractableColorTheme>().Value;

// Define a color for every state in our Default Interactable States
newThemeType.StateProperties[0].Values = new List<ThemePropertyValue>()
{
    new ThemePropertyValue() { Color = Color.black},  // Default
    new ThemePropertyValue() { Color = Color.black}, // Focus
    new ThemePropertyValue() { Color = Random.ColorHSV()},   // Pressed
    new ThemePropertyValue() { Color = Color.black},   // Disabled
};

interactable.Profiles = new List<InteractableProfileItem>()
{
    new InteractableProfileItem()
    {
        Themes = new List<Theme>()
        {
            Interactable.GetDefaultThemeAsset(new List<ThemeDefinition>() { newThemeType })
        },
        Target = interactableObject,
    },
};

// Force the Interactable to be clicked
interactable.TriggerOnClick()

Eventos interactuables a través de códigoInteractable events via code

Se puede agregar una acción al evento base Interactable.OnClick a través del código con el ejemplo siguiente.One can add an action to the base Interactable.OnClick event via code with the following example.

public static void AddOnClick(Interactable interactable)
{
    interactable.OnClick.AddListener(() => Debug.Log("Interactable clicked"));
}

Use la función Interactable.AddReceiver<T>() para agregar receptores de eventos dinámicamente en tiempo de ejecución.Use the Interactable.AddReceiver<T>() function to add event receivers dynamically at runtime.

En el código de ejemplo siguiente se muestra cómo agregar un objeto InteractableOnFocusReceiver, que escucha la entrada y salida del foco y, además, definir el código de acción que se realizará cuando se desenfoque la instancia de evento.The example code below demonstrates how to add an InteractableOnFocusReceiver, which listens for focus enter/exit, and furthermore define action code to perform when the event instances fire.

public static void AddFocusEvents(Interactable interactable)
{
    var onFocusReceiver = interactable.AddReceiver<InteractableOnFocusReceiver>();

    onFocusReceiver.OnFocusOn.AddListener(() => Debug.Log("Focus on"));
    onFocusReceiver.OnFocusOff.AddListener(() => Debug.Log("Focus off"));
}

En el código de ejemplo siguiente se muestra cómo agregar un objeto InteractableOnToggleReceiver, que escucha las transiciones de estado seleccionadas o deseleccionada en interactuables con alternancia y, además, define el código de acción que se realizará cuando se activen las instancias de evento. The example code below demonstrates how to add an InteractableOnToggleReceiver, which listens for selected/deselected state transitions on toggle-able Interactables, and furthermore defines action code to perform when the event instances fire.

public static void AddToggleEvents(Interactable interactable)
{
    var toggleReceiver = interactable.AddReceiver<InteractableOnToggleReceiver>();

    // Make the interactable have toggle capability, from code.
    // In the gui editor it's much easier
    interactable.Dimensions = 2;
    interactable.CanSelect = true;
    interactable.CanDeselect  = true;

    toggleReceiver.OnSelect.AddListener(() => Debug.Log("Toggle selected"));
    toggleReceiver.OnDeselect.AddListener(() => Debug.Log("Toggle un-selected"));
}

Consulte tambiénSee also