Editor Grafik Animasi

*Konten ini diterjemahkan menggunakan AI (Beta) dan mungkin mengandung kesalahan. Untuk melihat halaman ini dalam bahasa Inggris, klik di sini.

Editor Grafik Animasi adalah alat visual berbasis node yang memberdayakan seniman teknis dan animator untuk membangun logika animasi yang kompleks langsung di dalam Roblox Studio. Dengan menyediakan antarmuka yang disederhanakan untuk membuat perilaku seperti pohon campuran, alat ini menghilangkan ketergantungan tradisional pada scripting manual untuk gerakan karakter.

Sistem ini bekerja selaras dengan alur kerja animasi yang ada:

  • Editor Animasi: Terus gunakan Editor Animasi sebagai alat utama Anda untuk membuat klip individu dan menyempurnakan keyframe dan kurva.
  • Editor Grafik Animasi: Gunakan ruang kerja baru ini untuk mengambil klip tersebut dan mengatur mereka ke dalam pohon logika untuk menggerakkan perilaku permainan yang canggih.

Dirancang untuk meningkatkan kolaborasi, grafik visual memungkinkan pengembang untuk dengan cepat memeriksa, men-debug, dan memahami logika yang dibuat oleh animator. Saat seniman fokus pada penyempurnaan gerakan interaktif, pengembang masih dapat mengakses node grafik animasi secara programatik untuk kontrol langsung atas animasi dan status yang dicampur.

Membangun grafik


Untuk memulai membangun logika untuk karakter yang dapat dianimasikan, akses editor Grafik Animasi melalui tab Avatar di pita Studio. Langkah-langkah berikut menunjukkan cara menginisialisasi rig dan menyusun jaringan node dasar menggunakan animasi berjalan dan melambaikan tangan default.

Untuk penjelasan lebih dalam tentang aplikasi praktis, Anda dapat menjelajahi File Referensi Grafik Animasi, yang berisi contoh implementasi dasar dan kompleks.

Untuk membuat grafik animasi Anda sendiri, mirip dengan contoh dasar yang diberikan dalam referensi, gunakan langkah-langkah berikut:

  1. Di Studio, tambahkan rig yang dapat dianimasikan dengan menavigasi ke tab Avatar dan memilih KarakterAkhirku.

    Tombol Karakter disorot di toolbar Studio.
  2. Buka Editor Grafik Animasi dengan menavigasi ke Graph Editor di tab Avatar.

    Editor Grafik Animasi ditunjukkan di toolbar Studio.
  3. Pilih rig yang dapat dianimasikan di viewport 3D dan pilih Buat Grafik.

  4. Di Graph Editor, klik kanan dan pilih Klip.

    Daftar node dalam menu klik kanan
  5. Di node Klip baru, atur ID Animasi.

    1. Pilih dropdown ID Animasi.

    2. Untuk mengirimkan ID asset animasi tertentu, klik Impor.

      Menunjukkan sebuah field pada modul impor animasi untuk menambahkan ID Animasi
    3. Di field ID Animasi, tambahkan animasi Jalan default: 507777826.

    4. Pilih Impor.

  6. Tambahkan node klip lain dengan mengulangi langkah 4-5 menggunakan animasi Gelombang default: 507770239.

    Dua node klip dengan ID Animasi terisi
  7. Di Graph Editor, klik kanan dan pilih Tambah.

    Tambah node
  8. Sambungkan node Klip ke node Tambah dengan menyeret konektor output kanan atas ke port yang sesuai:

    1. Sambungkan node Klip dengan animasi Berjalan ke port Dasar.
    2. Sambungkan node Klip dengan animasi Melambaikan tangan ke port Aditif.
    Kedua node klip terhubung dengan node tambah
  9. Dari node Tambah, sambungkan konektor output kanan atas ke port Pose Output Grafik.

    Semua node terhubung ke node output akhir
  10. (Opsional) Tetapkan parameter pada variabel Kecepatan Anda.

    1. Klik dan seret port Kecepatan hijau ke area kosong. Node parameter baru ditampilkan.

      Mengklik dan menyeret konektor dari port Kecepatan node Klip.
    2. Di kiri atas grafik editor, gunakan panel parameter untuk dengan cepat memodifikasi parameter di node Anda. Anda juga dapat mengakses ini secara programatik.

      Panel parameter, node parameter, dan node klip yang menunjukkan nilai bersama.
  11. Uji animasi dengan menekan tombol putar.

    Ikon tombol putar untuk pratinjau animasi
  12. Cobalah menguji berbagai bobot, kecepatan, mode putar, dan animasi lainnya. Untuk informasi lebih lanjut tentang node individual, lihat Referensi Node.

