implémenter le comportement du blaster est le processus de programmation d'un comportement de tireur d'élite dans les expériences de tir en première personne. Bien que les joueurs puissent exploser avec un seul clic ou appuyer sur un bouton, la création d'un comportement de tir satisfaisant et précis est importante car elle améliore l'expérience de partieglobale des joueurs.
En utilisant l'expérience de balise laser expérience comme référence, cette section du tutoriel vous apprend sur les scripts derrière l'implémentation du comportement du blaster pour deux types différents de blasters, y compris les instructions sur :
- Détection de quand les joueurs appuient sur le bouton Explosion.
- Vérification si le joueur peut utiliser son blaster s'il a récemment appuyé sur le bouton d'explosion.
- Génération de données d'explosion qui indiquent au serveur qui a initialisé l'explosion, d'où elle vient et quelle était la destination finale de chaque faisceau laser.
- Avertir le serveur des données d'explosion afin qu'il puisse effectuer les actions appropriées si l'explosion se heurte à un autre joueur.
- Réinitialisation du blaster entre chaque explosion pour donner au blaster le temps de se refroidir avant qu'il puisse exploser à nouveau.
Après avoir terminé cette section, vous en apprendrez sur les scripts qui permettent au blaster de détecter quand ses explosions se heurtent à d'autres joueurs, puis déduisez la quantité correspondante de santé en fonction de chaque taperde blaster.
Détecter l'entrée du joueur
La première étape pour implémenter le comportement du blaster est d'écouter quand un joueur appuie sur le bouton d'explosion. Le type d'entrée que les joueurs utilisent pour appuyer sur le bouton d'explosion dépend du dispositif qu'ils utilisent pour accéder à l'expérience. Par exemple, l'expérience de laser de pointeur prend en charge les contrôles de la souris et du clavier, les gamepads et les commandes de touche. Vous pouvez voir ch
Ce script client utilise ContextActionService pour lier MouseButton1 et ButtonR2 à l'action de blasting. Cela signifie que chaque fois qu'un joueur appuie sur un bouton de gauche de la souris ou sur le bouton R2 du gamepad, il déclenche un laser pour exploser du blaster. Note
Gestionnaire d'entrée de l'utilisateur
ContextActionService:BindAction("_", onBlasterActivated, false,Enum.UserInputType.MouseButton1,Enum.KeyCode.ButtonR2)
Une autre note importante est l'utilisation de Enum.UserInputState.Begin dans la définition onBlasterActivated(). Beaucoup d'interactions d'interface utilisateur, telles que le choix d'un blaster dans cet exemple, ne se produisent pas jusqu'à ce que le bouton vienne ( Enum.UserInputState.End, ce qui donne aux utilisateurs une dernière chance
Pour démontrer, vous pouvez modifier Enum.UserInputState.Begin pour Enum.UserInputState.End, puis tester le jeu pour voir comment la réponse de l'explosion affecte le jeu en direct. Par exemple, si les joueurs peuvent maintenir le bouton sans déclencher l'explosion, comment cela pourrait-il changer l'expérience de la balise d'autres joueurs?
Gestionnaire d'entrée de l'utilisateur
local function onBlasterActivated(_actionName: string,
inputState: Enum.UserInputState, _inputObject: InputObject)
if inputState == Enum.UserInputState.End then -- ligne mise à jour, assurez-vous de retour
attemptBlastClient()
end
end
Vérifier si le joueur peut exploser
Après que UserInputHandler a détecté un pression de bouton ou un serveur, il appelle ReplicatedStorage > Bl
peut localiser le joueur
local function canLocalPlayerBlast(): boolean
return localPlayer:GetAttribute(PlayerAttribute.blasterStateClient) == BlasterState.Ready
end
Si vous examine
Cette légère pause vous empêche de pouvoir exploser aussi rapidement que vous pouvez cliquer. Par exemple, si vous changez la fonction pour toujours retourner vrai, vous pouvez rapidement exploser votre blaster sans aucun délai, ce qui est irréaliste pour le partiede laser tag.
peut localiser le joueur
local function canLocalPlayerBlast(): boolean
return true -- ligne mise à jour, assurez-vous de retour
end
Générer des données d'explosion
Après avoir vérifié que le blaster du joueur est dans l'état Ready , attemptBlastClient appelle ReplicatedStorage > 1> attemptBlastClient1> > 4> blastClient4>. La première ét
La prochaine étape est de générer les données d'explosion. Si vous réexaminez ReplicatedStorage > Blaster > BlastData , vous pouvez voir que chaque blast consiste en trois morceaux d'informations :
- Le joueur qui aInitié la explosion.
- Un DataType.CFrame qui représente le point d'origine de l'explosion.
- Une table RayResult qui contient la destination finale de chaque faisceau laser et le joueur touché, s'il touche un autre joueur.
Pour générer ces données, blastClient appelle ReplicatedStorage > attemptBlastClient > 2> blastClient2> > 5> generateBlastData5>, que vous pouvez examiner ci-dessous.
générer des données d'explosion
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
Cette fonction commence par l'utilisation de getBlasterConfig pour récupérer le taperde blaster du joueur. L'échantillon fournit deux types de blasters : un qui produit plusieurs rayons avec une large portée horizontale et un autre qui produit un seul rayon. Vous pouvez trouver leurs paramètres dans ReplicatedStorage > Instances > 1> LaserBlastersFolder1> .
La fonction utilise ensuite currentCamera.CFrame comme point d'origine pour l'explosion, le lui passant à getDirectionsForBlast. À ce moment, le code n'est plus sur le blaster, il est sur le laser, que
Avertir le serveur
Une fois que blastClient a des données complètes pour l'explosion, il déclenche deux événements :
blastClient
local laserBlastedBindableEvent = ReplicatedStorage.Instances.LaserBlastedBindableEventlocal laserBlastedEvent = ReplicatedStorage.Instances.LaserBlastedEventlaserBlastedBindableEvent:Fire(blastData)laserBlastedEvent:FireServer(blastData)
L'événement BindableEvent informe les autres scripts clients de l'explosion. Par exemple, ReplicatedStorage > FirstPersonBlasterVisuals utilise cet événement pour savoir quand afficher les effets visuels, tels que l'animation d'explosion et le bar de recharg
LaserBlastHandler
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
Pour aider à prévenir la triche, le serveur doit vérifier toutes les données que chaque client envoie. Ces vérifications incluent :
- Est-ce qu' BlastData est une table? Contient-elle un Class.CFrame et une autre table nommée rayResults?
- Le joueur a-t-il un blaster équipé ?
- Le joueur a-t-il un personnage et un lieu dans le monde ?
- Après l'envoi des données de blast, le joueur a-t-il dépassé une distance excessive de l'endroit où ils ont fait exploser le laser ?
Cette dernière vérification implique un appel de jugement, et en fonction de la latence du serveur et de la vitesse de déplacement du joueur, vous pourriez décider que différents valeurs sont excessives pour votre propre expérience. Pour démontrer comment faire cet appel de jugement, vous pouvez obtenir un aperçu de la taille typique de la position de changement en ajoutant une déclaration d'impression dans getValidatedBlastData et en testant l'expérience.
obtenir des données explosées valides
local distanceFromCharacterToOrigin = blastData.originCFrame.Position - rootPartCFrame.Positionprint(distanceFromCharacterToOrigin.Magnitude) -- ligne mise à jour, assurez-vous de retirerif distanceFromCharacterToOrigin.Magnitude > ToleranceValues.DISTANCE_SANITY_CHECK_TOLERANCE_STUDS thenwarn(`Player {player.Name} failed an origin sanity check while blasting`)returnend
Au fur et à mesure que vous vous déplacez et que vous faites exploser, notez la sortie. Ça pourrait ressembler à ça :
1.90196299552917483.15495586395263672.57428836822509774.80445861816406252.6434271335601807
Si vous augmentez la vitesse de déplacement des joueurs dans ReplicatedStorage > PlayerStateHandler > togglePlayerMovement , alors testez de nouveau, vous rencontrerez probablement de nombreux échecs dûs à un déplacement excessif entre les blasts.
TogglePlayerMovement
local ENABLED_WALK_SPEED = 60 -- updated line, be sure to change back
Le serveur effectue ensuite les actions suivre:
- Valide rayResults .
- Vérifie si le joueur peut exploser.
- Réinitialise l'état du blaster.
- Réduit la santé pour tous les joueurs marqués.
- Reproduit l'explosion à tous les autres joueurs afin qu'ils puissent voir les visuels de troisième personne.
Pour plus d'informations sur ces opérations de serveur, voir la section Détection des coups du tutoriel.
Réinitialiser le Blaster
Dans l'expérience de laser tag, les blasters utilisent une mécanique de chaleur. Au lieu de recharger après un certain nombre de blasts, ils ont besoin de temps pour " refroidir " entre chaque blast. Ce même délai de refroidissement se produit sur le client ( blastClient ) et le serveur ( blastServer ) , le serveur agissant comme la source de la vérité.
blastServer
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)
L'attribut secondsBetweenBlasts fait partie de la configuration du blaster dans ReplicatedStorage > Instances > 1> LaserBlastersFolder1>. Après la pause de retardement de 4>secondsBetweenBlasts4>, le joueur peut encore exploser, et le processus s'peat de nouveau. Pour aider le joueur à comprendre quand il peut
À ce stade, les joueurs peuvent générer et réapparaître, viser et exploser, mais l'expérience doit toujours déterminer les résultats de chaque explosion. Dans la section suivante du tutoriel, vous apprendrez à programmer la capacité pour que le blaster détecte quand la bombe frappe un autre joueur, puis réduisez la quantité appropriée de santé du joueur en fonction des paramètres du blaster.