Menghubungkan input pengguna dengan aksi memberikan kontrol yang jauh lebih baik dan intuitif bagi pengguna terhadap fitur pengalaman Anda. Dalam tutorial ini, Anda akan mengikat aksi memuat ulang ke tombol tertentu.
Memulai
Tutorial ini menggunakan alat Blaster yang dibuat dalam Buat Alat Pemain. Anda dapat mengikuti instruksi tersebut untuk membuat alat atau Anda dapat mengunduh model Blaster dan menyisipkannya ke dalam StarterPack.
Model dapat ditambahkan ke Inventaris Anda untuk digunakan di antara pengalaman manapun. Untuk menambahkan model ke pengalaman Anda:
- Di browser, buka halaman model, klik tombol Dapatkan. Ini akan menambahkan model ke dalam inventaris Anda.
- Pastikan dropdown berada di My Models.
- Pilih model Blaster untuk menambahkannya ke dalam pengalaman.
Buat pengendali aksi
Pertama, Anda perlu fungsi untuk menangani ketika input pengguna terdeteksi.
Buka LocalScript ToolController di dalam Blaster.

Buat variabel untuk menyimpan nama aksi.
local tool = script.Parentlocal RELOAD_ACTION = "reloadWeapon"local function toolEquipped()tool.Handle.Equip:Play()endlocal function toolActivated()tool.Handle.Activate:Play()endtool.Equipped:Connect(toolEquipped)tool.Activated:Connect(toolActivated)Buat fungsi bernama onAction yang menerima tiga argumen: actionName, inputState, dan inputObject. Ini akan menjadi fungsi yang dijalankan ketika input pengguna terdeteksi.
local tool = script.Parentlocal RELOAD_ACTION = "reloadWeapon"local function onAction(actionName, inputState, inputObject)endlocal function toolEquipped()tool.Handle.Equip:Play()endDi dalam fungsi tersebut, periksa apakah actionName yang diberikan cocok dengan nama aksi memuat ulang dan pastikan inputState adalah UserInputState.Begin (status awal). Ini penting karena fungsi akan dijalankan setiap kali inputState berubah, tetapi memuat ulang hanya perlu terjadi sekali.
local function onAction(actionName, inputState, inputObject)if actionName == RELOAD_ACTION and inputState == Enum.UserInputState.Begin thenendendUntuk membuatnya lebih jelas ketika pengguna memuat ulang, ubah TextureId alat menjadi "rbxassetid://6593020923" untuk sesaat, lalu ubah kembali ke nilai aslinya yaitu "rbxassetid://92628145".
local function onAction(actionName, inputState, inputObject)if actionName == RELOAD_ACTION and inputState == Enum.UserInputState.Begin thentool.TextureId = "rbxassetid://6593020923"task.wait(2)tool.TextureId = "rbxassetid://92628145"endend
Ikat aksi
ContextActionService dapat digunakan untuk mengikat sebuah fungsi ke input tertentu dengan menggunakan fungsi BindAction, yang menerima beberapa argumen:
- Nama aksi.
- Fungsi untuk menangani aksi (juga disebut "callback").
- Apakah tombol layar sentuh harus ditampilkan.
- Setiap jumlah Enum.KeyCodes untuk mendeteksi dan mengasosiasikannya dengan aksi.
KeyCodes adalah nilai yang mewakili berbagai tombol input, seperti tombol keyboard atau tombol pengontrol. Daftar lengkap kode tersedia di sini.
Ambil ContextActionService di bagian atas skrip.
local ContextActionService = game:GetService("ContextActionService")local tool = script.Parentlocal RELOAD_ACTION = "reloadWeapon"Di dalam fungsi toolEquipped, panggil BindAction dan masukkan argumen berikut:
- Nama aksi (RELOAD_ACTION)
- Pengendali aksi (onAction)
- Sebuah nilai untuk membuat tombol sentuh (true)
- Sebuah penekanan kunci untuk mendeteksi (Enum.KeyCode.R)
local RELOAD_ACTION = "reloadWeapon"local function onAction(actionName, inputState, inputObject)if actionName == RELOAD_ACTION and inputState == Enum.UserInputState.Begin thentool.TextureId = "rbxassetid://6593020923"task.wait(2)tool.TextureId = "rbxassetid://92628145"endendlocal function toolEquipped()ContextActionService:BindAction(RELOAD_ACTION, onAction, true, Enum.KeyCode.R)tool.Handle.Equip:Play()endUji coba dengan memperlengkapi alat dan menekan tombol R di keyboard Anda. Ikon ransel harus berubah sesaat menjadi simbol menunggu untuk memberi sinyal bahwa senjata sedang dimuat ulang:
Lepaskan aksi
Saat pengguna melepas alat, aksi perlu dilepaskan agar mereka tidak bisa memuat ulang tanpa alat yang diperlengkapi.
Buat fungsi baru bernama toolUnequipped dan panggil UnbindAction, melampirkan nama aksi.
local function toolEquipped()ContextActionService:BindAction(RELOAD_ACTION, onAction, true, Enum.KeyCode.R)tool.Handle.Equip:Play()endlocal function toolUnequipped()ContextActionService:UnbindAction(RELOAD_ACTION)endlocal function toolActivated()tool.Handle.Activate:Play()endtool.Equipped:Connect(toolEquipped)tool.Activated:Connect(toolActivated)Hubungkan fungsi toolUnequipped ke acara Unequipped sehingga fungsi dijalankan ketika acara terjadi.
local ContextActionService = game:GetService("ContextActionService")local tool = script.Parentlocal RELOAD_ACTION = "reloadWeapon"local function onAction(actionName, inputState, inputObject)if actionName == RELOAD_ACTION and inputState == Enum.UserInputState.Begin thentool.TextureId = "rbxassetid://6593020923"task.wait(2)tool.TextureId = "rbxassetid://92628145"endendlocal function toolEquipped()ContextActionService:BindAction(RELOAD_ACTION, onAction, true, Enum.KeyCode.R)tool.Handle.Equip:Play()endlocal function toolUnequipped()ContextActionService:UnbindAction(RELOAD_ACTION)endlocal function toolActivated()tool.Handle.Activate:Play()endtool.Equipped:Connect(toolEquipped)tool.Unequipped:Connect(toolUnequipped)tool.Activated:Connect(toolActivated)Uji coba untuk memastikan semuanya berfungsi dengan benar. Anda seharusnya bisa memuat ulang saat alat diperlengkapi, tetapi tidak saat alat dilepas.
Animasi pemuatan ulang Anda sekarang lengkap - untuk tantangan ekstra, coba hitung mundur penghitung amunisi setiap kali blaster ditembakkan. Anda kemudian dapat menonaktifkan fungsi toolActivated ketika senjata tidak memiliki amunisi, lalu mengaktifkannya kembali setelah animasi pemuatan ulang selesai.