Ahora que tienes un mundo 3D, esta sección del tutorial te enseña cómo agregar tu primer script para definir una mecánica de recolección de monedas.Esta mecánica permite que los jugadores recojan monedas y desactiva la recogida de una moneda si recientemente se ha recogido.
Crear las monedas
Antes de que puedas programar cualquier cosa, necesitas tener objetos de marcador en el mundo para usar como monedas.Al igual que las plataformas de pila de mar que hiciste en la sección anterior, las monedas pueden ser objetos simples Part.
Para crear las monedas:
En la ventana Explorador , agrega una nueva carpeta en la carpeta Mundo , luego renombra la carpeta Monedas .
Inserta una parte cilindro en la carpeta Monedas , luego renombra la parte a Moneda .
Seleccione la parte, luego en la ventana Propiedades ,
- Establece color de ladrillo a oro .
- Establece Material a Metal .
- Establecer tamaño a .
- Desactivar CanCollide .Esto le dice al motor que otras partes pueden pasar a través de la moneda, lo que significa que los jugadores pueden caminar a través de las monedas para recogerlas.
- Habilitar Anclado .Esto le dice al motor que nunca cambie la posición de la moneda debido a cualquier simulación relacionada con la física, lo que significa que los jugadores pueden tocar la moneda sin afectar su ubicación.
Duplica unas pocas monedas más y colócalas alrededor del mapa con fines de prueba.
Tus piezas de cilindro ahora se parecen a monedas y previenen la simulación de física, pero necesitas agregar lógica a las monedas para que los jugadores puedan recogerlas.
Crear el script
Para que las monedas sean recolectables, quieres reaccionar a los jugadores que las tocan.El motor de Roblox puede notificarte cuando algo toque una moneda, pero necesitas declararlo en un script.Para crear un script:
En la ventana Explorador , pasa el mouse sobre Servicio de script del servidor y haz clic en el botón ⊕ . Se muestra un menú contextual.
Desde el menú contextual, seleccione Guión .Un nuevo script se muestra debajo de Servicio de script del servidor , que le dice al motor que ejecute el script en el servidor y evita que los clientes accedan al código.
Renombra el script a CoinService .
Reemplazar el código predeterminado con el siguiente código:
-- Inicialización de servicios y variableslocal Workspace = game:GetService("Workspace")local Players = game:GetService("Players")local coinsFolder = Workspace.World.Coinslocal coins = coinsFolder:GetChildren()local COOLDOWN = 10-- Definiendo el manipulador de eventoslocal function onCoinTouched(otherPart, coin)if coin:GetAttribute("Enabled") thenlocal character = otherPart.Parentlocal player = Players:GetPlayerFromCharacter(character)if player then-- El jugador tocó una monedacoin.Transparency = 1coin:SetAttribute("Enabled", false)print("Player collected coin")task.wait(COOLDOWN)coin.Transparency = 0coin:SetAttribute("Enabled", true)endendend-- Configurar los oyentes de eventosfor _, coin in coins docoin:SetAttribute("Enabled", true)coin.Touched:Connect(function(otherPart)onCoinTouched(otherPart, coin)end)endAhora, cada vez que un jugador toca una moneda, la moneda desaparece durante 10 segundos, y el registro de salida imprime Player collected coin .
Explicación de códigoLas siguientes secciones describen cómo funciona el script con más detalle.
Inicializar servicios y variables
Al igual que con mucho del código que probablemente hayas escrito en otros idiomas, defines variables que necesitas más tarde en la parte superior del script.Nuestro código hace lo siguiendo:
Obtener instancias de servicio - Los servicios de Roblox proporcionan funcionalidad integrada para características comunes.El script primero obtiene instancias del servicio Workspace que contiene todos los objetos en el mundo 3D, y el servicio Player que gestiona y contiene todos los jugadores conectados a tu experiencia.
Obtener referencias a todas las monedas - El script luego consulta el espacio de trabajo 3D para todas las referencias a objetos de monedas con el método GetChildren().Este método devuelve un array que contiene todo lo que está asociado al objeto con el que está asociado, que en este caso es la carpeta Workspace.World.Coins que creó anteriormente.
Define una variable global - La variable COOLDOWN se usa más tarde para definir cuánto tiempo desactivar una moneda después de que se recolecte.
Inicialización de servicios y variableslocal Workspace = game:GetService("Workspace")local Players = game:GetService("Players")local coinsFolder = Workspace.World.Coinslocal coins = coinsFolder:GetChildren()local COOLDOWN = 10...
Defina el manipulador de eventos
El motor de Roblox simula físicamente el mundo 3D y maneja mucha de la lógica para manejar eventos relacionados con el renderizado, la física y la red.Cuando estás interesado en programar tu propia lógica durante algunos de estos eventos, puedes escuchar y manejar ellos, mientras dejas que el motor haga el resto.En este caso, escuchas y manejas eventos relacionados con las monedas que se tocan.El script define la lógica para manejar este evento en el método onCoinTouched(), que hace lo siguiendo:
Detecta si la moneda está habilitada - Cada tiene un atributo booleano que define si el objeto existe o no en el mundo 3D.Puedes obtener atributos de instancia con el método GetAttribute().
Detecta si un jugador tocó la moneda - Si se habilita una moneda, el método usa el servicio del jugador para verificar si el objeto que tocó la moneda era de hecho un jugador.Cuando ocurre un evento de toque, el motor de Roblox pasa el objeto que tocó la moneda como parámetro otherPart.El script comprueba si el padre de otherPart pertenece a un jugador.
Desactiva la moneda si un jugador la toca, y la vuelve a habilitar después de 10 segundos - Por último, si un jugador toca la moneda, el método desactiva la moneda, espera 10 segundos, y luego vuelve a habilitar la moneda para la colecciones. task.wait() se usa en lugar de wait() porque proporciona un mejor rendimiento al no pausar la ejecución del código por completo, permitiendo que las tareas en otros subprocesos se ejecuten simultáneamente.
Definiendo el manipulador de eventoslocal function onCoinTouched(otherPart, coin)if coin:GetAttribute("Enabled") thenlocal character = otherPart.Parentlocal player = Players:GetPlayerFromCharacter(character)if player then-- El jugador tocó una monedacoin.Transparency = 1coin:SetAttribute("Enabled", false)print("Player collected coin")task.wait(COOLDOWN)coin.Transparency = 0coin:SetAttribute("Enabled", true)endendend
Conecta el manipulador de eventos
Todos los objetos 3D simulados heredados de BasePart y, por lo tanto, tienen un evento Touched().El siguiente bucle conecta el manejador onTouchedEvent() al evento de toque de cada moneda haciendo lo siguiendo:
Bucle a través de todas las monedas - Bucle a través de cada una de las monedas usando la iteración general.
Conecta el manejador al evento - En cada iteración del bucle, la moneda se habilita por defecto, por lo que es visible en el mundo 3D durante el inicio inicial de la experiencia.El método manejador onCoinTouched() también está conectado al evento Touched de la moneda para que se ejecute cada vez que ocurra el evento.Cuando el motor detecta un toque, también pasa por el objeto que tocó el objeto, otherPart .
Conectando el manipulador de eventosfor _, coin in coins docoin:SetAttribute("Enabled", true)coin.Touched:Connect(function(otherPart)onCoinTouched(otherPart, coin)end)end
Prueba la mecánica
Es hora de ver si la mecánica de la colección de monedas funciona como se pretendía. Para probar tu experiencia:
En la barra de herramientas, haz clic en el botón Jugar . Studio entra en modo de prueba de juego.
Mueve tu personaje para tocar una moneda.Si tus scripts funcionan correctamente, la ventana Salida muestra Player collected coin y la moneda desaparece durante 10 segundos antes de reaparecer.