Integrasi API

Membuat dan menerapkan Grafik Animasi mengikuti jalur animasi standar Roblox. Setelah memilih rig di Editor Grafik Animasi, asset baru berupa AnimationGraphDefinition dibuat. Asset ini berfungsi sebagai wadah untuk node, koneksi, dan parameter Anda. Setelah logika Anda finalisasi, Anda menerbitkan grafik untuk menerima ID Asset standar.

Dalam skrip Anda, Anda berinteraksi dengan grafik ini dengan memuatnya ke dalam Animator seperti Anda melakukannya dengan animasi tradisional. Untuk menggerakkan logika internal grafik, gunakan AnimationTrack:SetParameter() untuk mengirimkan nilai waktu nyata—seperti kecepatan gerakan atau boolean status—langsung ke dalam variabel grafik.


local animation = Instance.new("Animation")
animation.AnimationId = "rbxassetid://123456789" -- ID Grafik Anda yang Diterbitkan
local animationTrack = animator:LoadAnimation(animation)
animationTrack:Play()
-- Pembaruan parameter dinamis melalui RunService
game:GetService("RunService").Stepped:Connect(function(_, dt)
local currentSpeed = humanoidRootPart.AssemblyLinearVelocity.Magnitude
animationTrack:SetParameter("humanoidSpeed", currentSpeed)
end)

Referensi Node

Setiap node grafik animasi berfungsi sebagai gerbang logika atau sumber data yang memproses data animasi sebelum mencapai rig karakter. Bagian ini memberikan rincian teknis tentang blok fungsional di dalam Editor Grafik Animasi. Semua node saat ini menghasilkan pose animasi.

Setiap bagian node mencakup:

  • Definisi – Ringkasan tentang tujuan dan peran node di dalam grafik.
  • Input – Aliran data yang masuk ke node. Beberapa input direpresentasikan sebagai Input1, Input2, ..., InputN.
  • Properti Input – Pengaturan yang terkait langsung dengan input tertentu (input Idle yang ditugaskan ke Posisi 0.5 pada node Blend1D).
  • Data Acara – Acara yang dipancarkan atau dikonsumsi oleh node untuk memicu logika grafik internal atau skrip Luau eksternal. Perilaku ini mungkin berubah selama pengembangan beta.

Aturan acara global

Untuk semua node dan transisi, aturan berikut berlaku secara default:

  • Acara menyebar ke atas dari node sumber mereka melalui grafik. Setiap acara membawa bobot yang mewakili pengaruh sumbernya dalam campuran akhir. Jika bobot mencapai nol pada titik mana pun, acara tersebut dibungkam.
  • Node tanpa logika acara kustom melewatkan semua acara tanpa diubah; node yang mencampur atau memilih antara input mungkin menskalakan bobot atau memblokir acara dari input non-primer (lihat bagian Acara per-node).
  • Acara penanda yang mencapai bagian atas grafik dapat diamati melalui AnimationTrack:GetMarkerReachedSignal().

Klip

Node Klip

Referensi ke asset AnimationClip. Ini berfungsi sebagai node daun dalam grafik, menghasilkan data animasi mentah yang memberi umpan ke node lain untuk pencampuran, pemilihan, atau modifikasi.

Input
  • Tidak ada
