Menghubungkan input pengguna ke tindakan memberikan kontrol yang jauh lebih baik dan lebih intuitif atas fitur-fitur permainan Anda. Dalam tutorial ini, Anda akan mengikat tindakan 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 permainan mana pun. Untuk menambahkan model ke permainan Anda:
- Di browser, buka halaman model, klik tombol Dapatkan. Ini menambahkan model ke dalam inventaris Anda.
- Pastikan dropdown berada di Model Saya.
- Pilih model Blaster untuk menambahkannya ke dalam permainan.
Buat pengendali tindakan
Pertama, Anda perlu sebuah fungsi untuk menangani ketika input pengguna terdeteksi.
Buka LocalScript ToolController di dalam Blaster.

Buat variabel untuk menyimpan nama untuk tindakan.
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, periksa bahwa actionName yang diberikan cocok dengan nama tindakan 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 jelas ketika pengguna memuat ulang, ubah TextureId dari alat menjadi "rbxassetid://6593020923" untuk sesaat, dan kemudian 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 tindakan
ContextActionService dapat digunakan untuk mengikat sebuah fungsi ke input tertentu dengan menggunakan fungsi BindAction, yang menerima beberapa argumen:
- Nama tindakan.
- Fungsi untuk menangani tindakan (juga disebut "callback").
- Apakah tombol layar sentuh harus ditampilkan atau tidak.
- Jumlah Enum.KeyCodes untuk mendeteksi dan mengasosiasikannya dengan tindakan.
KeyCodes adalah nilai yang mewakili tombol input yang berbeda, seperti tombol keyboard atau tombol pengontrol. Daftar lengkap kode tersedia di sini.
Dapatkan ContextActionService di bagian atas skrip.
local ContextActionService = game:GetService("ContextActionService")local tool = script.Parentlocal RELOAD_ACTION = "reloadWeapon"Di dalam fungsi toolEquipped, panggil BindAction dan lewati argumen berikut:
- Nama tindakan (RELOAD_ACTION)
- Pengendali tindakan (onAction)
- Sebuah nilai untuk membuat tombol sentuh (true)
- Sebuah penekanan tombol 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 mengenakan alat dan menekan tombol R di keyboard Anda. Ikon ransel harus berubah sesaat menjadi simbol menunggu untuk menandakan bahwa senjata sedang memuat ulang:
Lepaskan tindakan
Ketika pengguna melepas alat, tindakan perlu dilepaskan sehingga mereka tidak dapat memuat ulang tanpa alat yang dikenakan.
Buat fungsi baru bernama toolUnequipped dan panggil UnbindAction, melewati nama tindakan.
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 akan 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 bahwa semuanya berfungsi dengan benar. Anda seharusnya dapat memuat ulang ketika alat dikenakan, tetapi tidak ketika alat dilepas.
Animasi memuat ulang Anda sekarang sudah lengkap - untuk tantangan tambahan, 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 memuat ulang selesai.