implementando Blaster Behavior

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

Implantar el comportamiento del láser es el proceso de programación de un comportamiento de láser en las experiencias de shooter en primera persona. Mientras los jugadores pueden爆ear con un solo clic o presionar un botón, la creación de un comportamiento de láser satisfactorio y preciso es importante porque mejora la experiencia de los juego.

Usando la experiencia de etiqueta láser como referencia, esta sección del tutorial te enseña sobre los scripts detrás de implementar el comportamiento del láser para dos tipos diferentes de armas, incluyendo la guía sobre:

  • Detectando cuando los jugadores presionan el botón de explosión.
  • Verificar si el jugador puede usar su bláster si recientemente presionó el botón de explosión.
  • Generar datos de explosión que le dicen al servidor quién inició la explosión, de dónde vino y qué fue la destrucción final de cada láser.
  • Notificar al servidor los datos de la explosión para que pueda realizar las acciones apropiadas si la explosión se produjo con otro jugador.
  • Reiniciando el blaster entre cada explosión para darle al blaster suficiente tiempo para enfriarse antes de que pueda volver a explotar.

Después de completar esta sección, aprenderá sobre los scripts que permiten que el blaster detecte cuando sus explosiones se chocan con otros jugadores, luego deduzca la cantidad correspondiente de salud según cada introducirde blaster.

Detectar entrada del jugador

El primer paso para implementar el comportamiento del bláster es escuchar cuando un jugador presiona el botón de explosión. El tipo de entrada que los jugadores usan para presionar el botón de explosión depende del dispositivo que estén usando para acceder a la experiencia. Por ejemplo, la experiencia de etiqueta láser soporta mouse y teclado, gamepads y controles táctiles. Puedes ver cada uno de estos tipos de entrada en Almacenamiento Replicado >

Este script del cliente usa ContextActionService para vincular MouseButton1 y ButtonR2 a la acción de explosión. Esto significa que cada vez que un jugador presiona un botón izquierdo del ratón o un botón de acción en el dispositivo móvil, se activa un rayo láser

Cargador de Usuario

ContextActionService:BindAction("_", onBlasterActivated, false,
Enum.UserInputType.MouseButton1,
Enum.KeyCode.ButtonR2
)

Otra nota importante es el uso de Enum.UserInputState.Begin en la definición de onBlasterActivated(). Muchas interacciones de la interfaz de usuario, como elegir un blaster en este ejemplo, no ocurren hasta que el botón aparece ( Enum.UserInputState.End ) que le da a los usuarios una oportunidad de <

Para demostrar, puede cambiar Enum.UserInputState.Begin a Enum.UserInputState.End , luego probar para ver cómo la respuesta del impacto de bomba afecta el juego en vivo. Por ejemplo, si los jugadores pueden mantener presionado el botón sin activar el impacto de bomba, ¿cómo podría eso cambiar la experiencia de los jugadores mientras etiquetan a otros jugadores?

Cargador de Usuario

local function onBlasterActivated(_actionName: string,
inputState: Enum.UserInputState, _inputObject: InputObject)
if inputState == Enum.UserInputState.End then -- línea actualizada, asegúrese de cambiar de volver
attemptBlastClient()
end
end

Chequea si el jugador puede hacer explosiones

Después de que UserInputHandler detecta un botón presionado o tocarde pantalla, llama a ReplicatedStorage > Blaster

puedeLocalPlayerBlast

local function canLocalPlayerBlast(): boolean
return localPlayer:GetAttribute(PlayerAttribute.blasterStateClient) == BlasterState.Ready
end

Si examinas

Esta ligera pausa te impide poder rebotar tan rápido como puedas hacer hcer clic. Por ejemplo, si cambias la función para siempre devolver veraz, puedes rebotar rápidamente tu blaster sin ningún retraso, lo cual es irrealista para el juego de etiqueta láser.

puedeLocalPlayerBlast

local function canLocalPlayerBlast(): boolean
return true -- línea actualizada, asegúrese de cambiar de volver
end

Generar datos de explosión

Después de verificar que el bláster del jugador está en el estado Ready , attemptBlastClient llama a ReplicatedStorage > 2> intentBlastClient2> > 5> blastClient5> . El primer paso que

El siguiente paso es generar los datos de explosión. Si revisa Almacenamiento Replicado > Blaster > BlastData , puede ver que cada explosión consiste en tres piezas de información:

  • El jugador que inicia la explosión.
  • Un DataType.CFrame que representa el punto de origen del explosivo.
  • Una tabla de RayResult que contiene la ubicación final de cada rayo láser y el jugador al que golpea, si golpea a otro jugador.

Para generar estos datos, blastClient llama a almacenamientoReplicado > intentoBlastClient > 2> blastClient2> > 5> generateBlastData 5>, que puedes revisar a continuación.

generar datos de explosión

local function generateBlastData(): BlastData.Type
local blasterConfig = getBlasterConfig()
local rayDirections = getDirectionsForBlast(
currentCamera.CFrame, blasterConfig)
local rayResults = castLaserRay(
localPlayer, currentCamera.CFrame.Position, rayDirections)
local blastData: BlastData.Type = {
player = localPlayer,
originCFrame = currentCamera.CFrame,
rayResults = rayResults,
}
return blastData
end

Esta función comienza por usar getBlasterConfig para recuperar el introducirde láser del jugador. El ejemplo proporciona dos tipos de láser: uno que produce varios rayos con un ancho, horizontal, desplazamiento y otro que produce un solo rayo. Puede encontrar sus configuraciones en Almacenamiento Replicado > Instancias > 1>LaserBlastersFolder1> .

