A lo largo de los tutoriales de Scripting Básico, tuviste que escribir partes individuales para crear escenas de juego. Con el método anterior, si duplicabas las partes, también tendrías que duplicar scripts. Esto haría que actualizar los scripts sea tedioso a medida que cambiarían los cambios.
En este tutorial, se usará un patrón diferente para crear una serie de recogidas de salud, con solo una copia del script que determina el comportamiento de recogida de salud. Cuando se toca la recogida, se restaurará la salud del jugador, se desvanecerá ligeramente y se desactivará por un corto período de tiempo.
Configurando
Primero, necesitarás una parte o un modelo para usar como punto de recogida. El Muestra el ejemplo de ciudad de ejemplo mundo incluye muchos puntos de recogida de salud esparcidos por el mapa.
Cada recogida de salud es una unión de dos partes rectangulares con un punto de luz verde dentro. Todos se almacenan en un directorio en el espacio de trabajo llamado Recogidas de salud , donde el script buscará. Si agrega más al mapa, es esencial que lo asegure.
Restaurando salud
Para comenzar, el script necesita restaurar la salud de un jugador. Este patrón debería ser familiar para ti desde el tutorial Lava mortal.
En Servicio de Script del Servidor, agrega un script llamado PickupManager.
En este script, declare una constante llamada MAX_HEALTH con el valor 100 .
Crea una función llamada onTouchHealthPickup con parámetros para la otra parte que tocó el pickup y el propio pickup.
local MAX_HEALTH = 100local function onTouchHealthPickup(otherPart, healthPickup)endEn la función, obtenga el modelo de personaje del padre de otherPart . Luego, verifique si tiene un Humanoid usando FindFirstChildWhichIsA() .
Si tiene un humanoide, establece su propiedad de Salud a MAX_HEALTH .
local MAX_HEALTH = 100local function onTouchHealthPickup(otherPart, healthPickup)local character = otherPart.Parentlocal humanoid = character:FindFirstChildWhichIsA("Humanoid")if humanoid thenhumanoid.Health = MAX_HEALTHendend
Obtener la carpeta de recogida
La carpeta que contiene las recogidas de salud puede no haberse cargado en el juego por el tiempo que se ejecuta el script. WaitForChild se puede usar para pausar el script y obtener la carpeta HealthPickups cuando se carga.
Cuando se llama a una carpeta, la función GetChildren devolverá un arreglo de los contenidos de la carpeta.
Bajo MAX_HEALTH, declare una variable llamada healthPickupsFolder y use la función WaitForChild para obtener la carpeta SaludPickups del espacio de trabajo.
Cree una variable llamada healthPickups para almacenar el resultado de llamar la función GetChildren en healthPickupsFolder .
local MAX_HEALTH = 100local healthPickupsFolder = workspace:WaitForChild("HealthPickups")local healthPickups = healthPickupsFolder:GetChildren()local function onTouchHealthPickup(otherPart, healthPickup)local character = otherPart.Parentlocal humanoid = character:FindFirstChildWhichIsA("Humanoid")if humanoid thenhumanoid.Health = MAX_HEALTHendend
Looping con ipairs
onTouchHealthPickup necesita ser llamado para cada recolección de salud en el matriz/lista. Para hacer esto de manera eficiente, se usará una nueva síntesis de ciclo.
ipairs es una función que se puede usar con un for para pasar a través de cada elemento de un matriz/lista. No es necesario especificar dónde comienza y termina el for. Un for que usa ipairs está definido como sigue:
- Índice : esto es equivalente a la variable de control en un foro regular.
- Valor : esto se llenará con cada elemento en el array a medida que el bucle se repita. Es una buena idea nombrar la variable de valor después de lo que realmente contendrá.
- Matriz: : la matriz que desea repetir se pasa a la función de IP.
En el siguiente código, no necesitas el índice para nada, por lo que se puede dejar en blanco con _ . Crea un para ciclo usando la función ipairs, pasando 2> healthPickups2> .
local function onTouchHealthPickup(otherPart, healthPickup)
local character = otherPart.Parent
local humanoid = character:FindFirstChildWhichIsA("Humanoid")
if humanoid then
humanoid.Health = MAX_HEALTH
end
end
for _, healthPickup in ipairs(healthPickups) do
end
Se necesitará una función de subejecutable para pasar la recolección de salud a la función onTouchHealthPickup cuando se conecte al evento Touched .
En la for loop, conecta el evento Touched a una función anónima con un parámetro llamado otherPart .
Llamar la función onTouchHealthPickups, pasando tanto el parámetro otherPart como el healthPickup.
for _, healthPickup in ipairs(healthPickups) dohealthPickup.Touched:Connect(function(otherPart)onTouchHealthPickup(otherPart, healthPickup)end)end
Pruebe su código ahora y debería encontrar que la recogida de salud restaura su salud. Primero tendrá que dañar a su jugador - intente estar de pie en la ventilación junto al punto de inicio de la reutilización.
Una barra de salud debería aparecer en la parte superior derecha que desaparecerá cuando el jugador esté curado.
Tiempo de recarga
Actualmente, la recolección curará indefinidamente a cualquier jugador que la toque. Sería más efectiva en un juego si solo se pudiera recoger una vez, con un corto tiempo de reutilización antes de que se pueda usar de nuevo.
Primero, necesitas grabar si o no el recoger está en el período de tiempo de reutilización. El patrón a continuación debería ser familiar de Fading Trap - esta vez, el debounce se logrará configurando un atributo en el recoger de salud.
En la for loop, set a new attribute called "Enabled" to true .
Wrap the code inside onTouchHealthPickup in an if statement with the condition healthPickup:GetAttribute("Enabled") .
local function onTouchHealthPickup(otherPart, healthPickup)if healthPickup:GetAttribute("Enabled") thenlocal character = otherPart.Parentlocal humanoid = character:FindFirstChildWhichIsA("Humanoid")if humanoid thenhumanoid.Health = MAX_HEALTHendendendfor _, healthPickup in ipairs(healthPickups) dohealthPickup:SetAttribute("Enabled", true)healthPickup.Touched:Connect(function(otherPart)onTouchHealthPickup(otherPart, healthPickup)end)end
Desactivando la recolección
La recogida debería proporcionar un feedback visual que está deshabilitado - una manera común de indicar esto es haciéndolo un poco transparente.
Declara tres constantes en la parte superior del script (siéntete libre de ajustar cada valor a tu gusto):
- ENABLED_TRANSPARENCY = 0.4
- DISABLED_TRANSPARENCY = 0.9
- COOLDOWN = 10
local MAX_HEALTH = 100local ENABLED_TRANSPARENCY = 0.4local DISABLED_TRANSPARENCY = 0.9local COOLDOWN = 10local healthPickupsFolder = workspace:WaitForChild("HealthPickups")En la declaración if en onTouchHealthPickup, establece el Transparency del recaptador a DISABLED_TRANSPARENCY y el valor del atributo 1> Enabled1> a falso.
local function onTouchHealthPickup(otherPart, healthPickup)if healthPickup:GetAttribute("Enabled") thenlocal character = otherPart.Parentlocal humanoid = character:FindFirstChildWhichIsA("Humanoid")if humanoid thenhumanoid.Health = MAX_HEALTHhealthPickup.Transparency = DISABLED_TRANSPARENCYhealthPickup:SetAttribute("Enabled", false)endendendLlamar la función task.wait(), pasando COOLDOWN como la cantidad para esperar.
Establece Transparency de vuelta a ENABLED_TRANSPARENCY y Enabled de vuelta a 1> true1> .
local function onTouchHealthPickup(otherPart, healthPickup)if healthPickup:GetAttribute("Enabled") thenlocal character = otherPart.Parentlocal humanoid = character:FindFirstChildWhichIsA("Humanoid")if humanoid thenhumanoid.Health = MAX_HEALTHhealthPickup.Transparency = DISABLED_TRANSPARENCYhealthPickup:SetAttribute("Enabled", false)task.wait(COOLDOWN)healthPickup.Transparency = ENABLED_TRANSPARENCYhealthPickup:SetAttribute("Enabled", true)endendend
Prueba tu recogida de nuevo: deberías encontrar que cuando tocas la recogida se restaura tu salud, se hace transparente y luego vuelve a estar lista para ser usada de nuevo.
Si desea hacer que el feedback sea más impactante para el jugador cuando se recoge el pickup, intente cortar el brillo de la PointLight en el pickup cuando cambia la transparencia.
Intenta usar estos pickups de salud en tus propios proyectos, o cambia el aspecto y el efecto para dar un tipo diferente de power-up a tus jugadores.
Código Final
local MAX_HEALTH = 100
local ENABLED_TRANSPARENCY = 0.4
local DISABLED_TRANSPARENCY = 0.9
local COOLDOWN = 10
local healthPickupsFolder = workspace:WaitForChild("HealthPickups")
local healthPickups = healthPickupsFolder:GetChildren()
local function onTouchHealthPickup(otherPart, healthPickup)
if healthPickup:GetAttribute("Enabled") then
local character = otherPart.Parent
local humanoid = character:FindFirstChildWhichIsA("Humanoid")
if humanoid then
humanoid.Health = MAX_HEALTH
healthPickup.Transparency = DISABLED_TRANSPARENCY
healthPickup:SetAttribute("Enabled", false)
task.wait(COOLDOWN)
healthPickup.Transparency = ENABLED_TRANSPARENCY
healthPickup:SetAttribute("Enabled", true)
end
end
end
for _, healthPickup in ipairs(healthPickups) do
healthPickup:SetAttribute("Enabled", true)
healthPickup.Touched:Connect(function(otherPart)
onTouchHealthPickup(otherPart, healthPickup)
end)
end