Trình chỉnh sửa đồ thị hoạt hình là một công cụ trực quan, dựa trên nút, cho phép các nghệ sĩ kỹ thuật và nhân viên hoạt hình xây dựng logic hoạt hình phức tạp trong Roblox Studio. Bằng cách cung cấp một giao diện hợp lý để tạo ra các hành vi như cây hòa trộn, nó loại bỏ sự phụ thuộc truyền thống vào lập trình thủ công cho chuyển động nhân vật.
Hệ thống này hoạt động song song với quy trình làm việc hoạt hình hiện tại của bạn:
- Trình chỉnh sửa hoạt hình: Tiếp tục sử dụng Trình chỉnh sửa hoạt hình như công cụ chính của bạn để viết từng đoạn clip và hoàn thiện các keyframes cũng như đường cong.
- Trình chỉnh sửa đồ thị hoạt hình: Sử dụng không gian làm việc mới này để lấy những clip đó và tổ chức chúng thành một cây logic để điều khiển những hành vi trò chơi tinh vi.
Được thiết kế để nâng cao sự hợp tác, đồ thị trực quan cho phép các nhà phát triển nhanh chóng kiểm tra, gỡ lỗi và hiểu các logic được tạo ra bởi các nhân viên hoạt hình. Trong khi các nghệ sĩ tập trung vào việc tinh chỉnh chuyển động tương tác, các nhà phát triển vẫn có thể truy cập các nút đồ thị hoạt hình một cách lập trình để kiểm soát trực tiếp các hoạt hình và trạng thái hòa trộn.
Xây dựng một đồ thị
Để bắt đầu xây dựng logic cho một nhân vật có thể hoạt hình, truy cập trình chỉnh sửa đồ thị hoạt hình qua thẻ Avatar trong thanh Ribbon của Studio. Các bước sau đây minh họa cách khởi tạo một rig và xây dựng một mạng lưới nút cơ bản sử dụng các hoạt hình đi bộ và vẫy tay mặc định.
Để đi sâu vào các ứng dụng thực tiễn, bạn có thể khám phá Tập tin tham khảo đồ thị hoạt hình, chứa các ví dụ từ cơ bản đến phức tạp.
Để tạo đồ thị hoạt hình của riêng bạn, tương tự như ví dụ cơ bản được cung cấp trong tài liệu tham khảo, hãy sử dụng các bước sau:
Trong Studio, thêm một rig có thể hoạt hình bằng cách điều hướng đến thẻ Avatar và chọn Nhân vật ⟩ My Avatar.

Mở trình chỉnh sửa đồ thị hoạt hình bằng cách điều hướng đến Trình chỉnh sửa đồ thị trong thẻ Avatar.

Chọn rig có thể hoạt hình trong vùng nhìn 3D và chọn Tạo đồ thị.
Trong trình chỉnh sửa đồ thị, nhấp chuột phải và chọn Clip.

Trong nút clip mới, đặt ID hoạt hình.
Chọn dropdown Animation ID.
Để gửi một ID tài sản hoạt hình cụ thể, nhấp vào Nhập khẩu.

Trong trường Animation ID, thêm hoạt hình đi bộ mặc định: 507777826.
Chọn Nhập.
Thêm một nút clip khác bằng cách lặp lại các bước 4-5 sử dụng hoạt hình vẫy tay mặc định: 507770239.

Trong trình chỉnh sửa đồ thị, nhấp chuột phải và chọn Thêm.

Kết nối các nút Clip đến nút Add bằng cách kéo đầu nối đầu ra ngay phía trên bên phải đến cổng thích hợp:
- Kết nối nút Clip với hoạt hình đi bộ đến cổng Cơ sở.
- Kết nối nút Clip với hoạt hình vẫy tay đến cổng Additive.

Từ nút Add, kết nối đầu nối đầu ra ngay phía trên bên phải đến cổng đầu ra đồ thị Pose.

(Tùy chọn) Gán một tham số cho biến Speed của bạn.
Nhấp và kéo cổng Speed màu xanh lá cây đến một khu vực trống. Một nút tham số mới sẽ hiển thị.

Ở phía trên bên trái của trình chỉnh sửa đồ thị, sử dụng bảng tham số để nhanh chóng chỉnh sửa các tham số trong nút của bạn. Bạn cũng có thể truy cập điều này một cách lập trình.

Kiểm tra hoạt hình bằng cách nhấn nút phát.

