Sistemas de soporte

*Este contenido se traduce usando la IA (Beta) y puede contener errores. Para ver esta página en inglés, haz clic en aquí.

Utilizamos los siguientes sistemas para soportar tanto los sistemas de juego fundamentales como cualquier objetivo de los requisitos de diseño principales >.

Uso de Manager

UseManager proporcionó una API simple para aplicar un objeto agarrado a algo, como una pieza de ropa en capas a un maniquí.La función principal para esta API es UseManager.AddUse (etiquetas, objetivos, distancia, onSuccess, onNothingEquipped, onWrongEquipped, datos adicionales), que vincula un conjunto de etiquetas a objetivos .Cuando un jugador tiene un objeto con una de las etiquetas y hace clic en un objetivo, se llama la función de devolución de llamada onSuccess.Otras funciones de llamada nos permitieron mostrar información visual adicional a los jugadores si se hace un clic sin un artículo agarrado o con el tipo de artículo incorrecto.

Podríamos eliminar el "uso" con UseManager.RemoveUse, que solía ser útil cuando una misión terminaba o un artículo específico era "usado".Además, podríamos añadir o eliminar objetivos con AddUseTargets y RemoveUseTargets .

Destacados

Cuando un jugador estaba cerca de un artículo de interés, como un sello, queríamos que ese artículo se destacara de su entorno.Para implementar esto, creamos un LocalScript llamado Resaltar elementos que usa una esfera centrada alrededor del jugador para detectar toques con otras mallas, conectándose a Touched y TouchEnded eventos.La función getHighlight comprueba varias etiquetas en una malla tocada o sus padres usando una función ayudante GetTaggedObjectUpHierarchy .Si algún resalte no es necesario, podríamos eliminarlo forzosamente usando una etiqueta Sin resalte .Sin embargo, si se necesita pero no encaja bien con varias otras etiquetas, podríamos forzarlo usando la etiqueta Importante .

Esta utilización de un nuevo motor utiliza una nueva característica del motor que dibuja un contorno de un objeto y/o llena el interior del objeto con un color definido; para obtener más información sobre cómo usar esta función, vea Resaltar objetos. Highlights y el cursor de la ratón OnItemIndicator sistemas trabajan juntos, por lo que Highlights no solo determina si una malla necesita un resalte, sino que también proporciona un tipo de malla para OnItemIndicator .

HighlightItemsFunc se usa para comunicarse con otros sistemas cliente.Por ejemplo, EventManager lo usa con un comando Habilitar para habilitar o deshabilitar un Highlight en ciertas escenas, y OnItemIndicator lo usa GetType para preguntar sobre el tipo de objeto que es.Para detectar cuando un artículo ya no está presente, como cuando se destruye una habitación corrupta, nos conectamos a CollectionService.GetInstanceRemovedSignal .

Historia y burbujas de pensamiento

Sabiduría y Burbujas de pensamiento son 2 sistemas similares.Lore usa un ScreenGui como contenedor de interfaz de usuario en la pantalla con un hijo Frame para controlar el tamaño y el redimensionamiento de sus hijos TextLabels y ImageLabels , y Lore espera que el jugador haga clic en cualquier lugar de la pantalla para eliminarlo.Del mismo modo, las burbujas de pensamiento usan un BillboardGui con un hijo TextLabel a objetos no relacionados, y muestra diálogo en el espacio 3D cerca del objeto por un período de tiempo especificado y período de reutilización sin que el texto ocupe toda la pantalla.Para obtener más información sobre el diseño detrás de estos sistemas, vea Lore y Burbujas de pensamiento.

Lore se implementa en el LoreManger LocalScript .Cuando se hace clic o se toca, dispara un raycast usando una función ayudante utils.RaycastAlongPointingDir , y usa un grupo NoPlayerCollision .Si una malla debajo del clic o uno de los padres tiene una etiqueta Lore o Burbuja de pensamiento , mostramos la interfaz de usuario.El texto, la captura y la imagen se definen por los atributos LoreText, LoreCaption y LoreImage en el objeto.

