アニメーショングラフエディター

*このコンテンツは、ベータ版のAI(人工知能)を使用して翻訳されており、エラーが含まれている可能性があります。このページを英語で表示するには、 こちら をクリックしてください。

アニメーショングラフエディターは、技術者やアニメーターがRoblox Studio内で複雑なアニメーションロジックを直接構築できる視覚的なノードベースのツールです。ブレンドツリーのような動作を作成するための効率的なインターフェースを提供することで、キャラクターの動きのために手動スクリプティングに依存する従来の方法を排除します。

このシステムは、既存のアニメーションワークフローと連携して機能します:

  • アニメーションエディター: 個々のクリップの作成とキーフレームやカーブの微調整のための主要なツールとしてアニメーションエディターの使用を継続します。
  • アニメーショングラフエディター: この新しいワークスペースを使用して、これらのクリップを整理し、洗練されたゲームプレイ動作を駆動するためのロジックツリーに構成します。

コラボレーションを強化するように設計された視覚的なグラフでは、開発者はアニメーターが作成したロジックを迅速に検査、デバッグ、および理解できます。アーティストがインタラクティブな動きを洗練させることに集中している間、開発者はブレンドされたアニメーションや状態を直接制御するためにアニメーショングラフノードにプログラムでアクセスできます。

グラフを構築する


アニメーション可能なキャラクターのロジックを構築を始めるには、Studioリボンのアバタータブからアニメーショングラフエディターにアクセスします。以下のステップでは、リグを初期化し、デフォルトのウォーキングおよびウェービングアニメーションを使用して基本的なノードネットワークを構築する方法を示します。

実用的なアプリケーションの詳細については、アニメーショングラフリファレンスファイルを探索してください。このファイルには、基礎的な例や複雑な実装例が含まれています。

独自のアニメーショングラフを作成するには、リファレンスで提供されている基本的な例に類似した手順を使用します:

  1. Studioで、アバタータブに移動し、キャラクターマイアバターを選択して、アニメーション可能なリグを追加します。

    Studioのツールバーでハイライトされたキャラクターボタン。
  2. アバタータブでグラフエディターに移動してアニメーショングラフエディターを開きます。

    Studioのツールバーで示されたアニメーショングラフエディター。
  3. 3Dビューポートでアニメーション可能なリグを選択し、グラフを作成を選択します。

  4. グラフエディターで右クリックし、クリップを選択します。

    右クリックメニューのノードリスト
  5. 新しいクリップノードでアニメーションIDを設定します。

    1. アニメーションIDドロップダウンを選択します。

    2. 特定のアニメーションアセットIDを提出するには、インポートをクリックします。

      アニメーションインポートモジュールのアニメーションIDを追加するフィールドを示しています
    3. アニメーションIDフィールドにデフォルトのウォークアニメーションを追加します: 507777826.

    4. インポートを選択します。

  6. デフォルトのウェーブアニメーション: 507770239を使用して、手順4-5を繰り返して別のクリップノードを追加します。

    アニメーションIDが埋め込まれた2つのクリップノード
  7. グラフエディターで右クリックし、追加を選択します。

    ノードを追加
  8. クリップノードを追加ノードに接続します。上部右の出力コネクタを適切なポートにドラッグします:

    1. ウォーキングアニメーションを持つクリップノードをベースポートに接続します。
    2. ウェービングアニメーションを持つクリップノードを加算的ポートに接続します。
    追加ノードに接続された両方のクリップノード
  9. 追加ノードから上部右の出力コネクタをグラフ出力ポーズポートに接続します。

    最終出力ノードに接続されたすべてのノード
  10. (オプション) Speed変数にパラメーターを割り当てます。

    1. 緑のスピードポートを空の領域にクリックしてドラッグします。新しいパラメーターノードが表示されます。

      クリップノードのスピードポートから接続をクリックしてドラッグしています。
    2. グラフエディターの左上で、パラメーターペインを使用してノード内のパラメータを迅速に変更できます。このプログラム的にへのアクセスもできます。

      共通の値を示すパラメーターペイン、パラメーターノード、クリップノード。
  11. 再生ボタンを押してアニメーションをテストします。

    アニメーションをプレビューするための再生ボタンアイコン
  12. さまざまなウェイト、スピード、プレイモード、その他のアニメーションをテストしてみてください。個別のノードに関する詳細については、ノードリファレンスを参照してください。

