Blaster-Verhalten implementieren

*Dieser Inhalt wurde mit KI (Beta) übersetzt und kann Fehler enthalten. Um diese Seite auf Englisch zu sehen, klicke hier.

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.LaserBlastedBindableEvent
local laserBlastedEvent = ReplicatedStorage.Instances.LaserBlastedEvent
laserBlastedBindableEvent: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:

  1. Ist BlastData eine Tabelle? Enthält sie einen Class.CFrame und eine andere Tabelle mit dem Namen rayResults?
  2. Hat der Spieler einen Blaster ausgerüstet?
  3. Hat der Spieler einen Charakter und einen Standort innerhalb der Welt?
  4. 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.Position
print(distanceFromCharacterToOrigin.Magnitude) -- aktualisierte zeile, stellen sie sicher, dass sie entfernen
if distanceFromCharacterToOrigin.Magnitude > ToleranceValues.DISTANCE_SANITY_CHECK_TOLERANCE_STUDS then
warn(`Player {player.Name} failed an origin sanity check while blasting`)
return
end

Wenn Sie sich bewegen und herumstochern, beachten Sie die Ausgabe. Es könnte so aussehen:


1.9019629955291748
3.1549558639526367
2.5742883682250977
4.8044586181640625
2.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.