Menerapkan Perilaku Blaster

*Konten ini diterjemahkan menggunakan AI (Beta) dan mungkin mengandung kesalahan. Untuk melihat halaman ini dalam bahasa Inggris, klik di sini.

Menerapkan perilaku blaster adalah proses pemrograman mekanik ledakan dalam pengalaman penembak orang pertama. Sementara pemain dapat meledak dengan satu klik atau tekan tombol, membuat perilaku ledakan yang menyenangkan dan akurat adalah penting karena itu meningkatkan kesenangan pemain tentang seluruh gameplay.

Menggunakan sample laser tag experience sebagai referensi, bagian ini dari tutorial menunjukkan tentang skrip di belakang menerapkan perilaku blaster untuk dua jenis blaster, termasuk panduan tentang:

  • Mendeteksi saat pemain menekan tombol ledakan.
  • Memeriksa apakah pemain dapat menggunakan pistol mereka jika mereka baru-baru ini menekan tombol ledakan.
  • Meng生成爆炸数据,告诉服务器谁 menginisialisasi ledakan, 从哪里来, 和 每个激光柱的最终目的地.
  • Menginformasikan server tentang data ledakan sehingga dapat melakukan tindakan yang sesuai jika ledakan bertabrakan dengan pemain lain.
  • Mengatur ulang blaster di antara setiap ledakan untuk memberi blaster waktu yang cukup untuk menenangkan sebelum itu bisa ledakan lagi.

Setelah Anda menyelesaikan bagian ini, Anda akan belajar tentang skrip yang memungkinkan blaster untuk mendeteksi ketika ledakan bola bola bola bola bola bola bola bola bola bola bola bola bola bola bola bola bola bola bola bola bola bola bola bola bola bola bola bola bola bola bola bola bola bola bola bola bola bola bola bola bola bola bola bola bola bola bola bola bola bola bola bola bola bola bola bola bola bola bola bola bola bola bola bola bola bola bola bola bola b

Mendeteksi Masukan Pemain

Langkah pertama untuk menerapkan perilaku blaster adalah mendengarkan ketika seorang pemain menekan tombol ledakan. Jenis input yang digunakan pemain untuk menekan tombol ledakan bergantung pada perangkat yang mereka gunakan untuk mengakses pengalaman. Misalnya, pengalaman laser tag contoh mendukung mouse dan kendali, gamepad, dan tombol sentuh. Anda dapat melihat m

Skrip klien ini menggunakan ContextActionService untuk menyambungkan MouseButton1 dan ButtonR2 ke actionledakan. Ini berarti bahwa setiap kali seorang pemain menekan tombol kiri mouse atau tombol R2 gamepad, itu mengakt

Pengolah Masukan Pengguna

ContextActionService:BindAction("_", onBlasterActivated, false,
Enum.UserInputType.MouseButton1,
Enum.KeyCode.ButtonR2
)