Hãy thử kiểm tra các trọng số khác nhau, tốc độ, chế độ phát và các hoạt hình khác. Để biết thêm thông tin về các nút riêng lẻ, xem Tham chiếu nút.
Tích hợp API
Việc tạo và triển khai một đồ thị hoạt hình tuân theo quy trình hoạt hình tiêu chuẩn của Roblox. Sau khi chọn một rig trong trình chỉnh sửa đồ thị hoạt hình, một tài sản AnimationGraphDefinition mới sẽ được tạo. Tài sản này phục vụ như là nơi chứa các nút, kết nối và tham số của bạn. Khi logic của bạn đã được hoàn thiện, bạn xuất bản đồ thị để nhận một ID tài sản tiêu chuẩn.
Trong các tập lệnh của bạn, bạn tương tác với những đồ thị này bằng cách tải chúng lên Animator như bạn sẽ làm với một hoạt hình truyền thống. Để điều khiển logic bên trong của đồ thị, hãy sử dụng AnimationTrack:SetParameter() để truyền các giá trị thời gian thực—như tốc độ di chuyển hoặc các biến trạng thái—trực tiếp vào các biến của đồ thị.
local animation = Instance.new("Animation")
animation.AnimationId = "rbxassetid://123456789" -- ID đồ thị đã được xuất bản của bạn
local animationTrack = animator:LoadAnimation(animation)
animationTrack:Play()
-- Cập nhật tham số động qua RunService
game:GetService("RunService").Stepped:Connect(function(_, dt)
local currentSpeed = humanoidRootPart.AssemblyLinearVelocity.Magnitude
animationTrack:SetParameter("humanoidSpeed", currentSpeed)
end)
Tham chiếu nút
Mỗi nút trong đồ thị hoạt hình đóng vai trò như một cổng logic hoặc nguồn dữ liệu xử lý dữ liệu hoạt hình trước khi đến với rig nhân vật. Phần này cung cấp một phân tích kỹ thuật về các khối chức năng bên trong trình chỉnh sửa đồ thị hoạt hình. Tất cả các nút hiện tại đều xuất ra một tư thế hoạt hình.
Mỗi phần nút bao gồm:
- Định nghĩa – Một tóm tắt về mục đích và vai trò của nút trong đồ thị.
- Đầu vào – Các dòng dữ liệu vào nút. Các đầu vào nhiều được biểu diễn như Input1, Input2, ..., InputN.
- Thuộc tính đầu vào – Các cài đặt gắn trực tiếp với một đầu vào cụ thể (một đầu vào Idle gán cho Vị trí 0.5 trên nút Blend1D).
- Dữ liệu sự kiện – Các sự kiện được phát ra hoặc tiêu thụ bởi nút để kích hoạt logic bên trong đồ thị hoặc các tập lệnh Luau bên ngoài. Hành vi này có thể thay đổi trong suốt quá trình phát triển beta.
Quy tắc sự kiện toàn cầu
Đối với tất cả các nút và chuyển tiếp, các quy tắc sau áp dụng theo mặc định:
- Các sự kiện lan truyền lên trên từ nút nguồn của chúng qua đồ thị. Mỗi sự kiện mang một trọng số đại diện cho ảnh hưởng của nguồn trong sự hòa trộn cuối cùng. Nếu trọng số đạt 0 ở bất kỳ điểm nào, sự kiện sẽ bị tắt tiếng.
- Các nút không có logic sự kiện tùy chỉnh sẽ truyền tất cả các sự kiện qua mà không thay đổi; các nút hòa trộn hoặc lựa chọn giữa các đầu vào có thể điều chỉnh trọng số hoặc chặn sự kiện từ các đầu vào không chính (xem phần Sự kiện từng nút).
- Các sự kiện Marker mà lên đến đỉnh đồ thị có thể được quan sát qua AnimationTrack:GetMarkerReachedSignal().
Clip

