Blaster davranışını uygulamak is the process of programming a blast mechanic in first-person shooter experiences. While players can blast with a single click or press of a button, creating a satisfactory and accurate blast behavior is important because it enhanced players' enjoyment of the overall oynanış.
Bu bölüm, referans olarak örnek laser etiketi deneyimi kullanır, bu nedenle bu öğretici iki farklı tipteki blaster'ın davranışını uygulayan kodları öğretir:
- Oyuncular bomba düğmesine bastığında algılanır.
- Oyuncunun sonunda patlama düğmesine basmasına izin verip etmediğini kontrol etmek.
- Patlamayı başlatan sunucuyu, nereden geldiğini ve her bir lazerin son noktasının ne olduğunu gösteren patlama verileri oluşturuluyor.
- Patlayıcı verilerin sunucusuna bildirilir, böylece patlama başka bir oyuncuyla çarpıştığında uygun eylemleri yapabilir.
- Blaster'ı her patlamadan önce yeniden patlamaya izin vermek için blaster'ın yeterli soğumada olmasını sağlar.
Bu bölümü tamamladıktan sonra, blaster'ın başka oyuncularla çarpıştığında tespit etmesine izin veren kodları öğreneceksiniz, ardından her blaster yazgöre ilgili sağlık miktarını azaltın.
Oyuncu Girişini Tespit Et
Blaster davranışını uygulamak için ilk adım, bir oyuncunun patlama düğmesine basmasından duyduğunuzda dinlemektir. Oyuncular, patlama düğmesine erişmek için kullandığı cihaz bağımlıdır. Örneğin, ReplicatedStorage > KullanıcıInputHandler .
Bu klien kodu ContextActionService kullanır, MouseButton1 ve ButtonR2 ı patlatma aksiyoniçin bağlayabilir. Bu, herhangi bir oyuncu bir sol fare düğmesine veya bir oyunpad'ın R2 düğmes
Kullanıcı Girintisiyle Bağlantı kurucu
ContextActionService:BindAction("_", onBlasterActivated, false,Enum.UserInputType.MouseButton1,Enum.KeyCode.ButtonR2)
Başka bir önemli not, Enum.UserInputState.Begin tanımında onBlasterActivated() kullanımının kullanımıdır. Birçok kullanıcı arayüz etkileşimi, bu örnekteki bir blaster'ı seçme gibi, En
Göstermek için, Enum.UserInputState.Begin 'i Enum.UserInputState.End ile değiştirebilirsiniz, ardından oyunun oynanışını test etmek için oynatın, öyleyse oyuncuların butonunu basılı tutarak deneyimin oynanışını nasıl değiştirebileceğini görebilir
Kullanıcı Girintisiyle Bağlantı kurucu
local function onBlasterActivated(_actionName: string,
inputState: Enum.UserInputState, _inputObject: InputObject)
if inputState == Enum.UserInputState.End then -- güncellenen hattı, geri dönüştüğünden emin olun
attemptBlastClient()
end
end
Oyuncunun Patlayabilirliğini Kontrol Et
UserInputHandler tespit eder bir buton gücüne veya ekran dokunuşuna, ReplicatedStorage > <
canLocalPlayerBlast
local function canLocalPlayerBlast(): boolean
return localPlayer:GetAttribute(PlayerAttribute.blasterStateClient) == BlasterState.Ready
end
Eğ
Bu hafifbekleme, tıklayabildiğiniz kadar hızlı patlamanızı sağlayamıyor. Örneğin, işlevi her zaman geri döndürmeye değiştirirseniz, blaster'ınızı hızlı bir şekilde patlatabilirsiniz, bu da laser etiketi oynanışgerçekçi olmayan bir yanıtını oluşturur.
canLocalPlayerBlast
local function canLocalPlayerBlast(): boolean
return true -- güncellenen hattı, geri dönüştüğünden emin olun
end
Patlayıcı Verileri Oluştur
oyuncublaster'ının Ready devletinde olduğunu doğruladıktan sonra, attemptBlastClient çağrıları ReplicatedStorage > 1> attemptBlastClient1>
Bir sonraki adım patlayıcı verileri oluşturmaktır. Eğer ReplicatedStorage > Blaster > BlastData in gözden geçirirseniz, her patlayıcının üç bilgi parçasından oluştuğunu görebilirsiniz:
- Patlamayı başlatan oyuncu.
- Patlamanın noktasını temsil eden bir DataType.CFrame .
- Bir lazer ışınının son hedefini ve isabet oyuncusunu içeren bir RayResult tablosu.
Bu verileri oluşturmak için, blastClientReplicatedStorage > attemptBlastClient > 2>blastClient2> > 5>blastData5> , which you can review below.
爆発 verileri oluştur
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
Bu işlev getBlasterConfig kullanarak oyuncunun blaster yazalmak için başlar. Örnek, bir yayılma genişliğine sahip birkaç ışın üreten birini içerir. ReplicatedStorage > İン스턴sları > 1> LaserBlasterFolder1> konfigürasyonlarını bulabil
İşlevsel olarak, patlamaya ilişkin kaynağı currentCamera.CFrame olarak kullanır, onu getDirectionsForBlast ile geçer. Bu noktada, kod art
Sunucuya Bildir
Bir blastClient tüm patlama için verilmiş olduğunda, iki etkinliği başlatır:
爆破Client
local laserBlastedBindableEvent = ReplicatedStorage.Instances.LaserBlastedBindableEventlocal laserBlastedEvent = ReplicatedStorage.Instances.LaserBlastedEventlaserBlastedBindableEvent:Fire(blastData)laserBlastedEvent:FireServer(blastData)
The BindableEvent notifies other client scripts of the blast. For example, ReplicatedStorage > FirstPersonBlasterVisuals uses this event to know when to display visual effects, such as the blast animation and cooldown bar.同样, the 1> Class.RemoteEvent1> notifies
LazerPatlaması
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
Aldatma için önlemler almak için, sunucu her bir istemci tarafından gönderilen tüm verileri doğrulamalıdır. Bu kontroller şunları içerir:
- BlastData bir tablo mı? Bu bir Class.CFrame ve rayResults adlı başka bir tablo içeriyor mu?
- Oyuncunun bir blaster'ı var mı?
- Oyuncunun dünyanın içinde bir karaktere ve bir yerine sahip olup olmadığını?
- Patlama verileri gönderildikten sonra, oyuncu laser dalgasını patlatma noktasından aşırı bir mesafe katıyor mu?
Bu son test bir yargı çağrısı içerir ve sunucunun gecikme ve oyuncu hızına göre, farklı değerlerin kendi deneyiminiz için aşırı olduğunu karar verebilirsiniz. Bu yargı çağrısını göstermek için, getValidatedBlastData'e bir print ifadesi ekleyerek ve deneyiminizi oynatmak için oyun test edin.
getValidatedBlastData alın
local distanceFromCharacterToOrigin = blastData.originCFrame.Position - rootPartCFrame.Positionprint(distanceFromCharacterToOrigin.Magnitude) -- güncellenmiş hattı, emin olun kaldırınif distanceFromCharacterToOrigin.Magnitude > ToleranceValues.DISTANCE_SANITY_CHECK_TOLERANCE_STUDS thenwarn(`Player {player.Name} failed an origin sanity check while blasting`)returnend
Hareket ettiğiniz ve patladığınızda, çıkışı not edin. Şu gibi görünebilir:
1.90196299552917483.15495586395263672.57428836822509774.80445861816406252.6434271335601807
Eğer ReplicatedStorage > PlayerStateHandler > PlayerMovement ile oyuncuların hızını artırırsanız, oyun test edilir ve çok fazla hareket arasında çok fazla hareket yapılır.
oyuncu hareketi
local ENABLED_WALK_SPEED = 60 -- updated line, be sure to change back
Sunucu, sonra takip edilenyapar:
- Geçerli rayResults .
- Oyuncunun patlayabilir mi olduğunu kontrol eder.
- Blaster'ın devletini sıfırlar.
- Herhangi bir etiketlenmiş oyuncunun sağlığını azaltır.
- Üçüncü kişi görüntülerini görebilmeleri için patlamayı tüm diğer oyunculara yeniden oynatır.
Bu sunucu operasyonları hakkında daha fazla bilgi için, öğretici Hizalama bölümünde bulunan Hizalama Hedefleri bölümünü görün.
Blaster'ı Sıfırla
Örnek laser etiketi deneyiminde, blasterlar ısı mekanik kullanır. Bir set sayısında patlamadan sonra yeniden yüklemeye gerek yok, aralarında "sakinleştirme" olarak adlandırdıkları süre için zaman gerekir. Bu aynı soğuma gecikme gecikme gecikme gecikme gecikme gecikme gecikme gecikme gecikme gecik
爆炸Sunucusu
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)
The secondsBetweenBlasts attribute is part of the blaster configuration in ReplicatedStorage > Instances > 1> LaserBlastersFolder1> . After the 4> secondsBetweenBlasts4> delay passes, the player can blast again, and the entire process repeats. To help the player understand when they can blast again, the experience includes a coold
Bu noktada, oyuncular spawne veya yeniden doğabilir, nişan ve patlayabilir, ancak deneyim hala her patlamanın sonuçlarını belirlemelidir. öğretici'nin bir sonraki bölümünde, oyuncuların blaster'ın başka bir oyuncu tarafından vurduğunda nişan ve patlaymayı nasıl programlayacağını öğreneceksiniz, ardından blaster ayarlarına göre uygun oyuncu sa