Tenga en cuenta que usamos Camera.ViewportPointToRay o Camera.ScreenPointToRay para construir el rayo, dependiendo de si se llamó desde un no toque o toque.Las coordenadas están en sistemas de coordenadas algo diferentes.Para el mouse, los obtenemos de Class.UserInputService.InputEnded``:Connect para el botón de ratón 1, y para los dispositivos táctiles, los obtenemos de Class.UserInputService.TouchTapInWorld``:Connect .

Las burbujas de pensamiento son similares en general, utilizando un raycast para verificar si una malla o sus padres tienen una etiqueta burbuja de pensamiento .También usa el atributo Texto de pensamiento para el texto y una etiqueta burbuja de pensamiento para apuntar a un objeto de marcador utilizado para posicionar la interfaz de usuario en el mundo.Las burbujas de pensamiento que usan el mismo objeto posicional pero tienen texto diferente tienen diferentes tiempos de reutilización.

Casos especiales

Lore tiene un par de casos especiales, uno de los cuales son las focas corruptas.Cuando un jugador hace clic en un sello corrupto, se muestra la interfaz de usuario de conocimiento y espera un clic para iniciar una misión, que afecta el flujo del juego.Esto es manejado por el GameStateClient que usa una interfaz de usuario de conocimiento vinculable LoreManagerFunc para solicitar la interfaz de usuario de conocimiento.Se proporciona una llamada de devolución al sistema de conocimiento por GameStateClient para saber cuándo el conocimiento está "cerrado" por el jugador.Otro caso especial es cuando Burbujas de pensamiento y Conocimiento etiquetas están en el mismo objeto.En este caso, para evitar una superposición de texto de la burbuja de conocimiento y pensamiento, ejecutamos la burbuja de pensamiento después de que se cierre el conocimiento. LoreManager también maneja un caso especial al mostrar una pequeña escena cuando se hace clic en puertas deshabilitadas que están bloqueadas hasta que el jugador recoge la llave de la habitación.

Indicador de elemento en

Queremos mostrar diferentes iconos en el centro de la pantalla cuando el jugador está mirando ciertos elementos de interés.El script del cliente OnItemindicator hace un raycast a lo largo de la cámara Class.CFrame.LookVector y analiza los resultados.Basado en los resultados, establece una imagen en el indicador de elemento OnItemIndicator2 ScreenGui .

Cuando no se golpean elementos de interés, el icono predeterminado es un pequeño punto.Podríamos establecer cualquier icono agregando un atributo OnItemIndicator a una malla específica, usando los nombres de onItemIndicatorImages , como Mano, Ojo o Puerta actualmente bloqueada.El atributo solo se necesita en casos raros, y la mayor parte del tiempo otras etiquetas o sistemas existentes proporcionan el tipo de ícono.Para más detalles, vea la función Update .

Tipo revisa algunos en un orden de prioridad.Después de la invalidar/reemplazarde OnItemIndicator, comprobamos si es agarrable o un cajón para el icono de "mano" a través de utils.CanGrabModel(model) o utils.GetTaggedObjectUpHierarchy("Drawer2", model) .Después de eso, llamamos HighlightManager que determina el estado de resalte, los tipos de elementos y el icono que usar.Por ejemplo:


highlightItemsFunc:Invoke({"GetType", curInst})

Las etiquetas Lore y ThoughtBubble se verifican más tarde al verificar las etiquetas.Para las puertas, tenemos 2 iconos diferentes: Puerta actualmente cerrada y Puerta siempre bloqueada . DoorManager establece un atributo verdadero o falso DoorEnabled para puertas que se pueden abrir o cerrar, y usamos la presencia y el valor del atributo.Los objetos que se parecen a puertas pero no se abren tienen la etiqueta Puerta bloqueada .

Gestor de puertas

