Menyambungkan input pengguna ke tindakan memberi pengguna kontrol yang lebih baik dan lebih intuitif atas fitur pengalaman Anda.Dalam tutorial ini, Anda akan mengikat tindakan pengisian ulang ke unittertentu.
Mulai
Tutorial ini menggunakan alat Blaster yang dibuat di Buat Alat Pemain.Anda dapat mengikuti instruksi untuk membuat alat atau Anda dapat mengunduh model Blaster dan menyisipkannya ke StarterPack .
Model dapat ditambahkan ke Inventaris Anda untuk digunakan di antara pengalaman apa pun. Untuk menambahkan model ke pengalaman Anda:
- Di browser, buka halaman model, klik tombol Dapatkan . Ini menambahkan model ke inventaris Anda.
- Di Studio, pergi ke tab Tampilan dan klik pada Toolbox .
- Di jendela Toolbox, klik tombol Inventaris . Kemudian, pastikan dropdown berada di Model Saya .
- Pilih model Peredam untuk menambahkannya ke dalam pengalaman.
Buat pengelola tindakan
Pertama, Anda akan membutuhkan fungsi untuk ditangani saat input pengguna terdeteksi.
Buka Kontroler Alat LocalScript.
Buat variabel untuk menyimpan nama untuk action.
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 saat 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 yang diberikan actionName sesuai dengan nama tindakan reload dan pastikan inputState adalah UserInputState.Begin (status awal).Ini penting karena fungsi akan berjalan setiap kali ada perubahan inputState, tetapi reload 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, lalu ubah kembali ke nilai aslinya "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
Ikatkan action
ContextActionService dapat digunakan untuk mengikat fungsi ke input spesifik dengan menggunakan fungsi BindAction, yang menerima beberapa argumen:
- Nama action
- Fungsi untuk menangani tindakan (juga disebut " callback")
- Apakah tombol touchscreen harus ditampilkan atau tidak
- Jumlah berapa pun dari Enum.KeyCodes untuk mendeteksi dan berhubungan dengan action.
Kode Kunci adalah nilai yang mewakili berbagai tombol input, seperti tombol keyboard atau tombol kontroler.Daftar kode lengkap tersedia here .
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 lulus melalui argumen berikut:
- Nama tindakan ( RELOAD_ACTION )
- Pengelola tindakan ( onAction )
- Nilai untuk membuat tombol sentuh ( true )
- Tekan 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()endTes uji dengan memperlengkapi alat dan menekan tombol R pada keyboard Anda.Ikon ransel harus sesaat berubah menjadi simbol tunggu untuk menandakan bahwa senjata sedang diisi ulang:
Hapuskan action
Ketika pengguna melepaskan alat, tindakan perlu menjadi tidak terikat sehingga mereka tidak dapat memuat ulang tanpa alat dilengkapi.
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 fungsi Unequipped untuk acara sehingga fungsi akan berjalan saat 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)Tes uji untuk mengkonfirmasi bahwa semuanya berfungsi dengan benar. Anda harus dapat memuat ulang saat alat dilengkapi, tetapi tidak saat tidak dilengkapi.
Animasi reload ulang Anda sekarang selesai - untuk tantangan ekstra, coba hitung mundur penghitung amunisi setiap kali peledak ditembak.Anda kemudian dapat menonaktifkan fungsi toolActivated ketika senjata tidak memiliki amunisi, lalu aktifkan kembali setelah animasi reload selesai.