API統合

アニメーショングラフを作成および展開する際は、標準のRobloxアニメーションパイプラインに従います。アニメーショングラフエディターでリグを選択すると、新しいAnimationGraphDefinitionアセットが作成されます。このアセットは、ノード、接続、およびパラメーターのコンテナとして機能します。ロジックが確定したら、グラフを公開して標準のアセットIDを受け取ります。

スクリプト内では、従来のアニメーションと同様に、これらのグラフをAnimatorにロードすることでやり取りします。グラフの内部ロジックを駆動するには、AnimationTrack:SetParameter()を使用して、リアルタイムの値—キャラクターの移動速度や状態のブール値—をグラフの変数に直接渡します。


local animation = Instance.new("Animation")
animation.AnimationId = "rbxassetid://123456789" -- あなたの公開グラフID
local animationTrack = animator:LoadAnimation(animation)
animationTrack:Play()
-- RunServiceによる動的パラメーターの更新
game:GetService("RunService").Stepped:Connect(function(_, dt)
local currentSpeed = humanoidRootPart.AssemblyLinearVelocity.Magnitude
animationTrack:SetParameter("humanoidSpeed", currentSpeed)
end)

ノードリファレンス

すべてのアニメーショングラフノードは、アニメーションデータがキャラクターリグに到達する前に処理されるロジックゲートまたはデータソースとして機能します。このセクションでは、アニメーショングラフエディター内の機能ブロックの技術的な内訳を提供します。すべてのノードは現在アニメーションポーズを出力します。

各ノードセクションには以下が含まれます:

  • 定義 – ノードの目的とグラフ内での役割の要約。
  • 入力 – ノードに入るデータストリーム。複数の入力はInput1, Input2, ..., InputNとして表されます。
  • 入力プロパティ – 特定の入力に直接関連付けられた設定(Blend1Dノードの位置が0.5に設定されたIdle入力など)。
  • イベントデータ – 内部グラフロジックまたは外部Luauスクリプトをトリガーするためにノードによって送出または消費されるイベント。これらの動作はベータ開発の過程で変更される可能性があります。

グローバルイベントルール

すべてのノードおよびトランジションに対して、デフォルトで以下のルールが適用されます:

  • イベントは、ソースノードからグラフを上向きに伝播します。各イベントは、最終ブレンドにおけるソースの影響を示すウェイトを持ちます。ウェイトがゼロに達した時点で、イベントは消音されます。
  • カスタムイベントロジックを持たないノードは、全てのイベントを変更せずに通過させます。入力をブレンドまたは選択するノードは、ウェイトをスケールするか、非主要な入力からのイベントをブロックすることがあります(ノードごとのイベントセクションを参照してください)。
  • グラフの最上部に到達したマーカーイベントは、AnimationTrack:GetMarkerReachedSignal()を介して観測できます。

クリップ

クリップノード

AnimationClipアセットへの参照。これはグラフのリーフノードとして機能し、他のノードに対してブレンド、選択、または修正するための生のアニメーションデータを生成します。

入力
  • なし
