Menghubungkan masukan pengguna ke tindakan memberi pengguna lebih banyak kendali intuitif atas fitur-fitur pengalaman Anda. Dalam tutorial ini, Anda akan menyambungkan tindakan reloading ke unittertentu.
Memulai
Pelajari cara menggunakan alat Blaster yang dibuat di Creating Player Tools. Anda dapat mengikuti instruksi tersebut untuk menciptakan alat atau Anda dapat mengunduh model Blaster dan menyisipkannya ke dalam 2> StarterPack2>.
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 Lihat dan klik Kotak Alat .
- Di jendela Toolbox, klik pada tombol Inventaris . Kemudian, pastikan tombol dropdown ada di Model Saya .
- Pilih model Blaster untuk menambahkannya ke pengalaman.
Membuat Penangani Tindakan
Pertama, Anda akan memerlukan fungsi untuk menangani ketika input pengguna terdeteksi.
Buka ToolController LocalScript di dalam Blaster.
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 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 aksi reload dan pastikan inputState adalah UserInputState.Begin (status awal). Ini penting karena fungsi akan berjalan setiap kali 2>inputState2> berubah, tetapi reload hanya perlu
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 ini menjadi "rbxassetid://6593020923" untuk sementara waktu, dan kemudianubah kembali ke nilai aslinya dari "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 ikat fungsi ke input khusus dengan menggunakan fungsi BindAction, yang menerima beberapa argumen:
- Nama action
- Fungsi untuk menangani tindakan (juga disebut "CALLBACK")
- Apakah tombol layar sentuh harus ditampilkan atau tidak
- Jumlah apa pun dari Enum.KeyCodes untuk mendeteksi dan menghubungkan dengan action.
KodeKunci adalah nilai yang mewakili tombol masuk yang berbeda, seperti tombol keyboard atau tombol kontrol. Daftar lengkap kode tersedia here .
Dapatkan ContextActionService di bagian atas script.
local ContextActionService = game:GetService("ContextActionService")local tool = script.Parentlocal RELOAD_ACTION = "reloadWeapon"Dalam fungsi toolEquipped, panggil BindAction dan lewati argumen berikut:
- Nama aksi ( RELOAD_ACTION )
- Pengelola aksi ( onAction )
- Nilai untuk menciptakan tombol sentuh ( true )
- Tombol penggeser 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()endTest play dengan menggunakan alat ini dan menekan tombol R di keyboard Anda. Ikon ransel harus berubah sebentar ke simbol tunggu untuk menyinyal bahwa senjata sedang diperbarui:
Membatalkan Bind Aksi
Ketika pengguna melepaskan alat, tindakan harus menjadi tidak bergantung sehingga mereka tidak dapat memuat ulang tanpa alat yang dilengkapi.
Buat fungsi baru bernama toolUnequipped dan panggil UnbindAction , melalui 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 akan berjalan saat acara menembak.
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)Playtest untuk memastikan semuanya berfungsi dengan benar. Anda harus dapat memuat ulang saat alat dilengkapi, tetapi tidak saat tidak dilengkapi.
Animasi reloading Anda sekarang telah selesai - untuk tantangan tambahan, coba hitung mundur counter amunisi setiap kali peledakan diluncurkan. Anda kemudian dapat menonaktifkan fungsi toolActivated ketika peledakan tidak memiliki amunisi, lalu aktifkan kembali saat animasi reloading selesai.