Guía del programador de Scripting en la nube
En esta guía se describe cómo usar mesh Cloud Scripting API y las herramientas de desarrollo para compilar entornos (estos comienzan como proyectos en Unity y, a continuación, se cargan en una colección mesh). Le recomendamos que lea primero la sección Establecimiento de la infraestructura de scripting en la nube en Azure para familiarizarse con los conceptos y la arquitectura básica de Mesh Cloud Scripting.
En esta sección se describen las características y la interfaz de mesh Cloud Scripting API, que se usa para escribir los scripts que impulsan comportamientos en entornos.
Estructura DOM básica
La estructura DOM refleja la estructura de la escena de Unity. El miembro "Scene" de la aplicación corresponde al objeto de juego al que está asociado el componente Mesh Cloud Scripting. Las siguientes clases de Mesh Cloud Scripting API asignan uno a uno con objetos de Unity creados en el editor:
- GameObject (componente de transformación de &):> TransformNode
- Componente de luz:> PointLightNode, SpotLightNode, DirectionalLightNode
- Componente de animador:> AnimationNode (y clases derivadas, consulte a continuación)
- Componente colisionador de box:> BoxGeometryNode
- Componente del colisionador de esfera:> SphereGeometryNode
- Componente del colisionador de cápsulas -> CapsuleGeometryNode
- Componente del colisionador de malla:> MeshGeometryNode
- Componente Text Mesh Pro:> TextNode
- Componente Rigidbody:> RigidBodyNode
Por ejemplo, si creas una escena con un objeto de juego que tiene un componente Light (establecido en una luz puntual) y un colisionador de esfera conectado, la escena contendrá un TransformNode con dos elementos secundarios: PointLightNode y SphereGeometryNode.
Además, algunos objetos mesh Cloud Scripting API no tienen los componentes integrados de Unity correspondientes. Estos son componentes adicionales que puede crear en Unity que forman parte del paquete del kit de herramientas de Mesh.
- Componente Mesh Cloud Scripting (descrito anteriormente)
- Componente WebSlate
Asignación del DOM de Unity al DOM de malla
Puede crear una escena con componentes que mesh Cloud Scripting API no conoce. Estos simplemente no existirán en mesh Cloud Scripting DOM para la escena. Sin embargo, la estructura de escena completa de GameObjects se reflejará en la API DOM como TransformNodes.
Unity tiene una forma de API GameObject/component; Sin embargo, Mesh Cloud Scripting DOM tiene una estructura de árbol único. TransformNode en mesh Cloud Scripting API tiene elementos secundarios que pueden ser otros TransformNodes o pueden ser otros nodos que se asignan a los componentes. Podemos considerar esta lista combinada de los componentes del objeto de juego asociado y los elementos secundarios de su componente de transformación.
Rect Transform
Si agregas un componente que usa rectTransform (por ejemplo, el componente Text Mesh Pro), el objeto de juego no aparecerá como un nodo en el gráfico de escena mesh Cloud Scripting. Todavía es posible mover, habilitar y deshabilitar este componente, pero para ello, es necesario encapsular el objeto de juego mediante RectTransform en otro objeto de juego mediante el componente De transformación normal.
Eventos de cambio de propiedades
Puede suscribirse a eventos de cambio de propiedad llamando a AddPropertyChangedEventHandler
en cualquier nodo de la jerarquía. Debe pasar el nombre de la propiedad como una cadena.
También es posible suscribirse a todos los eventos mediante la suscripción al DomObjectPropertyChanged
evento. Se llama a esto cuando cambia cualquier propiedad del DOM.
Ciclo de vida de los objetos
Los nodos, cuando se crean, no son primarios. Esto significa que no estarán visibles en la escena hasta que se agreguen explícitamente como elemento secundario a la escena o a uno de sus descendientes. Del mismo modo, si se establece el elemento primario de un nodo en NULL, se quitará y sus descendientes de la escena.
A veces quiere deshabilitar un nodo temporalmente, pero no mantener un registro de dónde estaba en la escena. Por este motivo, cada nodo tiene una marca "activa". Cuando se establece en false, deshabilitará el nodo y sus descendientes.
Puede crear objetos y componentes de juego en Unity que forman parte de la escena, pero están deshabilitados. Estos aparecerán como nodos en la jerarquía de la escena mesh Cloud Scripting, pero tendrán su marca activa establecida en false. Si se establece la marca activa en true, se habilitarán en la escena de Unity.
Clonación y reparentes
Los nodos se pueden clonar y reparentar en mesh Cloud Scripting API; la escena de Unity correspondiente se actualizará en consecuencia. Si clona un nodo, clonará ese nodo y todos sus elementos secundarios (incluidos los elementos secundarios que pueden estar en los objetos de Unity correspondientes, pero no son visibles para Mesh Cloud Scripting).
Es posible clonar o reparentar nodos que corresponden a componentes de Unity. Esto se implementa mediante la recreación de estos componentes de Unity en función de las representaciones del nodo Mesh Cloud Scripting. Solo los nodos que se pueden crear a través de Mesh Cloud Scripting API se pueden clonar o reparentar. Si ha creado un componente en Unity y ha establecido campos que no se reflejan en el nodo de scripting en la nube de malla correspondiente, estos campos se restablecerán a sus valores predeterminados si se clona el propio nodo. Por este motivo, se recomienda clonar o reparentar nodos de transformación en los que se manipulan objetos creados en Unity. Estos siempre mantendrán correctamente toda la configuración original de Unity.
Usuarios
Hay varios lugares en la API que proporcionan propiedades de usuario. La User.Identifier
propiedad es una cadena de identificador persistente que es persistente para el usuario, incluso si el usuario deja y vuelve a unirse. El nombre para mostrar del usuario también es accesible a través User.DisplayName
de . El identificador de evento desde el que se ha conectado el usuario es accesible a través User.ConnectedEventId
de .
Durante el desarrollo, el nombre para mostrar del usuario, el identificador y el identificador de evento se pueden simular en el editor de componentes Mesh Cloud Scripting en la "Configuración del desarrollador", como se muestra a continuación.
Avatares
Avatares son la representación de los usuarios en la escena. Se pueden usar para teletransportar a los usuarios a una ubicación determinada, viajar entre escenas y detectar colisiones con volúmenes desencadenadores.
Cuadros de diálogo de información
Es posible que en Mesh Cloud Scripting aparezca un cuadro de diálogo de espacio de pantalla en la aplicación Microsoft Mesh con un mensaje personalizado. SceneNode contiene una función para esto, ShowMessageToParticipants(string message, IReadOnlyCollection<Participant> participants)
. Las etiquetas de texto enriquecido se pueden usar en el mensaje para controlar las propiedades de texto (color, negrita, etc.).
Cuadros de diálogo de entrada
Mesh Cloud Scripting puede solicitar una entrada de texto de un asistente en un evento Mesh con un mensaje personalizado. CloudApplication
proporciona el método Task<string> ShowInputDialogToParticipantAsync(string message, Participant participant, CancellationToken token)
. Las etiquetas de texto enriquecido se pueden usar en el mensaje para controlar las propiedades de texto (por ejemplo, color o negrita).
Clases
CloudApplication
La ICloudApplication
interfaz es el punto de partida para desarrollar aplicaciones mesh. Está disponible en "App.cs" como la variable _app. Además de la escena, ICloudApplication
tiene funciones de creación para todos los tipos disponibles. También tiene una serie de otros métodos, pero son para uso interno.
InteractableNode
MeshInteractableSetup es un componente de Unity personalizado que forma parte del paquete del kit de herramientas de Mesh. Al adjuntarlo a un objeto de juego en Unity, generará eventos de clic cuando cualquier usuario haga clic en cualquiera de los collidables activos de ese objeto de juego o sus elementos secundarios.
A continuación se muestra un ejemplo sencillo, donde el componente MeshInteractableSetup se agrega al mismo objeto de juego que el colisionador de cuadros:
WebSlateNode
WebSlate es un componente de Unity personalizado que forma parte del paquete del kit de herramientas de Mesh. Para agregar un objeto prefabricado WebSlate a la escena, seleccione GameObject>Mesh Toolkit>WebSlate en la barra de menús. El sitio web que se asigna a la propiedad URL de la instancia de WebSlate se representa en el quad de este objeto prefabricado.
A continuación se muestra un ejemplo, donde se ha agregado un objeto prefabricado WebSlate a la escena y se ha asignado una dirección URL:
var webSlateNode = Root.FindFirstChild<WebSlateNode>(true);
webSlateNode.Url = new System.Uri("https://en.wikipedia.org/wiki/Color");
Escuchar clics
Este es un script sencillo de Scripting en la nube de Mesh que gira el cubo cada vez que se hace clic en él. Reemplace el método de código auxiliar StartAsync
dentro App.cs
por este código.
private float _angle = 0;
public Task StartAsync(CancellationToken token)
{
// First we find the TransformNode that corresponds to our Cube gameobject
var transform = _app.Scene.FindFirstChild<TransformNode>();
// Then we find the InteractableNode child of that TransformNode
var sensor = transform.FindFirstChild<InteractableNode>();
// Handle a button click
sensor.Selected += (_, _) =>
{
// Update the angle on each click
_angle += MathF.PI / 8;
transform.Rotation = new Rotation { X = 1, Y = 0, Z = 0, Angle = _angle };
};
return Task.CompletedTask;
}
Información de aciertos
Es posible averiguar qué usuario ha hecho clic en el colisionador examinando los argumentos del evento de cambio de propiedad. También puede leer el contacto normal y la posición del clic en los argumentos del evento. Estas coordenadas serán relativas al espacio de coordenadas local de InteractableNode.
Animadores
Puede crear y agregar un animador de Unity a la escena y controlarlo a través de Mesh Cloud Scripting. El complemento mesh toolkit buscará los recursos del proyecto de Unity y, para cada animador que se encuentre, generará una clase en una carpeta "AnimationScripts" en el proyecto Mesh Cloud Scripting. Esta clase deriva de AnimationNode y se puede usar para controlar el animador de Mesh Cloud Scripting. Cuando agregues el Animator como componente a un objeto de juego en Unity, encontrarás una instancia correspondiente de la clase generada como elemento secundario del transformNode correspondiente. Con la API de esta clase, puede controlar el Animator.
El modelo de programación Mesh Cloud Scripting es autoritativo del servidor y solo se admite un pequeño subconjunto de la funcionalidad animator. Esto se debe a que modelamos el animador en el servidor y esperamos que todos los clientes se sincronicen con precisión con el modelo de servidor. Por este motivo, actualmente solo se admite la SIGUIENTE API:
- Configuración de estado (para cada capa hay una propiedad correspondiente en la clase que se puede establecer en una enumeración basada en los estados disponibles en el Animator). Los estados se establecen inmediatamente, no a través de transiciones.
- Valor de variable float: solo se exponen variables float y solo para el propósito de enlazar a "Tiempo de movimiento" en un animador.
- Configuración de velocidad de capa
Dentro de un estado, puede crear un clip de animación sin restricciones sobre los valores que puede establecer en la escena de Unity. También se admiten clips de animación de bucle. Las siguientes características de animadores no se admiten a través de AnimationNodes:
- Transiciones: si agrega transiciones al animador, no podrá desencadenarlas a través de Mesh Cloud Scripting API (el servidor no modela las transiciones).
- Variables (distintas de floats para impulsar el tiempo de movimiento). No se admiten las variables usadas para controlar la lógica de transición ni los multiplicadores de velocidad.
- Estados reflejados, desplazamiento de ciclo y IK de pie.
Unión tardía y animadores
Cuando los clientes se unen a un evento mesh, se sincronizan con el estado actual y la hora local de todos los nodos de animación en ejecución. Si tienes una animación de larga duración que se reproduce en un estado, el tiempo de reproducción se establecerá en la hora actual correcta de la animación en combinación tardía. Sin embargo, si el estado desencadena eventos, no se desencadenarán en el cliente unido más tarde. Es posible que algunos otros escenarios no funcionen según lo previsto; por ejemplo, si activa un sonido habilitando un AudioSource al principio de un estado, audioSource seguirá estando habilitado en el cliente de unión tardía, pero comenzará a reproducirse al principio del clip de audio.
Estado inicial del animador
Se recomienda crear animadores que tengan estados predeterminados que no hagan nada. Cuando una escena comienza a reproducirse en Unity, activará todos los animadores y empezará a reproducir sus animaciones predeterminadas. Esto puede ocurrir antes de que se produzca la conexión de Mesh Cloud Scripting Service; por lo tanto, es posible que no haya ninguna manera de sincronizar estos estados y comportamiento como desee.
Reparente y clonación del animador
AnimationNodes no se puede crear a través de Mesh Cloud Scripting API. La única manera de crear un AnimationNode es exportando una escena de Unity que contiene un componente animador. Si intenta clonar o reparentar animationNode, obtendrá un error porque no hay ninguna manera de admitir esta acción. Todavía es posible clonar o reparentar el elemento primario del AnimationNode, ya que esto corresponde al objeto de juego de Unity que se puede clonar y primariamente.
Notas sobre el código generado
El código generado quitará espacios de nombres de animadores, capas, estados y variables; por ejemplo, el nombre de la variable "my var" se convierte en "myVar" en el código. Por este motivo, es posible crear animadores que no generen código válido. Por ejemplo, si tiene dos variables denominadas "my var" y "myVar", recibirá un error durante la generación y un mensaje que le pide que cambie el nombre de las variables.
LightNode
PointLightNode, DirectionalLightNode y SpotLightNode se asignan al componente Light de Unity (que tendrá su tipo establecido en el valor correspondiente). Es posible establecer los parámetros básicos de estas luces a través de las API de LightNode. También es posible crear luces a mano a través de la API. La creación de nodos ligeros a través de la API dejará los parámetros que no se pueden establecer a través de Mesh Cloud Scripting API en sus valores predeterminados.
GeometryNode
BoxGeometryNode, SphereGeometryNode, CapsuleGeometryNode y MeshGeometryNode se asignan al componente colisionador box de Unity, componente de colisionador de esferas, componente de colisionador de cápsulas y componente colisionador de malla, respectivamente. También se pueden crear a través de Mesh Cloud Scripting API. Al habilitar y deshabilitar nodos de geometría, se agregarán y se quitarán de candidatos de posicionamiento si un MeshInteractableSetup está asociado a su objeto de juego o a uno de sus elementos primarios.
La creación de nodos de geometría a través de la API dejará los parámetros que no se pueden establecer a través de mesh API en sus valores predeterminados (por ejemplo, El material físico se establecerá en ninguno y isTrigger se establecerá en false).
RigidBodyNode
La adición de un componente Rigidbody a un objeto pondrá su movimiento bajo el control de la física de malla. Sin agregar ningún código, un objeto Rigidbody se extraerá hacia abajo por gravedad y reaccionará ante colisiones con otros objetos.
Nota: GeometryNode.Friction
devolverá staticFriction
. Sin embargo, si se establece en mesh Cloud Scripting, se actualizará tanto como staticFriction
dynamicFriction
en los clientes.
Desencadenadores de volúmenes
Los nodos de geometría pueden actuar como volúmenes desencadenadores cuando su IsTrigger
propiedad se establece en true. Esta marca corresponde a la IsTrigger
propiedad del colisionador en Unity y no se puede cambiar en tiempo de ejecución. Cuando la geometría es un desencadenador, se generará Entered
y Exited
para cualquier Avatares que inicie o detenga la superposición con él.
Nota: El objeto unity debe agregarse a la TriggerVolume
capa para permitir que el haz de teletransporte lo ignore, ya que los colisionadores de la Default
capa bloquean el haz de teletransporte.
TextNode
TextNode se asigna al componente TextMeshPro de Unity. Si agrega un componente TextMeshPro a la escena, habrá un TextNode correspondiente en la jerarquía de escenas de Scripting en la nube de Malla. Esto le permite establecer el texto del componente en tiempo de ejecución. También puede cambiar las propiedades de texto básicas a través de TextNode API: negrita, cursiva, subrayado, tachado y color. Actualmente no es posible crear un TextNode a través de la API; Debe crearlos agregándolos a la escena en Unity. Además, no puede clonar un TextNode directamente; en su lugar, debe clonar el TranformNode primario de TextNode.
Mallas
Actualmente, las mallas son componentes "ocultos" en mesh Cloud Scripting API. Se pueden crear en el editor de Unity y se pueden manipular manipulando sus objetos de juego primarios o componentes de transformación, pero no se pueden crear mediante programación, ni se pueden editar sus propiedades en tiempo de ejecución a través de mesh API.
Otros temas de Scripting en la nube de Mesh
Adición de recursos al servicio Mesh Cloud Scripting
Si necesita agregar un recurso para que lo use Mesh Cloud Scripting Service, debe agregarlo como un recurso incrustado en el archivo de proyecto de C#. Esto se puede hacer a través de la interfaz de usuario del proyecto en Visual Studio o agregando la siguiente línea al archivo .csproj directamente:
<EmbeddedResource Include="<my_resource_file>" CopyToOutputDirectory="PreserveNewest" />
Tenga en cuenta que así es como se empaqueta scene.map, que puede ver en el archivo .csproj como referencia.
Trabajar con física de malla
Mesh Physics
se encargará de sincronizar el movimiento de los cuerpos rígidos entre los clientes. Mesh Cloud Scripting TransformNode.Position
, TransformNode.Rotation
y RigidBody.Velocity
RigidBody.AngularVelocity
no se actualizarán con el estado de simulación más reciente. Sin embargo, los clientes aplicarán cambios si se establecen en Mesh Cloud Scripting Service. Tenga en cuenta que cambiar la propiedad única dejará a otros sin cambios. Por ejemplo, si solo se establece la posición, la velocidad no se cambiará y el cuerpo rígido continuará el movimiento con la velocidad antigua desde la nueva posición. Dado que Mesh Cloud Scripting Service no se actualiza con el estado de movimiento más reciente para cuerpos rígidos, se recomienda establecer estos solo para nuevos cuerpos rígidos.
Si TransformNode
con RigidBodyNode
se clona, el cuerpo clonado se registrará y se entregará a Mesh Physics
para la sincronización entre los clientes. Nota: El cuerpo rígido clonado tendrá posición, rotación y velocidades desde el principio de la escena del cuerpo rígido original. Si estos deben ser diferentes, deben establecerse explícitamente en Mesh Cloud Scripting.