プロパティ
プロパティタイプ説明
クリップアセットID再生するアニメーションアセット(例: rbxassetid://12345)。
プレイモードEnum.AnimationNodePlayMode

クリップの再生が終了した後の動作を定義します。

  • ループ(デフォルト): クリップが終了した後に自動的に最初から再起動します。
  • ピングポン: 最初から最後まで再生した後、すぐに最後から最初に逆再生します。
  • 一度再生して保持: 一度再生し、完了時に最終ポーズを保持します。
  • 一度再生してリセット: 一度再生し、完了時に初期のスタートポーズに戻ります。
リバースブール値再生方向を制御します。
スピード数値再生速度に適用される倍率。0.0はグラフを一時停止し、1.0は通常の速度、2.0は2倍の速度を示します。
トリムブール値クリップの期間が短縮されるかどうかを切り替えます。
トリム開始数値再生を開始すべき絶対的なタイムスタンプ(秒単位)。
トリム終了数値再生を終了すべき絶対的なタイムスタンプ(秒単位)。
イベントデータ
  • イベント処理: なし。これは子を持たないリーフノードです。
  • イベント発生: アニメーションクリップに埋め込まれたカスタムマーカーを読み取り(例: "足音"、"武器スイング")、それらが発生する正確なフレームで名前付きイベントとして発生させます。クリップがトリムされている場合、定義された[TrimStart, TrimEnd]範囲(含まれる)内のマーカーのみが発生します。

セレクト

セレクトノード

選択プロパティを介して任意の数の入力から選択します。現在の選択が変わると、新しいトランジションがトリガーされます。

入力
  • Input1...InputN
プロパティ
プロパティタイプ説明
選択文字列選択する入力の一意のIDで、接続された入力の名前と一致します(例: "ウォーク")。
イベントデータ
  • イベント処理: 現在選択されている入力からのイベントは、ウェイトを変更せずに通過します。
  • イベント発生: 現在選択されている入力からのみ、すべてのイベントを通過させます。トランジション中は、イベント発生はグローバルイベントルールに従います。

プライオリティセレクト

プライオリティセレクトノード

接続された入力のリストを上から下に評価し、条件が真と評価される最初の入力を再生します。これにより、特定のロジックに基づいた階層的アニメーション選択が可能になります。現在の選択が変わると、新しいトランジションがトリガーされます。

入力
  • Input1...InputN
    • トリガー(ブール値): この入力をアクティブにするために真でなければならない論理条件。現在のバージョンでは、これはブールパラメーターに接続されています。
    • 中断可能(Enum.AnimationNodeInterruptible): このアクティブなアニメーションが高い優先度の入力によって中断されるルールを定義します。
      • 常に(デフォルト): この入力は、高い優先度の条件によっていつでも中断可能です。
      • 終了: 現在のアニメーションが再生を完了する必要があります。高い優先度の入力が取ることができるようになる前に。
      • トリガー: InterruptibleTriggerが真に設定されているときのみ、この入力は中断可能です。
    • 中断可能トリガー(ブール値): 中断可能トリガーに設定されている場合のみ利用可能。この特定の表現が真のときに入力を中断することができます。
プロパティ
プロパティタイプ説明
デフォルト中断可能Enum.AnimationNodeInterruptibleすべての入力に適用される基本的な中断ルール。各入力は独自の中断可能入力プロパティでこれをオーバーライドできます。
デフォルト中断可能トリガーブール値入力の解決された中断可能モードがトリガーの場合に使用される基本トリガー値。各入力は独自の中断可能トリガー入力プロパティでこれをオーバーライドできます。
イベントデータ
  • イベント処理: 現在選択されている入力からのイベントは、ウェイトを変更せずに通過します。
  • イベント発生: 現在選択されている入力からのみ、すべてのイベントを通過させます。トランジション中は、イベント発生はグローバルイベントルールに従います。

シーケンス

シーケンスノード

定義された待機条件に基づいて、一連の接続された入力を特定の順序でアクティブにします。現在の選択が変わると、新しいトランジションがトリガーされます。

入力
  • Input1...InputN
    • 待機する(Enum.AnimationNodeWaitFor): シーケンスが次の入力に進む前に満たされる必要がある条件を指定します。
      • 完了(デフォルト): 現在の入力がサイクルを完了すると次の入力に進みます。進行の動作は接続された入力によって異なります:
        • 一度再生されるクリップ: クリップが終了すると進みます。
        • ループするクリップ: 1周が完了すると進みます。
        • 無限ループのシーケンス: すべての入力を通じて1サイクルが完了すると進みます。
        • ループする無限シーケンス: すべてのループが完了すると進みます。
      • トリガー: カスタム論理式が真と評価されると次の入力をアクティブにします。
    • WaitForTrigger(ブール値): WaitForTriggerに設定されている場合にのみ利用可能です。
プロパティ
プロパティタイプ説明
ループカウント数値シーケンス全体をサイクルする回数(デフォルトは1)。値が0の場合、無限ループを示します。カウントに達した時点で、ノードは最終入力のループまたは保持設定を尊重します。
デフォルト待機するEnum.AnimationNodeWaitForすべての入力に適用される基本的な待機条件。各入力は独自の待機する入力プロパティでこれをオーバーライドできます。
イベントデータ
  • イベント処理: 現在アクティブな入力からのイベントは、ウェイトを変更せずに通過します。
  • イベント発生: シーケンスの現在アクティブな入力からのみ、すべてのイベントを通過させます。トランジション中は、イベント発生はグローバルイベントルールに従います。

ランダムシーケンス

ランダムシーケンスノード

接続された入力の一つをランダムで選択して再生します。現在の選択されたアニメーションが完了すると、ノードは別の入力をランダムに選択して再生します。各入力に特定のウェイトを割り当てて、選択される確率に影響を与えます。現在の選択が変わると、新しいトランジションがトリガーされます。

入力
  • Input1...InputN
    • ウェイト(数値): この入力が選択される確率を決定します。高いウェイトは選ばれる可能性が高まります。
プロパティ
プロパティタイプ説明
プレイカウント数値ノードが停止する前に再生する入力の数。カウントに達すると、ノードは最終入力のループまたは保持設定を尊重します。デフォルトは0で無限です。
シード数値ランダム数生成器(RNG)を初期化するために使用される値で、シーケンスが異なるクライアント間で一貫していることを保証します。デフォルトは-1で、ランダムシードになります。
イベントデータ
  • イベント処理: 現在アクティブな入力からのイベントは、ウェイトを変更せずに通過します。
  • イベント発生: シーケンスの現在アクティブな入力からのみ、すべてのイベントを通過させます。トランジション中は、イベント発生はグローバルイベントルールに従います。

オーバー

オーバーノード

オーバーポーズをベースポーズの上にレイヤーします。マスクノードと組み合わせることで、オーバーポーズでマスキングされた関節がベースポーズを完全に表示し、透明なオーバーレイ効果を作り出します。

入力
  • ベース: 背景または下のレイヤーで、通常は移動やアイドル状態の全身アニメーションです。
  • オーバー: ベースの上に適用される前景または上のレイヤーで、手のジェスチャーやツール使用アニメーションなどです。
プロパティ
プロパティタイプ説明
ウェイト数値オーバーポーズを減衰させるために使用されるブレンドウェイト。デフォルトは1.0(全オーバーライド)で、クランプされていません。
イベントデータ
  • イベント処理:
    • 同時にベースオーバー入力からのイベントをリッスンします。
  • イベント発生:
    • ベースイベント: ベース入力からのすべてのイベントは変更なしで通過します。
    • オーバーイベント: オーバー入力からのイベントはウェイトプロパティによってスケールされます。
      • ウェイト0.5で、オーバーイベントは半分のウェイトで伝播します。
      • ウェイト0で、イベントは消音されます。

追加

追加ノード

ベースポーズに加算的ポーズを追加し、特定のウェイトで減衰します(クランプなし)。

入力
  • ベース: 主アニメーションポーズ。
  • 加算的: ベースに重ね合わせるポーズです。
プロパティ
プロパティタイプ説明
ウェイト数値ベースに適用される加算ポーズの強度を決定します。
イベントデータ
  • イベント処理: ノードは、ベース加算的入力からのイベントをリッスンします。
  • イベント発生: ベースと加算的入力からのすべてのイベントは、変更なしで通過します。

サブトラクト

サブトラクトノード

アニメーションを加算ポーズに変換するために、相対ベースポーズをターゲットポーズから減算します(ABA - B)。結果は特定のウェイト(クランプなし)で減衰します。

入力
  • A: ターゲットアニメーションポーズ。
  • B: 減算される相対ベースポーズ。
プロパティ
プロパティタイプ説明
ウェイト数値結果に適用される減算効果の強度を決定します。
イベントデータ
  • イベント処理: ノードは、入力A入力Bの両方からのイベントをリッスンします。
  • イベント発生: 入力A入力Bの両方からのすべてのイベントは、変更なしで通過します。

ブレンド1D

ブレンド1Dノード

単一の軸上で現在の入力位置に最も近い2つのアニメーションポーズの間を線形補間します。

入力
  • Input1...InputN
    • 位置(数値): ブレンド軸上の各後続入力に対する特定の座標。
プロパティ
プロパティタイプ説明
位置数値アニメーションをサンプリングするためにブレンド軸で使用される現在のアクティブな値。位置が定義された入力位置の範囲外である場合、ノードは最も近い2つの入力を使用して外挿します。
フェーズ同期Enum.AnimationNodePhaseSync

子入力のタイミングを同期するかどうかを設定します。

  • 同期(デフォルト): 正規化された同期。ノードはアクティブな入力の平均値に基づく「仮想の期間」を計算します。各入力ノードのタイムステップが調整され、すべての子が同じフェーズに収束し、異なる長さのアニメーションがロックステップで維持されます。
  • 非同期: クリップがそれぞれ独立して再生される標準的なブレンド。
イベントデータ
  • イベント処理: ノードは、現在アクティブなすべての子ノードからのイベントをリッスンします。
  • イベント発生: 最高ウェイトのあるアクティブな入力からのイベントのみが伝播し、スケールされます。二次入力からのイベントは消音されます。

ブレンド2D

ブレンド2Dノード

2D座標空間内の2つの入力パラメータに基づいて、複数のアニメーションポーズをブレンドします。これにより、ブレンド1Dノードを一般化し、移動方向と速度の両方に基づく複雑なシナリオを処理します。

入力
  • Input1...InputN
    • X(数値): 各後続入力のX座標。
    • Y(数値): 各後続入力のY座標。
プロパティ
プロパティタイプ説明
入力モードEnum.AnimationNodeBlend2DInputMode

ブレンドスペースを評価するために使用される座標系を定義します:

  • デカルト(デフォルト): 標準の2Dグリッド座標を使用します。XとYはブレンドスペース内の現在の位置を表します。
  • 極座標: 角度と大きさの値を使用します。Xはラジアンでの方向を表し、Yは移動の大きさまたは強さを表します。方向は大きさよりも大きな重みを持つため、同じ角度だが異なる大きさの入力は、異なる角度の入力よりも滑らかにブレンドされます。
X数値現在のX座標(デカルト)または方向(ラジアン、極座標)。
Y数値現在のY座標(デカルト)または大きさ(極座標)。
フェーズ同期Enum.AnimationNodePhaseSync

子入力のタイミングを同期するかどうかを設定します。

  • 同期(デフォルト): 正規化された同期。ノードはアクティブな入力の平均値に基づく「仮想の期間」を計算します。各入力ノードのタイムステップが調整され、すべての子が同じフェーズに収束し、異なる長さのアニメーションがロックステップで維持されます。
  • 非同期: クリップがそれぞれ独立して再生される標準的なブレンド。
イベントデータ
  • イベント処理: ノードは、現在アクティブなすべての子ノードからのイベントをリッスンします。
  • イベント発生: 最高ウェイトのあるアクティブな入力からのイベントのみが伝播し、スケールされます。二次入力からのイベントは消音されます。

マスク

マスクノード

入力ポーズに対して予め定義されたマスクを適用します。マスクは、リグ階層内のオブジェクト(例: 関節)ごとにウェイトによって定義され、アニメーションの正確な制御や「フェザー効果」を可能にします。

入力
  • ポーズ: マスクされるアニメーションポーズ。
プロパティ
プロパティタイプ説明
マスクObjectValue

マスクのウェイトを定義するObjectValue(マスクのAnimationNodeDefinitionの直接の子として作成されたもの)。これには2つの方法があります:

  • 直接: ObjectValue自体に、リグオブジェクトの名前を特定のウェイト値にマッピングする属性が含まれます。
  • 参照: ObjectValueがマッピング属性を含む別のInstanceを参照します。これにより、異なるノード間で共有マスクを作成できます。

マスクを作成する際には、リグスキーマ(HumanoidRigDescriptionまたはピッカー)を選択して階層を生成できます。

  • HumanoidRigDescription: ヒューマノイドキャラクター用にマスクを標準化します。
  • ピッカー: ユーザーがアクティブなワークスペース内の特定のリグを選択して、マスク階層を生成することを可能にします。
反転ブール値trueの場合、ウェイト値を1 - weightとして適用します。これにより、新しい資産を作成することなく、マスクを逆に再利用できます。
イベントデータ
  • イベント処理: ノードは、入力ポーズからのすべてのイベントをリッスンします。
  • イベント発生: 入力ポーズからのすべてのイベントは、変更なしで通過します。

スピード

スピードノード

入力アニメーションポーズの再生速度を変更します。

入力
  • ポーズ: 再生速度が変更されるアニメーションポーズまたはサブグラフ。
プロパティ
プロパティタイプ説明
スピード数値時間Δ(dtdt)に適用される倍率。0.0はグラフを一時停止し、1.0は通常の速度、2.0は2倍の速度を示します。
イベントデータ
  • イベント処理: ノードは、入力ポーズからのイベントをリッスンします。
  • イベント発生: 入力ポーズからのすべてのイベントは、変更なしで通過します。視覚的な再生速度が変更されると、発生したイベント(マーカーなど)のタイミングは変更された再生速度に合わせてスケールされます。

グラフ出力

グラフ出力ノード

グラフの最終的に評価されたポーズを表します。このノードは、アニメーショングラフエディターのすべての新しいグラフに自動的に含まれます。その存在は、グラフが常に有効であり、一貫してアニメーションポーズを生成することを保証します。

入力
  • ポーズ: リグに適用される最終的な処理されたアニメーションデータ。
プロパティ
  • なし
イベントデータ
  • イベント処理: ノードは、最終的に接続された入力からのすべてのイベントをリッスンします。
  • イベント発生: このノードは、アニメーションパイプラインの出口ポイントとして機能し、グラフ内に信号を再発生させません。

トランジション

アニメーショングラフのいくつかのノード(セレクトプライオリティセレクトシーケンス、およびランダムシーケンスなど)は、アクティブな入力から切り替えるときのアニメーションのブレンド方法を管理します。ノードリファレンス内の冗長性を避けるために、これらの動作は標準化されたトランジションプロパティグループによって定義されます。

デフォルトトランジション

デフォルトトランジション

ノードが新しいアクティブ入力に切り替えるたびに適用される基本的なブレンド動作。

  • デフォルトトランジションの期間(数値): 新しいポーズに完全にブレンドするのにかかる時間(秒単位)。
  • デフォルトトランジションの曲線 (Enum.PoseEasingStyle): ブレンド中に適用されるイージング関数。現在のところ、Enum.PoseEasingStyle.LinearEnum.PoseEasingStyle.CubicV2のみがサポートされています。

トランジションオーバーライド

デフォルトトランジションを上書きする入力固有のリンクプロパティです。これらは、ノードがその特定の入力に切り替えるときに適用されます。

  • トランジションオーバーライドの時間(数値): デフォルトのトランジションの期間を上書きします。
  • トランジションオーバーライドの曲線 (Enum.PoseEasingStyle): デフォルトのトランジション曲線を上書きします。現在のところ、Enum.PoseEasingStyle.LinearEnum.PoseEasingStyle.CubicV2のみがサポートされています。

複製

アニメーショングラフのパラメーターは、各AnimationTrackにローカルであり、自動的には複製されません。これは将来のアップデートで変更される可能性がありますが、現在推奨されるアプローチは次の通りです:

  • クライアント → サーバー: RemoteEventを使用して、所有するクライアントからサーバーにパラメーターを固定のティック速度で送信します。
  • サーバー → 他のクライアント: インスタンス属性は、すべてのクライアントに自動的に複製されます。

プレイヤーキャラクター

クライアントスクリプトはプレイヤーキャラクターを駆動します。所有するクライアントのみが現在のゲームプレイ状態(移動入力、ヒューマノイドの状態など)を知っているため、パラメーターは所有するクライアントからサーバーを経由して、他のクライアントに流れなければなりません。

セットアップ

StarterCharacterScriptsの下に、以下を作成します:

  • クライアント側のアニメーションおよびパラメータの駆動用のLocalScript
  • サーバー側の複製用のScript
  • クライアントとサーバー間の通信用のRemoteEvent

クライアントスクリプト

所有するクライアントは、ゲームプレイイベントからパラメーターを駆動し、それを定期的にサーバーに送信します。他のクライアントはサーバースクリプトから複製された属性を読み取ります。


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
-- アニメーショングラフをロード
local animation = Instance.new("Animation")
animation.AnimationId = "rbxassetid://YOUR_GRAPH_ID" -- あなたの公開グラフIDに置き換えます
local track = animator:LoadAnimation(animation)
track:Play()
local isLocalCharacter = Players:GetPlayerFromCharacter(character) == Players.LocalPlayer
if not isLocalCharacter then
-- サーバースクリプトから複製されたパラメーターを読み取ります
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
-- ローカルプレイヤー: ゲームプレイからパラメーターを駆動
local params = {}
local function setParam(key, value)
track:SetParameter(key, value)
params[key] = value
end
-- 例: ヒューマノイドの状態からパラメーターを駆動
humanoid.Running:Connect(function(speed)
setParam("Speed", speed)
setParam("State", if speed < 0.1 then "Idle" else "Moving")
end)
-- 定期的にサーバーへパラメーターを送信
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)

