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 recolecten monedas y desactive la recolección de una moneda si se ha recolectado recientemente.
Crear las Monedas
Antes de que pueda hacer nada, necesita tener objetos de marcador en el mundo para usar como sus monedas. Como las plataformas de pila de mar que hizo en la sección anterior, las monedas pueden ser objetos simples Part objetos.
Para crear las monedas:
En la ventana Explorador , añade un nuevo directorio en el World directorio, y luego renombrarlo Coins .
Inserta una parte de 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 .
- Establece Tamaño a 0.6, 8, 4 .
- Desactivar CanCollide . Esto le dice al motor que otras partes pueden pasar por la moneda, lo que significa que los jugadores pueden caminar a través de las monedas para recogerlas.
- Habilita Anchored . 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 algunas monedas y posiciónalas alrededor del mapa para propósitos de prueba.
Tus partes de cilindro ahora se ven como monedas y evitan la simulación de física, pero necesitas añadir lógica a las monedas para que los jugadores las puedan recoger.
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 toca una moneda, pero necesitas declararlo en un script. Para crear un script:
En la ventana Explorer , pasa el cursor sobre ServerScriptService y haz clic en el botón ⊕ . Se muestra un menú contextual.
Desde el menú contextual, seleccione Script . Se muestra un nuevo script debajo de ServerScriptService , que le dice al motor que ejecute el script en el servidor y evita que los clientes accedan al código.
Renombre el script a CoinService .
Reemplace el código predeterminado con el siguiente código:
-- Inicializando 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 gestor 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-- Configurando evento escuchasfor _, 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 del códigoLas siguientes secciones explican cómo funciona el script con más detalle.
Inicializando Servicios y Variables
Como con mucho del código que probablemente has escrito en otros idiomas, definiste 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 funciones integradas para características comunes. El script primero obtiene instancias del servicio de Workspace , que contiene todos los objetos en el mundo 3D, y el servicio de 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 moneda con el método GetChildren() . Este método devuelve un arreglo que contiene todo lo padreado al objeto con el que se asocia, que en este caso es el Workspace.World.Coins directorio que creaste 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.
Inicializando 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 Handler del Evento
El motor de Roblox simula físicamente el mundo 3D y maneja mucha de la lógica para manejar eventos relacionados con el rendimiento, 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 que el motor hace el resto. En este caso, estás escuchando y manejando eventos relacionados con las moned
Detecta si la moneda está habilitada - Cada Instance tiene un atributo de Enabled que define si el objeto existe en el mundo 3D. Puedes obtener atributos de instancia con el método 0> Class.Instance:GetAttribute()|GetAttribute()0>.
Detecta si un jugador tocó la moneda - Si se habilita la moneda, el método usa el servicio del jugador para verificar si el objeto que tocó la moneda era un jugador. Cuando ocurre un evento de toque, el motor de Roblox pasa el objeto que tocó la moneda como un parámetro de otherPart . El script comprueba si el padre de otherPart pertene
Desactiva la moneda si un jugador la toca, y la reactiva después de 10 segundos - Finalmente, si un jugador toca la moneda, el método la desactiva, espera 10 segundos y luego reactiva la moneda para la colecciones. task.wait() es usado en lugar de wait() porque proporciona un mejor rendimiento
Definiendo el gestor 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
Conectando el Handler del Evento
Todos los objetos 3D simulados heredan de BasePart y por lo tanto tienen un evento Touched() . El siguiente ciclo conecta el controlador de onTouchedEvent() a cada evento de toque de moneda al hacer lo siguiendo:
Loop a través de todas las monedas - Loop a través de cada una de las monedas usando generalización.
Conecta el handleador al evento - En cada iteración de la cadena, la moneda está habilitada por defecto, por lo que es visible en el mundo 3D durante la inicialización de la experiencia. El método onCoinTouched() del handleador también se conecta al evento Touched de la mon
Conectando el manejador de eventosfor _, coin in coins docoin:SetAttribute("Enabled", true)coin.Touched:Connect(function(otherPart)onCoinTouched(otherPart, coin)end)end
Probar el mecánico
Es hora de ver si la colección de monedas funciona como se esperaba. Para probar tu experiencia:
En la barra de menú, haz clic en el botón Reproducir . Studio entra en modo de prueba de juego.
Mueva su personaje para tocar una moneda. Si sus scripts están funcionando correctamente, la ventana de salida muestra Player ha recogido la moneda , y la moneda desaparece durante 10 segundos antes de reaparecer.