Blaster Davranışının Uygulanması

*Bu içerik, yapay zekâ (beta) kullanılarak çevrildi ve hatalar içerebilir. Sayfayı İngilizce görüntülemek için buraya tıkla.

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

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

  1. BlastData bir tablo mı? Bu bir Class.CFrame ve rayResults adlı başka bir tablo içeriyor mu?
  2. Oyuncunun bir blaster'ı var mı?
  3. Oyuncunun dünyanın içinde bir karaktere ve bir yerine sahip olup olmadığını?
  4. 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.Position
print(distanceFromCharacterToOrigin.Magnitude) -- güncellenmiş hattı, emin olun kaldırın
if distanceFromCharacterToOrigin.Magnitude > ToleranceValues.DISTANCE_SANITY_CHECK_TOLERANCE_STUDS then
warn(`Player {player.Name} failed an origin sanity check while blasting`)
return
end

Hareket ettiğiniz ve patladığınızda, çıkışı not edin. Şu gibi görünebilir:


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