Properti
PropertiTipeDeskripsi
KlipID AssetAsset animasi yang akan diputar (misalnya rbxassetid://12345).
ModePutarEnum.AnimationNodePlayMode

Mendefinisikan perilaku klip ketika mencapai akhir durasinya.

  • Loop (default): Secara otomatis memulai ulang dari awal setelah klip selesai.
  • PingPong: Memutar dari awal ke akhir, kemudian segera memutar mundur dari akhir ke awal.
  • SekaliDanTahan: Memutar sekali dan mempertahankan pose akhir setelah selesai.
  • SekaliDanReset: Memutar sekali dan kembali ke pose awal setelah selesai.
MundurBooleanMengontrol arah pemutaran.
KecepatanNumberPembagi untuk laju pemutaran. 0.0 menjeda grafik, 1.0 adalah kecepatan normal, dan 2.0 adalah kecepatan dua kali lipat.
TrimBooleanMenetapkan apakah durasi klip harus dipotong.
TrimStartNumberCap waktu absolut (dalam detik) tempat pemutaran harus dimulai.
TrimEndNumberCap waktu absolut (dalam detik) tempat pemuturan harus dihentikan.
Data acara
  • Penanganan Acara: Tidak ada. Ini adalah node daun tanpa anak.
  • Pancaran Acara: Membaca marker kustom yang disematkan dalam klip animasi (misalnya, "Langkah Kaki", "Ayunan Senjata") dan mengeluarkannya sebagai acara bernama pada bingkai tepat tempat itu terjadi. Jika klip dipotong, hanya marker dalam interval yang didefinisikan [TrimStart, TrimEnd] (inklusif) yang dipancarkan.

Pilih

Node Pilih

Memilih antara sejumlah input melalui properti Pilihan. Setiap kali pilihan saat ini berubah, ini memicu transisi baru.

Input
  • Input1...InputN
Properti
PropertiTipeDeskripsi
PilihanStringID unik dari input yang akan dipilih, yang cocok dengan nama koneksi input (misalnya, "Berjalan").
Data acara
  • Penanganan Acara: Acara dari input terpilih saat ini melewati tanpa bobot mereka diubah.
  • Pancaran Acara: Memancarkan semua acara dari input terpilih saat ini saja. Selama transisi, pancaran acara mengikuti aturan acara global.

PrioritasPilih

Node Prioritas Pilih

Menilai daftar input yang terhubung dari atas ke bawah dan memutar yang pertama yang kondisinya dinilai sebagai benar. Ini memungkinkan pemilihan animasi hierarkis berdasarkan logika tertentu. Setiap kali pilihan saat ini berubah, ini memicu transisi baru.

Input
  • Input1...InputN
    • Pemicu (Boolean): Sebuah kondisi logis yang harus benar untuk input ini diaktifkan. Dalam versi saat ini, ini terhubung ke parameter boolean.
    • DapatInterupsi (Enum.AnimationNodeInterruptible): Mendefinisikan aturan kapan animasi aktif ini dapat diinterupsi oleh input prioritas lebih tinggi.
      • Selalu (default): Input dapat diinterupsi kapan saja oleh kondisi prioritas lebih tinggi.
      • Selesai: Animasi saat ini harus menyelesaikan pemutarannya sebelum input prioritas lebih tinggi dapat mengambil alih.
      • Pemicu: Input hanya dapat diinterupsi saat InterruptibleTrigger diatur ke true.
    • InterruptibleTrigger (Boolean): Hanya tersedia jika DapatInterupsi diatur ke Pemicu. Input dapat diinterupsi ketika ekspresi khusus ini benar.
Properti
PropertiTipeDeskripsi
DefaultInterruptibleEnum.AnimationNodeInterruptibleAturan interupsi dasar yang diterapkan pada semua input. Setiap input dapat menimpa ini dengan properti input DapatInterupsi miliknya sendiri.
DefaultInterruptibleTriggerBooleanNilai pemicu dasar yang digunakan ketika mode DapatInterupsi dari suatu input diselesaikan menjadi Pemicu. Setiap input dapat menimpa ini dengan properti input InterruptibleTrigger miliknya sendiri.
Data acara
  • Penanganan Acara: Acara dari input terpilih saat ini melewati tanpa bobot mereka diubah.
  • Pancaran Acara: Memancarkan semua acara dari input terpilih saat ini saja. Selama transisi, pancaran acara mengikuti aturan acara global.

Urutan

Node Urutan

Mengaktifkan input-input terhubung dalam urutan tertentu berdasarkan kondisi tunggu yang ditentukan. Setiap kali pilihan saat ini berubah, ini memicu transisi baru.

Input
  • Input1...InputN
    • TungguUntuk (Enum.AnimationNodeWaitFor): Menentukan kondisi yang harus terpenuhi sebelum urutan melanjutkan ke input berikutnya.
      • Selesai (default): Melanjutkan ke input berikutnya ketika input terkini menyelesaikan satu siklus. Perilaku kemajuan tergantung pada input yang terhubung:
        • Klip putar sekali: Melanjutkan saat klip selesai.
        • Klip looping: Melanjutkan setelah satu putaran penuh selesai.
        • Urutan dengan looping tak terbatas: Melanjutkan setelah satu siklus penuh melalui semua input.
        • Urutan dengan looping tak terbatas: Melanjutkan setelah semua looping selesai.
      • Pemicu: Mengaktifkan input berikutnya ketika ekspresi logis kustom dinilai sebagai benar.
    • TungguUntukPemicu (Boolean): Hanya tersedia saat TungguUntuk diatur menjadi Pemicu.
Properti
PropertiTipeDeskripsi
LoopCountNumberJumlah kali untuk berputar melalui seluruh urutan (default adalah 1). Nilai 0 menunjukkan pengulangan tak terbatas. Setelah jumlah tercapai, node menghormati pengaturan looping atau tahan dari input terakhir.
DefaultWaitForEnum.AnimationNodeWaitForAturan tunggu dasar yang diterapkan pada semua input. Setiap input dapat menimpa ini dengan properti input TungguUntuk miliknya sendiri.
Data acara
  • Penanganan Acara: Acara dari input aktif saat ini melewati tanpa bobot mereka diubah.
  • Pancaran Acara: Memancarkan semua acara dari input aktif saat ini dalam urutan saja. Selama transisi, pancaran acara mengikuti aturan acara global.

UrutanAcak

Node Urutan Acak

Memilih dan memutar salah satu inputnya yang terhubung secara acak. Ketika animasi yang dipilih saat ini selesai, node secara acak memilih input lain untuk diputar. Tetapkan setiap input bobot tertentu untuk memengaruhi kemungkinan dipilih. Setiap kali pilihan saat ini berubah, ini memicu transisi baru.

Input
  • Input1...InputN
    • Bobot (Number): Menentukan probabilitas input ini dipilih; bobot yang lebih tinggi meningkatkan peluang pemilihan.
Properti
PropertiTipeDeskripsi
PlayCountNumberJumlah input yang akan diputar oleh node sebelum berhenti. Setelah tercapai, node menghormati pengaturan looping atau tahan dari input terakhir. Default 0 untuk tak terbatas
SeedNumberSebuah nilai yang digunakan untuk menginisialisasi Random Number Generator (RNG), memastikan urutan tetap konsisten di seluruh klien yang berbeda. Default -1 untuk Seed acak.
Data acara
  • Penanganan Acara: Acara dari input aktif saat ini melewati tanpa bobot mereka diubah.
  • Pancaran Acara: Memancarkan semua acara dari input aktif saat ini dalam urutan saja. Selama transisi, pancaran acara mengikuti aturan acara global.

Atas

Node Atas

Menumpuk pose Atas di atas pose Dasar. Ketika digabungkan dengan node Mask, sendi-sendhi yang dimask-out dalam pose Atas memperlihatkan pose Dasar sepenuhnya, menciptakan efek overlay transparan.

Input
  • Dasar: Latar belakang atau lapisan bawah, biasanya animasi tubuh penuh seperti locomotion atau keadaan idle.
  • Atas: Lapisan depan yang akan diterapkan di atas dasar, seperti gestur tangan atau animasi penggunaan alat.
Properti
PropertiTipeDeskripsi
BobotNumberBobot pencampuran yang digunakan untuk mengurangi pose Atas. Default 1.0 (penggantian penuh) dan tidak dibatasi.
Data acara
  • Penanganan Acara:
    • Node mendengarkan acara dari kedua input Dasar dan Atas.
  • Pancaran Acara:
    • Acara Dasar: Semua acara dari input Dasar diteruskan tanpa modifikasi.
    • Acara Atas: Acara dari input Atas diskalakan oleh properti Bobot.
      • Pada Bobot 0.5, acara Atas menyebar dengan bobot setengah
      • Pada Bobot 0, mereka dibungkam.

Tambah

Node Tambah

Menambahkan pose Aditif ke pose Dasar, dikurangi oleh Bobot tertentu (tidak dibatasi).

Input
  • Dasar: Pose animasi utama.
  • Aditif: Pose yang akan dilapis di atas dasar.
Properti
PropertiTipeDeskripsi
BobotNumberMenentukan kekuatan pose aditif yang diterapkan pada yang dasar.
Data acara
  • Penanganan Acara: Node mendengarkan acara dari kedua input Dasar dan Aditif.
  • Pancaran Acara: Semua acara dari kedua input Dasar dan Aditif diteruskan tanpa modifikasi.

Kurangkan

Node Kurangkan

Mengubah animasi menjadi pose aditif dengan mengurangi pose dasar relatif dari target pose (ABA - B). Hasilnya dikurangi oleh Bobot tertentu (tidak dibatasi).

Input
  • A: Pose animasi target.
  • B: Pose dasar relatif yang akan dikurangi.
Properti
PropertiTipeDeskripsi
BobotNumberMenentukan kekuatan efek pengurangan yang diterapkan pada hasil.
Data acara
  • Penanganan Acara: Node mendengarkan acara dari kedua Input A dan Input B.
  • Pancaran Acara: Semua acara dari kedua Input A dan Input B diteruskan tanpa modifikasi.

Campuran1D

Node Campuran1D

Menginterpolasi secara linier antara dua pose animasi terdekat dengan posisi input saat ini di satu sumbu.

Input
  • Input1...InputN
    • Posisi (Number): Koordinat spesifik untuk setiap input berikutnya di sumbu campuran.
Properti
PropertiTipeDeskripsi
PosisiNumberNilai aktif saat ini di sumbu campuran yang digunakan untuk mengambil sampel animasi. Jika Posisi di luar rentang posisi input yang didefinisikan, node memperkirakan menggunakan dua input terdekat.
PhaseSyncEnum.AnimationNodePhaseSync

Mengonfigurasi apakah waktu dari anak input harus disinkronkan.

  • Disinkronisasi (default): Sinkronisasi dinormalisasi. Node menghitung "durasi virtual" berdasarkan rata-rata bobot dari input aktif. Langkah waktu dari setiap node input disesuaikan sehingga semua anak berkumpul pada fase yang sama, menjaga animasi dengan panjang berbeda dalam kekompakan.
  • Tidak Disinkronisasi: Pencampuran standar di mana klip maju secara mandiri pada laju putar mereka sendiri.
Data acara
  • Penanganan Acara: Node mendengarkan acara dari semua node anak yang aktif saat ini.
  • Pancaran Acara: Hanya acara dari input aktif tertinggi yang menyebar, diskalakan oleh bobot campurannya. Acara dari input sekunder dibungkam.

Campuran2D

Node Campuran2D

Mencampur beberapa pose animasi bersama-sama berdasarkan dua parameter input dalam ruang koordinat 2D. Ini menggeneralisasi node Campuran1D untuk menangani skenario kompleks, seperti pencampuran berdasarkan arah gerakan dan kecepatan secara bersamaan.

Input
  • Input1...InputN
    • X (Number): Koordinat X untuk setiap input berikutnya.
    • Y (Number): Koordinat Y untuk setiap input berikutnya.
Properti
PropertiTipeDeskripsi
ModeInputEnum.AnimationNodeBlend2DInputMode

Mendefinisikan sistem koordinat yang digunakan untuk mengevaluasi ruang campuran:

  • Kartesius (default): Menggunakan koordinat grid 2D standar. X dan Y mewakili posisi saat ini dalam ruang campuran.
  • Polar: Menggunakan nilai sudut dan magnitudo. X mewakili arah dalam radian, sedangkan Y mewakili magnitudo atau kekuatan gerakan. Arah lebih berat daripada magnitudo, sehingga input pada sudut yang mirip tetapi dengan magnitudo yang berbeda mencampur lebih halus daripada input pada sudut berbeda.
XNumberKoordinat X saat ini (Kartesius) atau Arah dalam radian (Polar).
YNumberKoordinat Y saat ini (Kartesius) atau Magnitudo (Polar).
PhaseSyncEnum.AnimationNodePhaseSync

Mengonfigurasi apakah waktu dari anak input harus disinkronkan.

  • Disinkronisasi (default): Sinkronisasi dinormalisasi. Node menghitung "durasi virtual" berdasarkan rata-rata bobot dari input yang aktif. Langkah waktu dari setiap node input disesuaikan sehingga semua anak berkumpul pada fase yang sama, menjaga animasi dengan panjang berbeda dalam kekompakan.
  • Tidak Disinkronisasi: Pencampuran standar di mana klip maju secara mandiri pada laju putar mereka sendiri.
Data acara
  • Penanganan Acara: Node mendengarkan acara dari semua node anak yang aktif saat ini.
  • Pancaran Acara: Hanya acara dari input aktif tertinggi yang menyebar, diskalakan oleh bobot campurannya. Acara dari input sekunder dibungkam.

Masker

Node Masker

Menerapkan masker yang telah ditentukan untuk input Pose. Sebuah masker didefinisikan oleh bobot per objek (misalnya sendi) dalam hierarki rig, memungkinkan kontrol yang tepat atau "bulatan" pada animasi.

Input
  • Pose: Pose animasi yang akan dimasker.
Properti
PropertiTipeDeskripsi
MaskerObjectValue

Sebuah ObjectValue (dibuat sebagai anak langsung dari Definisi AnimationNode Mask) yang mendefinisikan bobot masker. Ini dapat berfungsi dengan salah satu dari dua cara:

  • Langsung: ObjectValue itu sendiri berisi atribut yang memetakan nama objek rig ke nilai bobot tertentu.
  • Dengan Referensi: ObjectValue mereferensikan Instance lain yang berisi atribut pemetaan. Ini memungkinkan berbagi masker di seluruh node yang berbeda dalam grafik.

Saat membuat masker, Anda dapat memilih skema rig (HumanoidRigDescription atau Pemilih) untuk mengisi hierarki.

  • HumanoidRigDescription: Menstandarkan masker untuk karakter humanoid.
  • Pemilih: Memungkinkan pengguna memilih rig tertentu di workspace untuk mengisi hierarki masker.
BalikBooleanKetika benar, menerapkan nilai bobot sebagai 1 - bobot. Ini memungkinkan penggunaan masker secara terbalik tanpa membuat aset baru.
Data acara
  • Penanganan Acara: Node mendengarkan semua acara dari input Pose.
  • Pancaran Acara: Semua acara dari input Pose diteruskan tanpa modifikasi.

Kecepatan

Node Kecepatan

Memodifikasi laju pemutaran dari pose animasi yang masuk.

Input
  • Pose: Pose animasi atau subgrafik yang kecepatannya akan dimodifikasi.
Properti
PropertiTipeDeskripsi
KecepatanNumberPembagi yang diterapkan pada delta waktu (dtdt). 0.0 menjeda grafik, 1.0 adalah kecepatan normal, dan 2.0 adalah kecepatan dua kali lipat.
Data acara
  • Penanganan Acara: Node mendengarkan acara dari input Pose.
  • Pancaran Acara: Semua acara dari input Pose diteruskan tanpa modifikasi. Perlu dicatat bahwa meskipun kecepatan pemutaran visual berubah, waktu acara yang dipancarkan (seperti marker) akan disesuaikan dengan laju pemutaran yang dimodifikasi.

OutputGrafik

Node OutputGrafik

Mewakili pose akhir yang dievaluasi dari grafik. Node ini otomatis disertakan di semua grafik baru dalam Editor Grafik Animasi. Kehadirannya memastikan bahwa grafik selalu valid dan secara konsisten menghasilkan pose animasi.

Input
  • Pose: Data animasi yang telah diproses terakhir untuk diterapkan pada rig.
Properti
  • Tidak ada
Data acara
  • Penanganan Acara: Node mendengarkan semua acara yang diteruskan melalui input akhir yang terhubung.
  • Pancaran Acara: Node ini berfungsi sebagai titik keluar untuk jalur animasi dan tidak memancarkan sinyal kembali ke grafik.

Transisi

Beberapa node dalam Grafik Animasi (seperti Pilih, Pilih Prioritas, Urutan, dan Urutan Acak) mengelola bagaimana animasi bercampur saat beralih antara input aktif. Untuk mencegah redundansi dalam referensi node, perilaku ini didefinisikan oleh kelompok properti transisi yang distandarisasi.

Transisi Default

Transisi Default

Perilaku pencampuran dasar yang diterapkan pada node setiap kali beralih ke input aktif baru.

Opsi transisi

Opsi transisi

Properti tautan spesifik input yang mengesampingkan transisi default. Ini diterapkan ketika node bertransisi ke input tertentu tersebut.

Replikasi

Parameter grafik animasi bersifat lokal untuk setiap AnimationTrack dan tidak secara otomatis direplikasi. Ini mungkin berubah dalam pembaruan mendatang, tetapi pendekatan yang direkomendasikan saat ini menggunakan:

  • Klien → Server: Sebuah RemoteEvent untuk mengirimkan parameter dari klien pemilik ke server pada laju tick tetap.
  • Server → Klien Lain: Atribut instance attributes yang otomatis direplikasi ke semua klien.

Karakter Pemain

Skrip klien menggerakkan karakter pemain. Karena hanya klien pemilik yang tahu status permainan saat ini (input gerakan, status humanoid, dll.), parameter harus mengalir dari klien pemilik ke server dan kemudian ke semua klien lainnya.

Pengaturan

Di bawah StarterCharacterScripts, buat:

  • Sebuah LocalScript untuk animasi sisi klien dan penggerak parameter.
  • Sebuah Script untuk replikasi sisi server.
  • Sebuah RemoteEvent untuk komunikasi klien-ke-server.

Skrip klien

Klien yang memiliki menggerakkan parameter dari acara permainan dan mengirimkannya ke server secara berkala. Klien lainnya membaca atribut yang direplikasi dari skrip server sebagai gantinya.


local Players = game:GetService("Players")
local RunService = game:GetService("RunService")
local character = script.Parent
local humanoid = character:WaitForChild("Humanoid")
local animator = humanoid:FindFirstChildOfClass("Animator") atau humanoid
-- Muat grafik animasi
local animation = Instance.new("Animation")
animation.AnimationId = "rbxassetid://YOUR_GRAPH_ID" -- Ganti dengan ID grafik Anda yang diterbitkan
local track = animator:LoadAnimation(animation)
track:Play()
local isLocalCharacter = Players:GetPlayerFromCharacter(character) == Players.LocalPlayer
if not isLocalCharacter then
-- Baca parameter yang direplikasi dari skrip server
local animateServer = script.Parent:WaitForChild("AnimateServer")
for attribute, value in animateServer:GetAttributes() do
track:SetParameter(attribute, value)
end
animateServer.AttributeChanged:Connect(function(attribute)
track:SetParameter(attribute, animateServer:GetAttribute(attribute))
end)
return
end
-- Pemain lokal: menggerakkan parameter dari permainan
local params = {}
local function setParam(key, value)
track:SetParameter(key, value)
params[key] = value
end
-- Contoh: menggerakkan parameter dari status humanoid
humanoid.Running:Connect(function(speed)
setParam("Kecepatan", speed)
setParam("Status", if speed < 0.1 then "Idle" else "Moving")
end)
-- Kirim parameter ke server pada laju tick tetap
local replicateEvent = script.Parent:WaitForChild("ReplicateEvent")
local TICK_RATE = 1 / 20
local lastSendTime = 0
RunService.Stepped:Connect(function(gameTime)
if gameTime - lastSendTime > TICK_RATE then
lastSendTime = gameTime
replicateEvent:FireServer(params)
end
end)

Skrip server

Menerima parameter dari klien pemilik, menggerakkan grafik animasi sisi server, dan menyebarkan nilai sebagai atribut untuk replikasi ke klien lainnya.


local Players = game:GetService("Players")
local character = script.Parent
local humanoid = character:WaitForChild("Humanoid")
local animator = humanoid:FindFirstChildOfClass("Animator") atau humanoid
-- Muat grafik animasi yang sama di server
local animation = Instance.new("Animation")
animation.AnimationId = "rbxassetid://YOUR_GRAPH_ID" -- ID grafik yang sama dengan klien
animation.Parent = script
local track = animator:LoadAnimation(animation)
track:Play()
-- Menerima parameter dari klien pemilik dan mereplikasi melalui atribut
local replicateEvent = script.Parent:WaitForChild("ReplicateEvent")
replicateEvent.OnServerEvent:Connect(function(player, params)
if Players:GetPlayerFromCharacter(character) ~= player then
return
end
for key, value in params do
track:SetParameter(key, value)
script:SetAttribute(key, value)
end
end)

NPC

Karena server memiliki animasi NPC, hanya replikasi server-ke-klien yang dibutuhkan. Gerakkan grafik animasi di server, tulis parameter sebagai atribut pada Skrip server, dan baca di klien menggunakan pola Instance.AttributeChanged yang sama seperti di atas.

Latensi

Klien lain melihat animasi dengan sedikit keterlambatan yang setara dengan interval tick (hingga 50 ms pada 20 Hz) ditambah latensi jaringan. Anda dapat mengurangi interval tick dengan meningkatkan frekuensi (seperti 1/30), dengan biaya lalu lintas jaringan yang lebih tinggi. 20 Hz adalah default yang wajar; pencampuran animasi cukup toleran sehingga keterlambatan kecil sulit untuk diperhatikan.

©2026 Roblox Corporation. Roblox, logo Roblox, dan Powering Imagination termasuk dalam merek dagang kami yang terdaftar dan tidak terdaftar di AS dan negara lainnya.