Nota penting lainnya adalah penggunaan Enum.UserInputState.Begin dalam definisi onBlasterActivated() . Banyak interaksi antarmuka pengguna, seperti memilih blaster di contoh ini, tidak terjadi sampai setelah tombol mouse muncul ( Enum.UserInputState.

Untuk menunjukkan, Anda dapat mengubah Enum.UserInputState.Begin menjadi Enum.UserInputState.End , lalu menguji untuk melihat bagaimana respons dari ledakan mempengaruhi permainanplay dari pengalaman. Misalnya, jika pemain dapat menahan tombol tanpa menetapkan ledakan, bagaimana itu dapat mengubah pengalaman mereka saat menyetik pemain

Pengolah Masukan Pengguna

local function onBlasterActivated(_actionName: string,
inputState: Enum.UserInputState, _inputObject: InputObject)
if inputState == Enum.UserInputState.End then -- baris yang diperbarui, pastikan untuk mengubah kembali
attemptBlastClient()
end
end

Periksa apakah Pemain dapat meledak

Setelah UserInputHandler mendeteksi tombol ditekan atau sentuh ketuk, itu memanggil ReplicatedStorage > <

dapat melakukan pemain ledakan

local function canLocalPlayerBlast(): boolean
return localPlayer:GetAttribute(PlayerAttribute.blasterStateClient) == BlasterState.Ready
end

J

Pause ringan ini mencegah Anda dapat meledak secepat yang Anda bisa klik. Misalnya, jika Anda mengubah fungsi untuk selalu mengembalikan benar, Anda dapat meledak blaster Anda dengan cepat tanpa penundaan, yang tidak realistis untuk gameplay laser tag.

dapat melakukan pemain ledakan

local function canLocalPlayerBlast(): boolean
return true -- baris yang diperbarui, pastikan untuk mengubah kembali
end

Menghasilkan Data Ledakan

Setelah mengevaluasi bahwa pemainnya blaster adalah dalam Ready status, attemptBlastClient memanggil ReplicatedStorage > 2> attemptBlastClient2> > 5> blastClient</

Langkah selanjutnya adalah menghasilkan data ledakan. Jika Anda meninjau ReplicatedStorage > Blaster > BlastData , Anda dapat melihat bahwa setiap ledakan terdiri dari tiga bagian informasi:

  • Pemain yang memulai ledakan.
  • A DataType.CFrame yang mewakili titik asal ledakan.
  • Tabel RayResult yang berisi tujuan akhir setiap sinar laser dan pemain hit, jika memukul pemain lain.

Untuk menghasilkan data ini, blastClient memanggil ReplicatedStorage > mencobaBlastClient > 2> mencobaBlastClient2> > 5> mencobaBlastData5>, yang dapat Anda tinjau di bawah ini.

menghasilkan data ledakan

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

Fungsi ini dimulai dengan menggunakan getBlasterConfig untuk mengambil ketikblaster pemain. Sample memberikan dua jenis blaster: satu yang menghasilkan beberapa balok dengan rentang horizontal yang lebar, dan yang lain menghasilkan satu balok. Anda dapat menemukan konfigurasi mereka di ReplicatedStorage > Instances</

Fungsi kemudian menggunakan currentCamera.CFrame sebagai titik asal untuk ledakan, menyimpannya ke getDirectionsForBlast . Pada titik ini, kode bukan

Beritahu Server

Setelah blastClient memiliki data lengkap untuk ledakan, itu menyetel dua acara:

klien ledakan

local laserBlastedBindableEvent = ReplicatedStorage.Instances.LaserBlastedBindableEvent
local laserBlastedEvent = ReplicatedStorage.Instances.LaserBlastedEvent
laserBlastedBindableEvent:Fire(blastData)
laserBlastedEvent:FireServer(blastData)

BindableEvent menginformasikan skrip klien lain dari ledakan. Misalnya, ReplicatedStorage > FirstPersonBlasterVisuals menggunakan acara ini untuk mengetahui kapan menampilkan efek visual, seperti animasi ledakan dan

Pemrosak Laser

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

Untuk membantu mencegah kecurangan, server harus mengevaluasi semua data yang dikirim setiap klien. Periksa ini termasuk:

  1. Apakah BlastData tabel? Apakah itu berisi tabel Class.CFrame dan tabel lain bernama rayResults?
  2. Apakah pemain memiliki blaster yang dilengkapi?
  3. Apakah pemain memiliki karakter dan lokasi di dalam dunia?
  4. Setelah mengirim data ledakan, apakah pemain telah bergerak jauh dari di mana mereka mengekstraksi sinar laser?

Pemeriksaan terakhir ini melibatkan panggilan hakim, dan sesuai dengan server latency dan kecepatan gerakan pemain, Anda mungkin memutuskan bahwa nilai-nilai yang berbeda terlalu berlebihan untuk pengalaman Anda sendiri. Untuk menunjukkan cara membuat panggilan hakim ini, Anda dapat mendapatkan gambaran tentang ukuran typis perubahan posisi dengan menambahkan pernyataan cetak

mendapatkan ValidatedBlastData

local distanceFromCharacterToOrigin = blastData.originCFrame.Position - rootPartCFrame.Position
print(distanceFromCharacterToOrigin.Magnitude) -- baris yang diperbarui, pastikan untuk menghapus
if distanceFromCharacterToOrigin.Magnitude > ToleranceValues.DISTANCE_SANITY_CHECK_TOLERANCE_STUDS then
warn(`Player {player.Name} failed an origin sanity check while blasting`)
return
end

Saat Anda bergerak dan meledak, catat outputnya. Ini mungkin terlihat seperti ini:


1.9019629955291748
3.1549558639526367
2.5742883682250977
4.8044586181640625
2.6434271335601807

Jika Anda meningkatkan kecepatan gerakan untuk pemain di ReplicatedStorage > PlayerStateHandler > togglePlayerMovement , maka test play lagi, Anda kemungkinan akan menemukan banyak check yang gagal karena gerakan berlebihan antara ledakan.

toggleserPlayerMovement

local ENABLED_WALK_SPEED = 60 -- updated line, be sure to change back

Server kemudian melakukan mengikuti:

  • Berlaku untuk rayResults.
  • Memeriksa apakah pemain dapat meledak.
  • Atur ulang status blaster.
  • Mengurangi kesehatan untuk setiap pemain yang ditandai.
  • Mengkloning ledakan ke semua pemain lain sehingga mereka dapat melihat visual orang ketiga.

Untuk informasi lebih lanjut tentang operasi server ini, lihat bagian Mendeteksi Hit dari tutorial.

Atur ulang Blaster

Dalam pengalaman laser tag sampel, blaster menggunakan mekanik panas. Alih-alih memuat ulang setelah set jumlah ledakan, mereka memerlukan waktu untuk "menenangkan" antara setiap ledakan. Penundaan cooldown yang sama ini terjadi di klien ( blastClient ) dan server ( blastServer ) , dengan server bertindak sebagai sumber kebenaran.

meteorServer

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)

Attribut secondsBetweenBlasts adalah bagian dari konfigurasi blaster di ReplicatedStorage > Instances > 1> LaserBlastersFolder1> . Setelah penundaan 4> secondsBetweenBlasts4>, pemain dapat meledakkan lagi, dan seluruh proses diulang. Untuk mem

Pada saat ini, pemain dapat muncul dan respawn, bertujuan dan meledak, tetapi pengalaman masih harus menentukan hasil setiap ledakan. Pada bagian tutorial berikutnya, Anda akan belajar cara menyetel kemampuan agar blaster mendeteksi ketika ledakan menghantam pemain lain, lalu mengurangi jumlah kesehatan pemain yang sesuai sesuai dengan pengaturan blaster.