Một tham chiếu đến một tài sản AnimationClip. Điều này phục vụ như một nút lá trong đồ thị, tạo ra dữ liệu hoạt hình thô để cung cấp cho các nút khác để hòa trộn, lựa chọn hoặc sửa đổi.
- Đầu vào
- Không
- Thuộc tính
Thuộc tính Loại Mô tả Clip ID tài sản Tài sản hoạt hình cần phát (ví dụ: rbxassetid://12345). PlayMode Enum.AnimationNodePlayMode Xác định hành vi của clip khi đã đến cuối thời gian của nó.
- Lặp lại (mặc định): Tự động khởi động lại từ đầu khi clip hoàn thành.
- PingPong: Phát từ đầu đến cuối, sau đó ngay lập tức phát ngược lại từ cuối đến đầu.
- Một lần và giữ: Phát một lần và duy trì tư thế cuối cùng khi hoàn thành.
- Một lần và đặt lại: Phát một lần và quay lại tư thế khởi đầu khi hoàn thành.
Reverse Boolean Kiểm soát hướng phát lại. Speed Số Một hệ số nhân cho tốc độ phát lại. 0.0 tạm dừng đồ thị, 1.0 là tốc độ bình thường và 2.0 là tốc độ gấp đôi. Trim Boolean Bật tắt xem thời gian của clip có nên được cắt ngắn hay không. TrimStart Số Dấu thời gian tuyệt đối (tính bằng giây) nơi phát lại nên bắt đầu. TrimEnd Số Dấu thời gian tuyệt đối (tính bằng giây) nơi phát lại nên dừng lại. - Dữ liệu sự kiện
- Xử lý sự kiện: Không có. Đây là một nút lá không có con.
- Phát ra sự kiện: Đọc các marker tùy chỉnh được nhúng trong clip hoạt hình (ví dụ: "Bước chân", "Vung vũ khí") và phát chúng như các sự kiện được đặt tên tại đúng khung mà chúng xảy ra. Nếu clip bị cắt, chỉ có các marker trong khoảng thời gian đã xác định [TrimStart, TrimEnd] (bao gồm) mới được phát ra.
Select

Chọn giữa bất kỳ số đầu vào nào thông qua thuộc tính Selection. Mỗi khi lựa chọn hiện tại thay đổi, nó sẽ kích hoạt một chuyển tiếp mới.
- Đầu vào
- Input1...InputN
- Thuộc tính
Thuộc tính Loại Mô tả Selection Chuỗi ID duy nhất của đầu vào cần được chọn, khớp với tên của kết nối đầu vào (ví dụ: "Walk"). - Dữ liệu sự kiện
- Xử lý sự kiện: Các sự kiện từ đầu vào đang chọn hiện tại sẽ được truyền qua với trọng số không thay đổi.
- Phát ra sự kiện: Chỉ truyền qua tất cả các sự kiện từ đầu vào đang chọn hiện tại. Trong một chuyển tiếp, phát ra sự kiện theo quy tắc sự kiện toàn cầu.
PrioritySelect

Đánh giá danh sách các đầu vào đã kết nối từ trên xuống dưới và phát đầu vào đầu tiên mà điều kiện của nó đánh giá là đúng. Điều này cho phép lựa chọn hoạt hình thứ bậc dựa trên logic cụ thể. Mỗi khi lựa chọn hiện tại thay đổi, nó sẽ kích hoạt một chuyển tiếp mới.
- Đầu vào
- Input1...InputN
- Trigger (Boolean): Một điều kiện logic phải đúng để đầu vào này có thể kích hoạt. Trong các phiên bản hiện tại, điều này được kết nối với một tham số boolean.
- Interruptible (Enum.AnimationNodeInterruptible): Xác định quy tắc cho khi hoạt hình đang hoạt động này có thể bị ngắt bởi một đầu vào có ưu tiên cao hơn.
- Luôn luôn (mặc định): Đầu vào có thể bị ngắt bất cứ lúc nào bởi một điều kiện ưu tiên cao hơn.
- Hoàn thành: Hoạt hình hiện tại phải hoàn thành phát lại trước khi một đầu vào ưu tiên cao hơn có thể chiếm quyền.
- Kích hoạt: Đầu vào chỉ có thể bị ngắt khi InterruptibleTrigger được đặt thành true.
- InterruptibleTrigger (Boolean): Chỉ có sẵn nếu Interruptible được đặt thành Kích hoạt. Đầu vào có thể bị ngắt khi biểu thức cụ thể này là đúng.
- Thuộc tính
Thuộc tính Loại Mô tả DefaultInterruptible Enum.AnimationNodeInterruptible Quy tắc ngắt tối thiểu áp dụng cho tất cả các đầu vào. Mỗi đầu vào có thể ghi đè điều này với thuộc tính đầu vào Interruptible riêng của nó. DefaultInterruptibleTrigger Boolean Giá trị kích hoạt cơ bản được sử dụng khi chế độ Interruptible đã được xác định là Kích hoạt. Mỗi đầu vào có thể ghi đè điều này với thuộc tính đầu vào InterruptibleTrigger riêng của nó. - Dữ liệu sự kiện
- Xử lý sự kiện: Các sự kiện từ đầu vào đang chọn hiện tại sẽ được truyền qua với trọng số không thay đổi.
- Phát ra sự kiện: Chỉ truyền qua tất cả các sự kiện từ đầu vào đang chọn hiện tại. Trong một chuyển tiếp, phát ra sự kiện theo quy tắc sự kiện toàn cầu.
Sequence

Kích hoạt các đầu vào được kết nối theo một thứ tự tuần tự cụ thể dựa trên các điều kiện đợi đã xác định. Mỗi khi lựa chọn hiện tại thay đổi, nó sẽ kích hoạt một chuyển tiếp mới.
- Đầu vào
- Input1...InputN
- WaitFor (Enum.AnimationNodeWaitFor): Xác định điều kiện phải được đáp ứng trước khi chuỗi tiến tới đầu vào tiếp theo.
- Hoàn thành (mặc định): Tiến tới đầu vào tiếp theo khi đầu vào hiện tại hoàn thành một chu kỳ. Hành vi tiến bộ phụ thuộc vào đầu vào đã kết nối:
- Clip phát một lần: Tiến lên khi clip hoàn thành.
- Clip lặp lại: Tiến lên sau khi một vòng lặp hoàn chỉnh hoàn tất.
- Chuỗi với các vòng lặp vô hạn: Tiến lên sau khi một chu kỳ hoàn chỉnh qua tất cả các đầu vào.
- Chuỗi với các vòng lặp vô hạn: Tiến lên sau khi các vòng lặp hoàn tất.
- Kích hoạt: Kích hoạt đầu vào tiếp theo khi một biểu thức logic tùy chỉnh đánh giá là đúng.
- WaitForTrigger (Boolean): Chỉ có sẵn khi WaitFor được đặt thành Kích hoạt.
- Thuộc tính
Thuộc tính Loại Mô tả LoopCount Số Số lần để lặp qua toàn bộ chuỗi (mặc định là 1). Giá trị 0 chỉ ra một vòng lặp vô hạn. Khi số đếm đã đạt, nút sẽ tuân thủ cài đặt lặp lại hoặc giữ của đầu vào cuối cùng. DefaultWaitFor Enum.AnimationNodeWaitFor Điều kiện đợi cơ bản áp dụng cho tất cả các đầu vào. Mỗi đầu vào có thể ghi đè điều này với thuộc tính đầu vào WaitFor riêng của nó. - Dữ liệu sự kiện
- Xử lý sự kiện: Các sự kiện từ đầu vào đang hoạt động hiện tại sẽ được truyền qua với trọng số không thay đổi.
- Phát ra sự kiện: Chỉ truyền qua tất cả các sự kiện từ đầu vào đang hoạt động hiện tại trong chuỗi. Trong một chuyển tiếp, phát ra sự kiện theo quy tắc sự kiện toàn cầu.
RandomSequence

Chọn và phát một trong các đầu vào được kết nối một cách ngẫu nhiên. Khi hoạt hình hiện tại được chọn hoàn thành, nút sẽ ngẫu nhiên chọn một đầu vào khác để phát. Gán mỗi đầu vào một trọng số cụ thể để ảnh hưởng đến xác suất nó được chọn. Mỗi khi lựa chọn hiện tại thay đổi, nó sẽ kích hoạt một chuyển tiếp mới.
- Đầu vào
- Input1...InputN
- Weight (Số): Xác định xác suất đầu vào này được chọn; trọng số cao hơn làm tăng khả năng được chọn.
- Thuộc tính
Thuộc tính Loại Mô tả PlayCount Số Số lượng đầu vào mà nút sẽ phát trước khi dừng. Khi đạt tới, nút sẽ tuân thủ cài đặt lặp lại hoặc giữ của đầu vào cuối cùng. Mặc định là 0 để vô hạn Seed Số Một giá trị được sử dụng để khởi tạo Bộ phát sinh số ngẫu nhiên (RNG), đảm bảo chuỗi vẫn nhất quán giữa các khách hàng khác nhau. Mặc định là -1 cho hạt giống ngẫu nhiên. - Dữ liệu sự kiện
- Xử lý sự kiện: Các sự kiện từ đầu vào đang hoạt động hiện tại sẽ được truyền qua với trọng số không thay đổi.
- Phát ra sự kiện: Chỉ truyền qua tất cả các sự kiện từ đầu vào đang hoạt động hiện tại trong chuỗi. Trong một chuyển tiếp, phát ra sự kiện theo quy tắc sự kiện toàn cầu.
Over

Lớp tư thế Over trên tư thế Cơ sở. Khi kết hợp với một nút Mask, các khớp bị ẩn trong tư thế Over sẽ làm lộ hoàn toàn tư thế Base, tạo ra hiệu ứng chồng lớp trong suốt.
- Đầu vào
- Base: Lớp nền hoặc lớp dưới cùng, thường là hoạt hình toàn cơ thể như chuyển động hoặc trạng thái tĩnh.
- Over: Lớp phía trước hoặc lớp trên được áp dụng lên cơ sở, chẳng hạn như hoạt hình cử chỉ tay hoặc sử dụng công cụ.
- Thuộc tính
Thuộc tính Loại Mô tả Weight Số Trọng số hòa trộn được sử dụng để giảm mức độ tư thế Over. Mặc định là 1.0 (quyền ưu tiên hoàn toàn) và không bị giới hạn. - Dữ liệu sự kiện
- Xử lý sự kiện:
- Nút lắng nghe các sự kiện từ cả đầu vào Base và Over.
- Phát ra sự kiện:
- Sự kiện cơ sở: Tất cả các sự kiện từ đầu vào cơ sở sẽ được truyền qua mà không thay đổi.
- Sự kiện Over: Các sự kiện từ đầu vào Over sẽ được điều chỉnh theo thuộc tính Chỉ số.
- Tại trọng số 0.5, các sự kiện Over sẽ lan truyền với trọng số một nửa
- Tại trọng số 0, chúng sẽ bị tắt tiếng.
Add

Thêm tư thế Additive vào tư thế Base, giảm đi bởi một Weight cụ thể (không giới hạn).
- Đầu vào
- Base: Tư thế hoạt hình chính.
- Additive: Tư thế sẽ được lớp lên cơ sở.
- Thuộc tính
Thuộc tính Loại Mô tả Weight Số Xác định sức mạnh của tư thế thêm được áp dụng lên cơ sở. - Dữ liệu sự kiện
- Xử lý sự kiện: Nút lắng nghe các sự kiện từ cả đầu vào Base và Additive.
- Phát ra sự kiện: Tất cả các sự kiện từ cả đầu vào cơ sở và đầu vào thêm đều được truyền qua mà không thay đổi.
Subtract

Chuyển đổi một hoạt hình thành một tư thế thêm bằng cách trừ một tư thế cơ sở tương đối ra khỏi tư thế mục tiêu (). Kết quả sẽ được giảm đi bởi một Weight cụ thể (không giới hạn).
- Đầu vào
- A: Tư thế hoạt hình mục tiêu.
- B: Tư thế cơ sở tương đối sẽ được trừ.
- Thuộc tính
Thuộc tính Loại Mô tả Weight Số Xác định sức mạnh của hiệu ứng trừ áp dụng lên kết quả. - Dữ liệu sự kiện
- Xử lý sự kiện: Nút lắng nghe các sự kiện từ cả Input A và Input B.
- Phát ra sự kiện: Tất cả các sự kiện từ cả Input A và Input B đều được truyền qua mà không thay đổi.
Blend1D

Nội suy tuyến tính giữa hai tư thế hoạt hình gần nhất với vị trí đầu vào hiện tại trên một trục duy nhất.
- Đầu vào
- Input1...InputN
- Position (Số): Tọa độ cụ thể cho mỗi đầu vào tiếp theo trên trục hòa trộn.
- Thuộc tính
Thuộc tính Loại Mô tả Position Số Giá trị hiện tại được sử dụng để lấy mẫu hoạt hình trên trục hòa trộn. Nếu Position nằm ngoài phạm vi của các vị trí đầu vào đã xác định, nút sẽ ngoại suy bằng cách sử dụng hai đầu vào gần nhất. PhaseSync Enum.AnimationNodePhaseSync Cấu hình xem thời gian của các đầu vào con có nên được đồng bộ hóa hay không.
- Đồng bộ (mặc định): Đồng bộ hóa chuẩn hóa. Nút tính toán "thời gian ảo" dựa trên trung bình trọng số của các đầu vào hoạt động. Bước thời gian của từng nút đầu vào sẽ được điều chỉnh để tất cả các đầu vào con hội tụ về cùng một giai đoạn, giữ cho các hoạt hình có độ dài khác nhau đồng bộ.
- Không đồng bộ: Hòa trộn chuẩn tắc, nơi các đoạn clip phát triển độc lập với tỷ lệ phát lại của riêng nó.
- Dữ liệu sự kiện
- Xử lý sự kiện: Nút lắng nghe các sự kiện từ tất cả các nút con đang hoạt động.
- Phát ra sự kiện: Chỉ có các sự kiện từ đầu vào có trọng số cao nhất sẽ lan truyền, được điều chỉnh theo trọng số hòa trộn của nó. Các sự kiện từ đầu vào thứ cấp sẽ bị tắt tiếng.
Blend2D

Hòa trộn nhiều tư thế hoạt hình lại với nhau dựa trên hai tham số đầu vào trong không gian tọa độ 2D. Điều này tổng quát hóa nút Blend1D để xử lý các tình huống phức tạp, chẳng hạn như hòa trộn dựa trên cả hướng chuyển động và tốc độ đồng thời.
- Đầu vào
- Input1...InputN
- X (Số): Tọa độ X cho mỗi đầu vào tiếp theo.
- Y (Số): Tọa độ Y cho mỗi đầu vào tiếp theo.
- Thuộc tính
Thuộc tính Loại Mô tả InputMode Enum.AnimationNodeBlend2DInputMode Xác định hệ thống tọa độ được sử dụng để đánh giá không gian hòa trộn:
- Đường tròn (mặc định): Sử dụng tọa độ lưới 2D chuẩn. X và Y đại diện cho vị trí hiện tại trong không gian hòa trộn.
- Cực: Sử dụng các giá trị góc và độ lớn. X đại diện cho hướng tính bằng radians, trong khi Y đại diện cho độ lớn hoặc sức mạnh của chuyển động. Hướng được coi trọng hơn độ lớn, do đó các đầu vào ở các góc tương tự nhưng với các độ lớn khác nhau sẽ hòa trộn mượt mà hơn so với các đầu vào với các góc khác nhau.
X Số Tọa độ X hiện tại (Cartesian) hoặc Hướng tính bằng radians (Polar). Y Số Tọa độ Y hiện tại (Cartesian) hoặc Độ lớn (Polar). PhaseSync Enum.AnimationNodePhaseSync Cấu hình xem thời gian của các đầu vào con có nên được đồng bộ hóa hay không.
- Đồng bộ (mặc định): Đồng bộ hóa chuẩn hóa. Nút tính toán "thời gian ảo" dựa trên trung bình trọng số của các đầu vào hoạt động. Bước thời gian của từng nút đầu vào sẽ được điều chỉnh để tất cả các đầu vào con hội tụ về cùng một giai đoạn, giữ cho các hoạt hình có độ dài khác nhau đồng bộ.
- Không đồng bộ: Hòa trộn chuẩn tắc, nơi các đoạn clip phát triển độc lập với tỷ lệ phát lại của riêng nó.
- Dữ liệu sự kiện
- Xử lý sự kiện: Nút lắng nghe các sự kiện từ tất cả các nút con đang hoạt động.
- Phát ra sự kiện: Chỉ có các sự kiện từ đầu vào có trọng số cao nhất sẽ lan truyền, được điều chỉnh theo trọng số hòa trộn của nó. Các sự kiện từ đầu vào thứ cấp sẽ bị tắt tiếng.
Mask

Áp dụng một mặt nạ đã được định nghĩa trước cho tư thế đầu vào. Một mặt nạ được xác định bởi một trọng số cho mỗi đối tượng (ví dụ: khớp) trong hệ thống rig, cho phép điều khiển chính xác hoặc "làm mềm" hoạt hình.
- Đầu vào
- Pose: Tư thế hoạt hình sẽ được che đậy.
- Thuộc tính
Thuộc tính Loại Mô tả Mask ObjectValue Một ObjectValue (được tạo ra như một con cái trực tiếp của định nghĩa nút Mask) xác định các trọng số mặt nạ. Nó có thể hoạt động theo một trong hai cách:
- Trực tiếp: ObjectValue chứa các thuộc tính ánh xạ tên đối tượng rig tới các giá trị trọng số cụ thể.
- Theo tham chiếu: ObjectValue tham chiếu đến một Instance khác chứa các thuộc tính ánh xạ. Điều này cho phép chia sẻ mặt nạ trên các nút khác nhau trong đồ thị.
Khi tạo một mặt nạ, bạn có thể chọn một sơ đồ rig (HumanoidRigDescription hoặc Picker) để lấp đầy hệ thống phân cấp.
- HumanoidRigDescription: Tiêu chuẩn hóa mặt nạ cho các nhân vật nhân hình.
- Picker: Cho phép người dùng chọn bất kỳ rig cụ thể nào trong không gian làm việc để lấp đầy hệ thống phân cấp mặt nạ.
Invert Boolean Khi đúng, áp dụng giá trị trọng số dưới dạng 1 - trọng số. Điều này cho phép tái sử dụng một mặt nạ một cách vô tình mà không cần tạo một tài sản mới. - Dữ liệu sự kiện
- Xử lý sự kiện: Nút lắng nghe tất cả các sự kiện từ đầu vào Pose.
- Phát ra sự kiện: Tất cả các sự kiện từ đầu vào Pose đều được truyền qua mà không thay đổi.
Speed

Sửa đổi tỷ lệ phát lại của một tư thế hoạt hình đầu vào.
- Đầu vào
- Pose: Tư thế hoạt hình hoặc đồ thị con mà tốc độ phát lại sẽ được sửa đổi.
- Thuộc tính
Thuộc tính Loại Mô tả Speed Số Một hệ số nhân được áp dụng cho khoảng thời gian delta (). 0.0 tạm dừng đồ thị, 1.0 là tốc độ bình thường và 2.0 là tốc độ gấp đôi. - Dữ liệu sự kiện
- Xử lý sự kiện: Nút lắng nghe các sự kiện từ đầu vào Pose.
- Phát ra sự kiện: Tất cả các sự kiện từ đầu vào Pose đều được truyền qua mà không thay đổi. Lưu ý rằng trong khi tốc độ phát lại trực quan thay đổi, thời gian của các sự kiện phát ra (chẳng hạn như các marker) sẽ điều chỉnh tương ứng với tỷ lệ phát lại đã sửa đổi.
GraphOutput

Đại diện cho tư thế đã được đánh giá cuối cùng của đồ thị. Nút này được tự động bao gồm trong tất cả các đồ thị mới trong trình chỉnh sửa đồ thị hoạt hình. Sự hiện diện của nó đảm bảo rằng đồ thị luôn hợp lệ và nhất quán tạo ra một tư thế hoạt hình.
- Đầu vào
- Pose: Dữ liệu hoạt hình cuối cùng đã được xử lý để áp dụng cho rig.
- Thuộc tính
- Không có
- Dữ liệu sự kiện
- Xử lý sự kiện: Nút lắng nghe tất cả các sự kiện truyền qua đầu vào kết nối cuối cùng.
- Phát ra sự kiện: Nút này phục vụ như một điểm xuất cho quy trình hoạt hình và không phát ra tín hiệu trở lại vào đồ thị.
Chuyển tiếp
Một số nút trong đồ thị hoạt hình (như Select, Priority Select, Sequence, và Random Sequence) quản lý cách các hoạt hình hòa trộn khi chuyển đổi giữa các đầu vào hoạt động. Để ngăn chặn sự lặp lại trong tham khảo nút, các hành vi này được xác định bởi các nhóm thuộc tính chuyển tiếp tiêu chuẩn.
Chuyển tiếp mặc định

Hành vi hòa trộn cơ bản được áp dụng cho nút bất cứ khi nào nó chuyển sang một đầu vào hoạt động mới.
- DefaultTransitionDuration (số): Thời gian (tính bằng giây) cần thiết để hòa trộn hoàn toàn vào tư thế mới.
- DefaultTransitionCurve (Enum.PoseEasingStyle): Hàm easing được áp dụng trong quá trình hòa trộn. Hiện tại chỉ hỗ trợ Enum.PoseEasingStyle.Linear và Enum.PoseEasingStyle.CubicV2.
Ghi đè chuyển tiếp

Các thuộc tính kết nối cụ thể của đầu vào có ưu tiên hơn chuyển tiếp mặc định. Những điều này sẽ được áp dụng khi nút chuyển sang đầu vào cụ thể đó.
- TransitionOverrideDuration (số): Ghi đè thời gian chuyển tiếp mặc định.
- TransitionOverrideCurve (Enum.PoseEasingStyle): Ghi đè đường cong chuyển tiếp mặc định. Hiện tại chỉ hỗ trợ Enum.PoseEasingStyle.Linear và Enum.PoseEasingStyle.CubicV2
Nhân bản
Các tham số của đồ thị hoạt hình là cục bộ cho mỗi AnimationTrack và không tự động được nhân bản. Điều này có thể thay đổi trong các cập nhật trong tương lai, nhưng cách tiếp cận hiện tại được khuyến nghị sử dụng:
- Khách hàng → Máy chủ: Một RemoteEvent để gửi các tham số từ khách hàng sở hữu đến máy chủ với một tỷ lệ tick cố định.
- Máy chủ → Các khách hàng khác: Các thuộc tính Instance tự động nhân bản tới tất cả khách hàng.
Nhân vật người chơi
Một tập lệnh khách hàng điều khiển nhân vật người chơi. Vì chỉ có khách hàng sở hữu mới biết trạng thái trò chơi hiện tại (đầu vào chuyển động, trạng thái nhân hình, v.v.), các tham số phải được chuyển từ khách hàng sở hữu đến máy chủ và sau đó đến tất cả các khách hàng khác.
Cài đặt
Dưới StarterCharacterScripts, tạo ra:
- Một LocalScript cho hoạt hình và điều khiển tham số phía khách hàng.
- Một Script cho việc nhân bản phía máy chủ.
- Một RemoteEvent cho giao tiếp từ khách hàng đến máy chủ.
Tập lệnh khách hàng
Khách hàng sở hữu điều khiển các tham số từ sự kiện trò chơi và gửi chúng đến máy chủ định kỳ. Các khách hàng khác đọc các thuộc tính đã được nhân bản từ tập lệnh máy chủ thay vì.
local Players = game:GetService("Players")
local RunService = game:GetService("RunService")
local character = script.Parent
local humanoid = character:WaitForChild("Humanoid")
local animator = humanoid:FindFirstChildOfClass("Animator") or humanoid
-- Tải đồ thị hoạt hình
local animation = Instance.new("Animation")
animation.AnimationId = "rbxassetid://YOUR_GRAPH_ID" -- Thay thế với ID đồ thị đã xuất bản của bạn
local track = animator:LoadAnimation(animation)
track:Play()
local isLocalCharacter = Players:GetPlayerFromCharacter(character) == Players.LocalPlayer
if not isLocalCharacter then
-- Đọc các tham số đã được nhân bản từ tập lệnh máy chủ
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
-- Người chơi địa phương: điều khiển các tham số từ trạng thái nhân hình
local params = {}
local function setParam(key, value)
track:SetParameter(key, value)
params[key] = value
end
-- Ví dụ: điều khiển các tham số từ trạng thái nhân hình
humanoid.Running:Connect(function(speed)
setParam("Speed", speed)
setParam("State", if speed < 0.1 then "Idle" else "Moving")
end)
-- Gửi các tham số đến máy chủ với tỷ lệ tick cố định
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)
Tập lệnh máy chủ
Nhận các tham số từ khách hàng sở hữu, điều khiển đồ thị hoạt hình phía máy chủ, và phát tán các giá trị dưới dạng thuộc tính để nhân bản tới các khách hàng khác.
local Players = game:GetService("Players")
local character = script.Parent
local humanoid = character:WaitForChild("Humanoid")
local animator = humanoid:FindFirstChildOfClass("Animator") or humanoid
-- Tải cùng một đồ thị hoạt hình trên máy chủ
local animation = Instance.new("Animation")
animation.AnimationId = "rbxassetid://YOUR_GRAPH_ID" -- ID đồ thị giống như trên máy khách
animation.Parent = script
local track = animator:LoadAnimation(animation)
track:Play()
-- Nhận các tham số từ khách hàng sở hữu và nhân bản qua thuộc tính
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)
NPCs
Vì máy chủ sở hữu hoạt hình NPC, chỉ cần nhân bản từ máy chủ đến máy khách. Điều khiển đồ thị hoạt hình trên máy chủ, ghi các tham số dưới dạng thuộc tính trên một Script máy chủ, và đọc chúng ở phía khách hàng bằng cách sử dụng cùng một mẫu Instance.AttributeChanged đã được chỉ ra ở trên.
Độ trễ
Các khách hàng khác sẽ thấy hoạt hình với một độ trễ nhỏ bằng độ dài của khoảng thời gian tick (tối đa 50 ms ở 20 Hz) cộng với độ trễ mạng. Bạn có thể giảm khoảng thời gian tick bằng cách tăng tần suất (chẳng hạn như 1/30), nhưng điều này sẽ dẫn đến lưu lượng mạng cao hơn. 20 Hz là mặc định hợp lý; việc hòa trộn hoạt hình khá cho phép nên những độ trễ nhỏ thường khó nhận thấy.