El Gerente de puertas LocalScript usa una etiqueta Puerta y CollectionService para administrar la apertura y el cierre de puertas.La puerta tiene gatillos delante y detrás que conectamos con toques y eventos touchEnded .Creamos adolescentes para abrir y cerrar una puerta desde el frente y los lados traseros.Mantenemos un mapa de jugadoresCercano (de jugadores que tocan los gatillos, por separado para el frente y el lado trasero.

Cada puerta tiene un sistema de estado simple, DoorState (Cerrado, Abriendo, Abierto, Cerrando), con adolescentes utilizados para transiciones.Podríamos habilitar o deshabilitar la capacidad de una puerta de abrirse o cerrarse desde sistemas externos llamando DoorManager.EnableDoor , que establece un atributo DoorEnabled.

Animador maestro

El Animador maestro LocalScript reproduce imágenes animadas (atlas de texturas), que solíamos animar en las pantallas de TV.Para desplazarse a través de las imágenes, necesitábamos conocer un conjunto de parámetros: número de filas y columnas, cantidad total de marcos, períodos, dimensiones de imagen y un conjunto de ID de imagen.El sistema nos permitió animar a través de múltiples imágenes, cada una posiblemente dividida en filas y columnas de subimágenes.Podríamos proporcionar estos datos a través de atributos o valores, pero en esta experiencia, usamos scripts de ayuda. UpdateImageAnimations(dT) calcula qué imagen o subimagen necesitábamos mostrar usando tiempo y parámetros.Si necesitábamos cambiar a una nueva imagen, configuramos la imagen.Si necesitamos cambiar cualquier subimagen, establecemos ImageRectOffset .

Un objeto con un animado SurfaceGui tendría un animador ModuleScript , con el principal propósito de proporcionar una función Animator.GetParams que devuelve todos los parámetros.Esto ayuda al MaestroAnimador LocalScript que usa la etiqueta Animación de imagen y CollectionService para recopilar tales objetos, y encontrar al Animador ModuleScript debajo de ellos.Luego usa pcall para requerir Animador ModuleScript y llamar GetParams en él.

Animaciones de espacio local

El LocalSpaceAnimations LocalScript usa una etiqueta LocalSpaceRotation para rotar principalmente objetos "cosméticos" con una velocidad de rotación dada y un retraso alrededor del eje X, Y o Z.Utilizamos esto para objetos distantes con los que los jugadores no interactuarían o para objetos más pequeños que no afectan mucho a la simulación.Parámetros definidos a través de los valores Speed, Delay y Axis.Para detalles de implementación, vea Rotación de mallas de nube.

Gestor de lámpara de cabeza

El HeadlampManager maneja cuando los usuarios seleccionan el en la pantalla para activar o desactivar el foco en la parte superior de su cabeza, dispara comentarios al servidor usando HeadlampEvent y platos que se activan y desactivan al mismo tiempo.Cuando se agrega un personaje, o su Head cambia, la función giveCharacterHeadlamp clona la lámpara templateHeadlamp y posiciona la lámpara usando algunos desplazamientos y rotaciones de la FaceFrontAttachment .

Gestor de asientos

No queremos que los jugadores se sienten automáticamente cuando están cerca de un objeto en el que pueden sentarse.En cambio, queremos requerir que los usuarios hagan clic cerca de un asiento para sentarse.El script SeatManager añade ClickDetectors basado en una etiqueta Asiento , y llama seat:Sit(humanoid) cuando se hace clic.Al teletransportar jugadores entre el estado normal y corrupto de una habitación, no podemos tener jugadores sentados porque CFrame la coordinación de cambio no podría funcionar, por lo que el Gerente de asientos tiene una funcionalidad para desactivar o habilitar el asiento unos segundos antes y después del teletransportación.

Gestor de cajones

El script DrawerManager usa una etiqueta Drawer2 y CollectionService para manejar el clic en los cajones para abrirlos o cerrarlos, y reproducir cualquier sonido, audiocorrespondiente.La acción de apertura y cierre se realiza estableciendo TargetPosition para un PrismaticConstraint .

Volúmenes de matanza

En un par de áreas del área principal de juego, como las chispas eléctricas y el agua cerca del comienzo de la carretera que conduce a la casa, un jugador puede tener su Humanoid.Health configurado a 0 cuando ingresa a un volumen con la etiqueta KillVolume .El script KillVolumes usa Touched:Connect para determinar cuándo un jugador ingresa a un volumen, luego reduce su salud a 0 .

Reaparición de la misión del jugador

El script PlayerMissionRespawn usa una etiqueta RespawnVolume y CollectionService para tratar los volúmenes que hacen que los jugadores reaparezcan cuando se tocan.Colocamos estos volúmenes debajo de habitaciones corruptas, ya que muchas misiones tienen vacíos o plataformas móviles en las que el jugador podría caer.Cuando se toca, el script reproduce una pequeña escena Teleport_Jump y invoca GameStateFunc con el comando GameEvents.PlayerRespawn.

Al procesar GameEvents.PlayerRespawn , el script puede usar RespawnPositions , si la configuración de la misión lo proporciona.Si no, usa TeleportPositions para la misión específica.No tenemos un sistema de "puntos de control", así que CalcClosestTeleportPos simplemente selecciona los puntos más cercanos de Respawn o Teleport desde donde el jugador golpeó el RespawnVolume, usando la única distancia horizontal, "2D".

Sistemas de ayuda pequeños

Gerente de piano

El script PianoManager usa una etiqueta Piano y CollectionService para agregar ClickDetectors y reproducir uno de los sonidos de piano cuando se hace clic en el teclado.

Soporte de ritual

El vestíbulo donde los jugadores colocan sellos tiene una complicada maquinaria que experimenta cambios a medida que cada sello se coloca en su ubicación definida.Por ejemplo, dependiendo del número de sellos colocados, eventos específicos juegan para habilitar/deshabilitar luces y rayos, cambiar la transparencia de ciertos objetos, etc.El Soporte de ritual es un pequeño envoltorio sobre llamadas para esos eventos, que proporciona parámetros al evento, como qué "objeto raíz" jugarlo, dependiendo de qué sello específico se colocó.

Administrador restaurable

Algunos objetos agarrables son importantes para el juego, como las focas, y no queríamos que se perdieran si un jugador los dejó en algún lugar.Si un objeto tiene una etiqueta Restaurable , el script RestaurableManager recuerda su transformación cuando se agrega al sistema de restauración.Cuando un jugador suelta tal objeto, el sistema de agarre llama restorableManager.StartTracking .Si el objeto no se recoge nuevamente en cinco segundos, el script RestablecerGestor lo posiciona en la transformación original y restablece el tiempo de seguimiento.

Portales

En unas pocas misiones, teletransportamos a los jugadores a una distancia corta dentro de una misión, como reapareciendo jugadores que se caigan de una plataforma giratoria.Para simplificar la configuración de este tipo de teletransportación, que llamamos "Portales" en el script, se usa una función de ayuda ProcessPortal en DemoUtils .Por ejemplo, si P1 es la parte que define el desencadenadorinicial, y P2 es la parte que define la transformación del jugador de destino, el siguiente fragmento de código podría definir tal funcionalidad del portal:


P1.Touched:Connect(function(otherPart) utils.ProcessPortal(otherPart, P2) end)

Portal de procesos maneja la verificación de que otra parte es humana, teletransporta al jugador a través de un cambio de coordenadas CFrame y invoca una pequeña escena para ocultar la transición usando un evento Teleport_Jump en Gestor de eventos.

Guiones de configuración

Tenemos varios scripts de configuración, definición de datos y funcionalidad común: DemoConfig . Definiciones de misiones.Enumeraciones para estados de juegos, eventos para comunicaciones cliente-servidor. DemoGlobalSettings .Desarrollamos en un lugar, pero liberamos (y prueba de jugabilidad/ prueba de juego) en otros.El script comprueba placeID y habilita/deshabilita varias funciones de trampas y de depuración. DemoUtils .Varias funciones de utilidad.Tratar con transformaciones.Establecer visibilidad, anclada o otras propiedades.Comprobando un punto en una caja delimitadora.Encontrar objetos en la jerarquía por nombre "dotted".Administrar el almacenamiento temporal (que se puede usar para mover temporalmente modelos "en algún lugar lejos" y devolverlos más tarde).Haz clic en ayudantes de detectores.Agarrando soporte.Soporte para verificar etiquetas (especialmente a lo largo de la jerarquía).Conectar gatillos a EventManager. AudioUtils . Un par de funciones para reproducir sonidos aleatorios pesados de un establecer. GrabUtil . Funciones de ayuda para agarrar.