Die Umsetzung eines Blaster-Verhaltens ist der Prozess der Programmierung eines Blast-Mechaniks in erster-Person-Shooter-Erlebnissen. Während Spieler mit einem einzigen Klick oder einer Taste eines Buttons blasen können, ist die Erstellung eines zufriedenstellenden und genauen Blast-Verhaltens wichtig, da dies die Spieler's Genuss des gesamten Gameplayverbessert.
Dieser Abschnitt des Tutorials verwendet die Blaster-Laser-Tag-Erfahrung als Referenz, um dir die Skripte zu erklären, die hinter der Umsetzung von Blaster-Verhalten für zwei verschiedene Arten von Blastern stehen, einschließlich Anleitung:
- Erkennen, wenn Spieler die Explosion-Schaltfläche drücken.
- Überprüfen, ob der Spieler seinen Blaster verwenden kann, wenn er vor kurzem auf die Explosion-Schaltfläche gedrückt hat.
- Erzeugung von Explosionsdaten, die dem Server sagen, wer die Explosion initiiert hat, woher sie kommt und zu welchem Ziel jeder Laserstrahl endet.
- Benachrichtigung des Servers der Explosion, damit er die entsprechenden Aktionen ausführen kann, wenn die Explosion mit einem anderen Spieler:inkollidiert.
- Zurücksetzen des Blasters zwischen jedem Bomben, um dem Blaster genug Zeit zu geben, um sich abzukühlen, bevor es wieder Explodieren kann.
Nachdem du diesen Abschnitt abgeschlossen hast, wirst du darüber erfahren, wie die Skripte, die erlauben, dass der Blaster erkennt, wenn seine Explosionen mit anderen Spielern kollidieren, dann den entsprechenden Betrag an Gesundheit deduziert, basierend auf jedem eingeben.
Spieler-Eingaben erkennen
Der erste Schritt zur Umsetzung des Blaster-Verhaltens ist es, aufzuhören, wenn ein Spieler die Explosion-Schaltfläche drückt. Die Eingabetafel, die von Spielern verwendet wird, um die Explosionsschaltfläche zu drücken, hängt von dem Gerät ab, mit dem sie auf die Erlebniszugreifen. Zum Beispiel unterstützt die Blaster-Laser-Tag-Erfahrung die Maus- und Steuerung, Gamep
Dieser Client-Skript verwendet ContextActionService, um Class.MouseButton1 und Class.ButtonR2 an die Blast-Aktion zu binden. Dies bedeutet, dass jedes Mal, wenn ein Spieler entweder eine linke Maustaste oder eine Gamepaddrückt, ein Laserstrahl aus dem Blaster ausgelöst wird. Beachten Sie,
Benutzer-Eingabeeinheit
ContextActionService:BindAction("_", onBlasterActivated, false,Enum.UserInputType.MouseButton1,Enum.KeyCode.ButtonR2)
Ein weiterer wichtiger Hinweis ist die Verwendung von Enum.UserInputState.Begin in der onBlasterActivated() -Definierung. Viele BenutzeroberflächeneInteraktionen, z. B. die Auswahl eines Blasters in diesem Beispiel, geschehen nicht, bis nach dem Maus-Button-Klick ( Enum.UserInputState.End</
Um zu zeigen, können Sie Enum.UserInputState.Begin zu Enum.UserInputState.End ändern, dann testen Sie, wie sich die Reaktion des Blastes auf das Spielen des Erlebnisses auswirkt. Zum Beispiel, wenn Spieler den Button halten können, ohne den Blast auszulösen, wie könnte das ihre Erfahrung ändern, während sie andere Spieler markieren?
Benutzer-Eingabeeinheit
local function onBlasterActivated(_actionName: string,
inputState: Enum.UserInputState, _inputObject: InputObject)
if inputState == Enum.UserInputState.End then -- aktualisierte zeile, stellen sie sicher, dass sie zurückändern
attemptBlastClient()
end
end
Überprüfen, ob der Spieler sprengen kann
Nachdem UserInputHandler einen Button-Drücken oder tippenerkennt, ruft es ReplicatedStorage > Blaster
kannLocalPlayerBlast
local function canLocalPlayerBlast(): boolean
return localPlayer:GetAttribute(PlayerAttribute.blasterStateClient) == BlasterState.Ready
end
Wenn Sie
Diese leichte Pause verhindert, dass du so schnell wie möglich explodieren kannst, wenn du die Funktion änderst, um immer wahr zu sein. Zum Beispiel, wenn du die Funktion änderst, um immer wahr zu sein, kannst du deinen Blaster schnell ohne Verzögerung explodieren, was für das Gameplayunrealistisch ist.
kannLocalPlayerBlast
local function canLocalPlayerBlast(): boolean
return true -- aktualisierte zeile, stellen sie sicher, dass sie zurückändern
end
Erstellen Sie Explosionsdaten
Nach der Überprüfung, dass der Spieler:inim Zustand Ready ist, ruft attemptBlastClientReplicatedStorage > 2> attemptBlastClient2> > 5> blastClient5> . Der erste Schritt,
Der nächste Schritt ist die Generierung der Explosionsdaten. Wenn Sie ReplicatedStorage > Blaster > BlastData überprüfen, können Sie sehen, dass jede Explosion aus drei Informationen besteht:
- Der Spieler, der die Explosion startet.
- Ein DataType.CFrame, das die Quelle des Explosionspunkts darstellt.
- Eine RayResult Tabelle, die die endgültige ZielDestination jedes Laserstrahls und den Spieler:inenthält, wenn ein anderer Spieler:ingetroffen wird.
Um diese Daten zu generieren, ruft blastClientReplicatedStorage > attackBlastClient > 2> blastClient2> > 5> blastDataGenerieren 5>, was Sie unten überprüfen können.
erzeugenBlastData
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
Diese Funktion beginnt, indem sie getBlasterConfig verwendet, um den eingebendes Spieler:inzu erhalten. Der Beispiel liefert zwei Arten von Blaster: einen, der mehrere Strahlen mit einer breiten, horizontalen Streuung erzeugt, und einen, der einen einzigen Strahl erzeugt. Sie finden ihre Konfigurationen in ReplicatedStorage > Instanzen > 1> LaserBlaster
Die Funktion verwendet dann currentCamera.CFrame als Ausgangspunkt für die Explosion, die sie an getDirectionsForBlast weitergibt. In diesem Punkt ist der Code nicht mehr über den Blaster, sondern über
Benachrichtige den Server
Sobald blastClient vollständige Daten für die Explosion hat, sendet er zwei Ereignisse aus:
Client爆
local laserBlastedBindableEvent = ReplicatedStorage.Instances.LaserBlastedBindableEventlocal laserBlastedEvent = ReplicatedStorage.Instances.LaserBlastedEventlaserBlastedBindableEvent:Fire(blastData)laserBlastedEvent:FireServer(blastData)
Das BindableEvent informiert andere Client-Skripte über die Explosion. Zum Beispiel verwendet ReplicatedStorage > FirstPersonBlasterVisuals dieses Ereignis, um visuelle Effekte anzuzeigen, z. B. die Blast-Animation und die Abklingzeit
Laserstrahl-Handler
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
Um Betrug zu verhindern, muss der Server alle Daten überprüfen, die jedes Client sendet. Diese Prüfungen umfassen:
- Ist BlastData eine Tabelle? Enthält sie einen Class.CFrame und eine andere Tabelle mit dem Namen rayResults?
- Hat der Spieler einen Blaster ausgerüstet?
- Hat der Spieler einen Charakter und einen Standort innerhalb der Welt?
- Nach dem Senden der Explosionsdaten hat der Spieler einen übermäßigen Abstand von dem Ort gewählt, an dem sie den Laserstrahl gesprengt haben?
Dieser letzte Check beinhaltet einen Urteilsauberruf, und nach Server-Latenz und Spieler-Bewegungsgeschwindigkeit, können Sie entscheiden, dass verschiedene Werte für Ihr eignes Erlebnis übertrieben sind. Um diesen Urteilsauberruf zu demonstrieren, können Sie ein Gefühl für die typische Größe des Positionswechsels erhalten, indem Sie ein Print-Statements in getValidatedBlastData hinzufügen und die Erfahrung testen.
erhaltenValidatedBlastData
local distanceFromCharacterToOrigin = blastData.originCFrame.Position - rootPartCFrame.Positionprint(distanceFromCharacterToOrigin.Magnitude) -- aktualisierte zeile, stellen sie sicher, dass sie entfernenif distanceFromCharacterToOrigin.Magnitude > ToleranceValues.DISTANCE_SANITY_CHECK_TOLERANCE_STUDS thenwarn(`Player {player.Name} failed an origin sanity check while blasting`)returnend
Wenn Sie sich bewegen und herumstochern, beachten Sie die Ausgabe. Es könnte so aussehen:
1.90196299552917483.15495586395263672.57428836822509774.80445861816406252.6434271335601807
Wenn Sie die Bewegungsgeschwindigkeit für Spieler in ReplicatedStorage > PlayerStateHandler > togglePlayerMovement erhöhen, spielen Sie erneut, Sie werden wahrscheinlich viele fehlende Checks aufgrund von übermäßigem Bewegung zwischen Blasten finden.
Spieler-Bewegung einschalten
local ENABLED_WALK_SPEED = 60 -- updated line, be sure to change back
Der Server führt dann die gefolgte ProfileAktionen aus:
- Validiert rayResults .
- Überprüft, ob der Spieler Explosionen abfeuern kann.
- Setzt den Blaster-Status zurück.
- Reduziert die Gesundheit für alle markierten Spieler.
- Repliziert die Explosion für alle anderen Spieler, damit sie Third-Person-Visualisierungen sehen können.
For more information on these server operations, see the Hits entdecken section of the Tutorial.
Reset the Blaster
In der Erlebnisverwenden Blaster eine Wärmemaschine. Statt nach einer bestimmten Anzahl von Blasten nachzuladen, benötigen sie Zeit, um sich "Abkühlen" zwischen jedem Blast. Dieser gleiche Abkühldown-Verzögerung tritt sowohl auf dem Client ( blastClient ) als auch auf dem Server ( blastServer ) auf, wobei der Server als Quelle der Wahrheit agiert.
ExplosionServer
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)
Das Attribut secondsBetweenBlasts ist Teil der Blaster-Konfiguration in ReplicatedStorage > Instanzen > 2> LaserBlasterFolder2>. Nach dem 5> secondsBetweenBlasts5> -Verzögerung kann der Spieler wieder eingeblastet werden, und der gesamte Prozess wiederholt sich. Um dem
An diesem Punkt können Spieler spawnen und respawnen, zielen und Explosionen abfeuern, aber die Erfahrung muss immer noch die Ergebnisse jeder Explosion bestimmen. Im nächsten Abschnitt des Tutorials wirst du lernen, wie du die Fähigkeit programmierst, dass der Blaster die Explosion eines anderen Spieler:inerkennt und dann die richtige Menge an Spielergesundheit entsprechend den Blaster-Einstellungen reduziert.