La función entonces usa currentCamera.CFrame como el punto de origen para el explosivo, pasándolo a getDirectionsForBlast . En este punto, el código ya no es sobre el blaster, sino que es sobre el

Notificar al servidor

Una vez que blastClient tiene datos completos para el bombardeo, disparará dos eventos:

Cliente de explosión

local laserBlastedBindableEvent = ReplicatedStorage.Instances.LaserBlastedBindableEvent
local laserBlastedEvent = ReplicatedStorage.Instances.LaserBlastedEvent
laserBlastedBindableEvent:Fire(blastData)
laserBlastedEvent:FireServer(blastData)

El BindableEvent notifica a otros scripts del cliente de la explosión. Por ejemplo, ReplicatedStorage > FirstPersonBlasterVisuals usa este evento para saber cuándo mostrar efectos visuales, como la animación de explosión y la barra de tiempo de reutilización. Del mismo modo, el <

Cañón láser

local function onLaserBlastedEvent(playerBlasted: Player, blastData: BlastData.Type)
local validatedBlastData = getValidatedBlastData(playerBlasted, blastData)
if not validatedBlastData then
return
end
if not canPlayerBlast(playerBlasted) then
return
end
blastServer(playerBlasted)
processTaggedPlayers(playerBlasted, blastData)
for _, replicateToPlayer in Players:GetPlayers() do
if playerBlasted == replicateToPlayer then
continue
end
replicateBlastEvent:FireClient(replicateToPlayer, playerBlasted, blastData)
end
end

Para ayudar a prevenir el fraude, el servidor debe verificar todos los datos que envía cada cliente. Estas verificaciones incluyen:

  1. ¿Es BlastData una tabla? ¿Contiene una Class.CFrame y otra tabla llamada rayResults?
  2. ¿Tiene el jugador un blaster equipado?
  3. ¿El jugador tiene un personaje y una ubicación dentro del mundo?
  4. ¿Después de enviar los datos de explosión, ha el jugador se movió una distancia excesiva de donde dispararon el rayo láser?

Esta última prueba implica una llamada de juicio, y según la latencia del servidor y la velocidad de movimiento del jugador, puede decidir que diferentes valores son excesivos para su propia experiencia. Para demostrar cómo hacer esta llamada de juicio, puede obtener una sensación de la magnitud típica del cambio de posición al agregar una declaración de impresión en getValidatedBlastData y jugar la experiencia.

obtener ValidatedBlastData

local distanceFromCharacterToOrigin = blastData.originCFrame.Position - rootPartCFrame.Position
print(distanceFromCharacterToOrigin.Magnitude) -- línea actualizada, asegúrese de eliminar
if distanceFromCharacterToOrigin.Magnitude > ToleranceValues.DISTANCE_SANITY_CHECK_TOLERANCE_STUDS then
warn(`Player {player.Name} failed an origin sanity check while blasting`)
return
end

A medida que te mueves y explotes, toma nota de la Salida. Puede parecer algo así:


1.9019629955291748
3.1549558639526367
2.5742883682250977
4.8044586181640625
2.6434271335601807

Si aumenta la velocidad de movimiento para los jugadores en ReplicatedStorage > PlayerStateHandler > togglePlayerMovement , entonces pruebe de nuevo, probablemente encontrará muchos fallos debido a un movimiento excesivo entre las explosiones.

Alternar movimiento de jugador

local ENABLED_WALK_SPEED = 60 -- updated line, be sure to change back

El servidor luego hace lo siguiendo:

  • Valida rayResults .
  • Revisa si el jugador puede hacer explosiones.
  • Restablece el estado del láser.
  • Reduce la salud de cualquier jugador etiquetado.
  • Repite la explosión a todos los demás jugadores para que puedan ver visuales de terceros.

Para obtener más información sobre estas operaciones del servidor, consulte la sección Detectando golpes del tutorial.

Restablecer el Blaster

En la experiencia de etiqueta láser, los láseres usan un mecánico de calor. En lugar de recargar después de un número establecido de explosiones, necesitan tiempo para "enfriarse" entre cada explosión. Este mismo retraso de tiempo ocurre tanto en el cliente ( blastClient ) como en el servidor ( blastServer ) con el servidor actuando como la fuente de la verdad.

servidor de explosión

local blasterConfig = getBlasterConfig(player)
local secondsBetweenBlasts = blasterConfig:GetAttribute("secondsBetweenBlasts")
task.delay(secondsBetweenBlasts, function()
local currentState = player:GetAttribute(PlayerAttribute.blasterStateServer)
if currentState == BlasterState.Blasting then
player:SetAttribute(PlayerAttribute.blasterStateServer, BlasterState.Ready)
end
end)

El atributo secondsBetweenBlasts es parte de la configuración del bláster en Almacenamiento Replicado > Instancias > 1> LaserBlastersFolder1> . Después de que el tiempo de reutilización del atributo 4>secondsBetweenBlasts4> pase, el jugador puede volver a lanzar y todo el

En este punto, los jugadores pueden generar y reaparecer, apuntar y disparar, pero la experiencia todavía debe determinar los resultados de cada explosión. En la siguiente sección del tutorial, aprenderás a programar la habilidad para que el blaster detecte cuando la explosión golpea a otro jugador, luego reduce la cantidad adecuada de salud del jugador según la configuración del blaster.