Ahora que tienes un mundo 3D, es hora de agregar tu primer script. En esta sección, crearás una mecánica de colección de monedas que permite a los jugadores recoger monedas y desactiva temporalmente las monedas después de que han sido recogidas.
Crea las monedas
Antes de que puedas programar algo, necesitas tener objetos de marcador de posición en el mundo para usar como tus monedas. Al igual que las plataformas de pilas de mar que hiciste en la sección anterior, las monedas pueden ser objetos simples de Part.
En Workspace > World, crea una nueva carpeta llamada Coins.
Dentro de la carpeta Coins, crea una parte cilíndrica llamada Coin con BrickColor configurado en Gold, Material configurado en Metal, Size 0.6, 8, 4, y Orientation 90, 0, 0.
Desactiva CanCollide y habilita Anchored.
Luego, duplica la parte Coin varias veces y esparce las duplicaciones alrededor de la isla y en las plataformas para que sean accesibles desde los niveles de las pilas de mar.
Mantén cada duplicado nombrado Coin.Crea el script
A continuación, harás que las monedas respondan a los jugadores. El motor de Roblox puede detectar cuándo algo toca una moneda, pero necesitas usar un script para definir cómo debe reaccionar la moneda.
En ServerScriptService, crea un Script llamado CoinService con el siguiente código:
```lua
-- Inicializando servicios y variables
local Workspace = game:GetService("Workspace")
local Players = game:GetService("Players")
local coinsFolder = Workspace.World.Coins
local coins = coinsFolder:GetChildren()
local COOLDOWN = 10
-- Definiendo el manejador de eventos
local function onCoinTouched(otherPart, coin)
if coin:GetAttribute("Enabled") then
local character = otherPart.Parent
local player = Players:GetPlayerFromCharacter(character)
if player then
-- El jugador tocó una moneda
coin.Transparency = 1
coin:SetAttribute("Enabled", false)
print("El jugador recogió la moneda")
task.wait(COOLDOWN)
coin.Transparency = 0
coin:SetAttribute("Enabled", true)
end
end
end
-- Configurando los oyentes de eventos
for _, coin in coins do
coin:SetAttribute("Enabled", true)
coin.Touched:Connect(function(otherPart)
onCoinTouched(otherPart, coin)
end)
end
```Ahora, cada vez que un jugador toque una moneda, la moneda desaparecerá durante 10 segundos y el registro de salida imprimirá El jugador recogió la moneda.
Las 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 has escrito en otros lenguajes, defines variables que necesitas más adelante en la parte superior del script. Nuestro código hace lo siguiente:
- Obtener instancias de servicios - Los servicios de Roblox proporcionan funcionalidad incorporada para características comunes. El script primero obtiene instancias del servicio Workspace, que contiene cada objeto en el mundo 3D, y del servicio Player, que gestiona y contiene a todos los jugadores conectados a tu juego.
- 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 array que contiene todo lo que está parentado al objeto con el que está asociado, que en este caso es la carpeta Workspace.World.Coins que creaste anteriormente.
- Define una variable global - La variable COOLDOWN se utiliza más adelante para definir cuánto tiempo desactivar una moneda después de que ha sido recogida.
local Workspace = game:GetService("Workspace")
local Players = game:GetService("Players")
local coinsFolder = Workspace.World.Coins
local coins = coinsFolder:GetChildren()
local COOLDOWN = 10
...Definir el manejador de eventos
El motor de Roblox simula físicamente el mundo 3D y maneja gran parte 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 manejarlos, mientras dejas que el motor haga el resto. En este caso, escuchas y manejas eventos relacionados con las monedas siendo tocadas. El script define la lógica para manejar este evento en el método onCoinTouched(), que hace lo siguiente:
- Detecta si la moneda está habilitada - Cada Instance tiene un atributo booleano Enabled 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 una moneda está habilitada, el método utiliza el servicio de jugadores para verificar si el objeto que tocó la moneda era efectivamente un jugador. Cuando ocurre un evento de toque, el motor de Roblox pasa el objeto que tocó la moneda como un parámetro otherPart. El script verifica si el padre de otherPart pertenece a un jugador.
- Desactiva la moneda si un jugador la tocó y la vuelve a habilitar después de 10 segundos - Finalmente, si un jugador tocó la moneda, el método desactiva la moneda, espera 10 segundos y luego vuelve a habilitar la moneda para su recolección. Se utiliza task.wait() en lugar de wait() porque proporciona un mejor rendimiento al no pausar completamente la ejecución del código, permitiendo que las tareas en otros hilos se ejecuten simultáneamente.
local function onCoinTouched(otherPart, coin)
if coin:GetAttribute("Enabled") then
local character = otherPart.Parent
local player = Players:GetPlayerFromCharacter(character)
if player then
-- El jugador tocó una moneda
coin.Transparency = 1
coin:SetAttribute("Enabled", false)
print("El jugador recogió la moneda")
task.wait(COOLDOWN)
coin.Transparency = 0
coin:SetAttribute("Enabled", true)
end
end
endConectar el manejador de eventos
Todos los objetos 3D simulados heredan 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 siguiente:
- Recorrer todas las monedas - Recorre cada una de las monedas utilizando iteración general.
- Conectar 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 del juego. El método del manejador onCoinTouched() también se conecta 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 el objeto que tocó el objeto, otherPart.
for _, coin in coins do
coin:SetAttribute("Enabled", true)
coin.Touched:Connect(function(otherPart)
onCoinTouched(otherPart, coin)
end)
endPrueba la mecánica
Selecciona Test del menú desplegable y haz clic en Play. Mueve tu personaje para tocar una moneda. Si todo está funcionando, la moneda desaparece, la ventana de Salida imprime El jugador recogió la moneda, y la moneda reaparece 10 segundos después.