サーバースクリプト

所有するクライアントからパラメーターを受信し、サーバー側のアニメーショングラフを駆動し、他のクライアントに複製するために属性として値を伝播させます。


local Players = game:GetService("Players")
local character = script.Parent
local humanoid = character:WaitForChild("Humanoid")
local animator = humanoid:FindFirstChildOfClass("Animator") or humanoid
-- サーバーで同じアニメーショングラフをロード
local animation = Instance.new("Animation")
animation.AnimationId = "rbxassetid://YOUR_GRAPH_ID" -- クライアントの同じグラフID
animation.Parent = script
local track = animator:LoadAnimation(animation)
track:Play()
-- 所有するクライアントからパラメーターを受信し、属性を介して複製
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

サーバーがNPCのアニメーションを所有しているため、クライアント間の複製はサーバーからクライアントのみが必要です。サーバー上でアニメーショングラフを駆動し、サーバースクリプトに属性としてパラメーターを書き込み、クライアントが前述の属性変更パターンを使用してそれを読み取ります。

レイテンシ

他のクライアントは、ティック間隔とネットワークの遅延に等しい小さな遅延でアニメーションを表示します(20Hzでは最大50ms)。ティック間隔を増加させ(1/30など)、ネットワークトラフィックを高くすることで、ティック間隔を減少させることができます。20Hzは合理的なデフォルトであり、アニメーションブレンドは小さな遅延でも気付きにくいためです。

©2026 Roblox Corporation。Roblox(ロブロックス)、RobloxロゴおよびPowering Imaginationは、米国並びにその他の国における登録商標および非登録商標です。