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.LaserBlastedBindableEventlocal laserBlastedEvent = ReplicatedStorage.Instances.LaserBlastedEventlaserBlastedBindableEvent: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:
- Apakah BlastData tabel? Apakah itu berisi tabel Class.CFrame dan tabel lain bernama rayResults?
- Apakah pemain memiliki blaster yang dilengkapi?
- Apakah pemain memiliki karakter dan lokasi di dalam dunia?
- 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.Positionprint(distanceFromCharacterToOrigin.Magnitude) -- baris yang diperbarui, pastikan untuk menghapusif distanceFromCharacterToOrigin.Magnitude > ToleranceValues.DISTANCE_SANITY_CHECK_TOLERANCE_STUDS thenwarn(`Player {player.Name} failed an origin sanity check while blasting`)returnend
Saat Anda bergerak dan meledak, catat outputnya. Ini mungkin terlihat seperti ini:
1.90196299552917483.15495586395263672.57428836822509774.80445861816406252.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.