La programmazione di comportamenti blaster è il processo di programmazione di un comportamento di spara-tutto in prima persona. Mentre i giocatori possono esplodere con un singolo clic o premuto di un pulsante, la creazione di un comportamento di spara blaster soddisfacente e preciso è importante poiché migliora l'esperienza di Partitadei giocatori.
Usando l'esperienza del laser tag di esempio come riferimento, questa sezione del tutorial ti insegna gli script dietro l'implementazione del comportamento del laser per due diversi tipi di laser, tra cui la guida su:
- Rilevare quando i giocatori premono il pulsante Esplosione.
- Controllo se il giocatore può usare il suo blaster se ha appena premuto il pulsante Esplodi .
- Generazione dei dati di esplosione che dicono al server chi ha iniziato l'esplosione, da dove viene e quale sia la destinazione finale di ogni raggio laser.
- Notificare al server i dati dell'esplosione in modo che possa eseguire le azioni appropriate se l'esplosione si è scontrata con un altro Giocatore.
- Ripristinare il blaster tra ogni esplosione per dare al blaster abbastanza tempo per raffreddarsi prima di poter esplodere di nuovo.
Dopo aver completato questa sezione, imparerai gli script che consentono al blaster di rilevare quando le sue esplosioni si scontrano con altri giocatori, quindi dedurre la quantità corrispondente di salute in base a ciascun inserisci / scrividi blaster.
Rileziona l'input del giocatore
Il primo passo per implementare il comportamento del blaster è ascoltare quando un giocatore premere il pulsante esplodi. Il tipo di input che i giocatori utilizzano per premere il pulsante esplodi dipende dal dispositivo che stanno utilizzando per accedere all'esperienza. Ad esempio, l'esperienza di tag laser replicata supporta i controlli del mouse e della tastiera, le gamepad e i Controllitouch. Puoi vedere ognuno di questi tipi di input in
Questo script client utilizza ContextActionService per associare MouseButton1 e ButtonR2 all'azione di espulsione. Ciò significa che ogni volta che un giocatore premere un pulsante sinistro del mouse o un pulsante R2 del gamepad, verrà attivato un raggio laser per espellere dal blaster. Not
Handler utente
ContextActionService:BindAction("_", onBlasterActivated, false,Enum.UserInputType.MouseButton1,Enum.KeyCode.ButtonR2)
Un'altra nota importante è l'uso di Enum.UserInputState.Begin nella definizione di onBlasterActivated() . Molte interazioni dell'interfaccia utente, come la scelta di un blaster in questo esempio, non avvengono fino a quando il pulsante viene attivato ( Enum.UserInputState.End ) che dà agli
Per dimostrare, puoi cambiare Enum.UserInputState.Begin in Enum.UserInputState.End , quindi testare per vedere come la risposta dell'esplosione influenza il gameplay dell'esperienza. Ad esempio, se i giocatori possono tenere premuto il pulsante senza attivare l'esplosione, come potrebbe questo cambiare l'esperienza mentre etichettando altri giocatori?
Handler utente
local function onBlasterActivated(_actionName: string,
inputState: Enum.UserInputState, _inputObject: InputObject)
if inputState == Enum.UserInputState.End then -- nuova linea, assicurati di cambiare indietro
attemptBlastClient()
end
end
Controlla se il giocatore può esplodere
Dopo UserInputHandler rileva un pulsante Toccareo tocco sullo Server, chiama ReplicatedStorage >
puòLocalPlayerBlast
local function canLocalPlayerBlast(): boolean
return localPlayer:GetAttribute(PlayerAttribute.blasterStateClient) == BlasterState.Ready
end
Se es
Questa breve pausa ti impedisce di essere in grado di esplodere così velocemente come puoi fare clic. Ad esempio, se cambi la funzione per restituire sempre vero, puoi esplodere rapidamente il tuo blaster senza alcun ritardo, che è irrealistico per il Partitalaser tag.
puòLocalPlayerBlast
local function canLocalPlayerBlast(): boolean
return true -- nuova linea, assicurati di cambiare indietro
end
Genera dati esplosivi
Dopo aver verificato che il Giocatoreha il suo blaster in uno stato Ready , attemptBlastClient chiama ReplicatedStorage > 2> tentativBlastClient2> > 5> blastClient5> . Il primo
Il prossimo passo è generare i dati di esplosione. Se si guarda a ReplicatedStorage > Blaster > BlastData , si può vedere che ogni esplosione consiste in tre pezzi di informazioni:
- Il giocatore che inizia l'esplosione.
- Un DataType.CFrame che rappresenta il punto di origine dell'esplosione.
- Una tabella RayResult che contiene la destinazione finale di ogni raggio laser e il Giocatorecolpito, se colpito da un altro Giocatore.
Per generare questi dati, blastClient chiama ReplicatedStorage > tentativoBlastClient > 1> blastClient1> > 4> generateBlastData4>, che puoi visualizzare di seguito.
GeneraBlastData
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
Questa funzione inizia utilizzando getBlasterConfig per recuperare il inserisci / scrividi laser del Giocatore. L'esempio fornisce due tipi di laser: uno che produce più raggi con una larga distribuzione orizzontale e un altro che produce un singolo raggio. Puoi trovare le loro configurazioni in ReplicatedStorage > Istances > 1> LaserBlastersFolder1> .
La funzione poi usa currentCamera.CFrame come punto di origine per l'esplosione, passandola a getDirectionsForBlast . In questo punto, il codice non è più riguardante il blaster, è
Notifica al server
Una volta che blastClient ha i dati completi per l'esplosione, attiva due eventi:
Client di esplosione
local laserBlastedBindableEvent = ReplicatedStorage.Instances.LaserBlastedBindableEventlocal laserBlastedEvent = ReplicatedStorage.Instances.LaserBlastedEventlaserBlastedBindableEvent:Fire(blastData)laserBlastedEvent:FireServer(blastData)
Il BindableEvent notifica gli altri script del client della bomba. Ad esempio, ReplicatedStorage > FirstPersonBlasterVisuals usa questo evento per sapere quando visualizzare gli effetti visivi, come l'animazione della bomba e la barra di cooldown. Allo stesso modo, il <
Gestore LaserBlast
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
Per aiutare a prevenire il cheating, il server deve verificare tutti i dati che ogni client invia. Questi controlli includono:
- Is BlastData è una tabella? Contiene un Class.CFrame e un'altra tabella chiamata rayResults?
- Il giocatore ha un blaster equipaggiato?
- Il giocatore ha un personaggio e una posizione nel Mondo?
- Dopo l'invio dei dati di esplosione, il giocatore si è allontanato troppo dalla posizione in cui hanno sparato il laser?
Questo ultimo test coinvolge una chiamata di giudizio, e secondo la latenza del server e la velocità di movimento del giocatore, potresti decidere che valori diversi sono eccessivi per la tua esperienza. Per dimostrare come fare questa chiamata di giudizio, puoi ottenere una sensazione della tipica dimensione della posizione cambiando aggiungendo una frase di stampa in getValidatedBlastData e testando l'esperienza.
ottenere ValidatedBlastData
local distanceFromCharacterToOrigin = blastData.originCFrame.Position - rootPartCFrame.Positionprint(distanceFromCharacterToOrigin.Magnitude) -- nuova linea, assicurati di rimuovereif distanceFromCharacterToOrigin.Magnitude > ToleranceValues.DISTANCE_SANITY_CHECK_TOLERANCE_STUDS thenwarn(`Player {player.Name} failed an origin sanity check while blasting`)returnend
Mentre ti muovi e fai esplodere, nota l'Output. Potrebbe sembrare qualcosa come questo:
1.90196299552917483.15495586395263672.57428836822509774.80445861816406252.6434271335601807
Se aumenti la velocità di movimento per i giocatori in ReplicatedStorage > PlayerStateHandler > togglePlayerMovement , quindi testa di nuovo, probabilmente incontrerai molti check failed dovuti allo movimento eccessivo tra le esplosioni.
Attiva/disattiva PlayerMovement
local ENABLED_WALK_SPEED = 60 -- updated line, be sure to change back
Il server poi fa il Seguendo:
- Valida rayResults .
- Controlla se il giocatore può esplodere.
- Ripristina lo stato del blaster.
- Riduce la salute per tutti i giocatori contrassegnati.
- Replica l'esplosione a tutti gli altri giocatori in modo che possano vedere visuali a terza persona.
For more information on these server operations, see the Rilevare colpi section of the Tutoriale.
Ripristina il Blaster
Nell'esperienza del laser tag di campionamento, i blaster utilizzano un meccanismo di calore. Invece di ricaricare dopo un certo numero di esplosioni, hanno bisogno di tempo per "rinfreddarsi" tra ogni esplosione. Questo stesso ritardo di calcolo si verifica sia sul client ( blastClient ) che sul server ( blastServer ) , con il server che funge da fonte di verità.
esplosioneServer
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'attributo secondsBetweenBlasts fa parte della configurazione del blaster in ReplicatedStorage > Istances > 1> LaserBlastersFolder1> . Dopo il ritardo 4>secondsBetweenBlasts4>, il giocatore può esplodere di nuovo, e l'intero processo si ripetisce. Per aiutare il giocatore a
A questo punto, i giocatori possono spawnare e respawnare, mirare e esplodere, ma l'esperienza deve ancora determinare i risultati di ogni esplosione. Nel prossimo settore del Tutoriale, imparerai a programmare la capacità per il blaster di rilevare quando l'esplosione colpisce un altro Giocatore, quindi ridurre la quantità appropriata di salute del giocatore in base alle impostazioni del blaster.