キャラクターコントローラライブラリ

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

キャラクターコントローラライブラリ(CCL)は、属性とLuauスクリプトを通じてキャラクターの動きや動作を構築するためのモジュラーフレームワークです。このアーキテクチャは、堅牢なHumanoid状態マシンを、キャラクターメカニクスのための柔軟で拡張可能なシステムに置き換えます。

CCLを有効にする

CCLは、Studioのアバター設定ウィンドウを通じてオプトインです。これを有効にするには:

  1. ファイル ⟩ ベータ機能 ⟩ AvatarAbilities キャラクターコントローラーライブラリを通じてCCLベータを有効にします。

  2. アバタータブから、アバター設定を開きます。

    Studioのツールバーに表示されたアバター設定
  3. ウィンドウの左側にある移動タブを選択し、能力セクションでキャラクター コントローラー ライブラリを選択します。

    アバター設定ウィンドウのキャラクターコントローラーライブラリのトグル
  4. 走る、ジャンプする、登るなどの標準的な能力はデフォルトで有効になっています。ランタイム中にそれらのいずれかを無効にするには、関連するボックスのチェックを外します。

能力

能力は、キャラクターができること、たとえば走る、ジャンプする、登る、泳ぐといった能力を評価します。Enum.HumanoidStateTypeのようなエンジン定義の固定されたキャラクター状態に依存するのではなく、CCLの能力はキャラクターができることと、プレイヤーの入力にどのように反応すべきかを動的に決定します。

構造的には、能力は主に以下を指定する自己完結型のLuauテーブルです。

テーブルフィールド目的
Name能力のユニークな識別子。条件(conditions)や衝突(conflicts)は名前で参照します。同じNameを持つ2つの能力を登録するとエラーが発生します。似たような能力がいくつかある場合は、それぞれに異なるNameを付け、Labels内で共通のラベルを共有します。ModuleScriptの名前がユニークな構成キーを決定します。
Labels, TimedLabels能力間の調整バスとして機能する共有64ビットマスク内の名前付きビット。詳細はラベルを参照してください。
StartsWhen, RunsWhileそれぞれ、能力を開始する条件と、実行を維持する条件を定義します。詳細は条件を参照してください。
Blocks, Stops, Suspends, ExclusiveGroup同時にアクティブにできない能力間の衝突を処理する方法。
Input能力をトリガーする入力。Input.Modeは、入力がどのように能力を開始および停止するかを制御します。RunsWhileは、入力自体ではなく、世界の条件のみを保持します。詳細は入力を参照してください。
Config, State各能力登録のデフォルト構成値と複製された状態。コールバックはabilityCtx.Configから構成を読み取り、abilityCtx.Stateを通じて複製された状態を読み書きします。
OnSetup, OnStart, OnStop, OnUpdate, OnTeardown能力の実際の動作がスクリプト化されるライフサイクルコールバック。詳細はコールバックを参照してください。

ラベル

ラベルは、能力間の調整バスとして機能する共有64ビットマスク内の名前付きビットです。基本的には:

  • アクティブな能力は、そのLabelsとTimedLabelsを世界マスクにブロードキャストします。
  • 能力の条件(StartsWhen, RunsWhile)は、世界マスクをテストして反応します。
  • 能力の衝突は、アクティブ化時にどの他の能力がブロック、停止、または一時停止されるかを定義します。

次のセットアップでは、Runningがアクティブなときに"CanFallDown"ラベルが世界マスクにブロードキャストされます。FallingDown能力は、その条件がStartsWhen = All( "CanFallDown", "Stunned" )であるため、自動的に候補になりますが、FallingDownが発生する前に"Stunned"も世界マスクにブロードキャストされる必要があります。

Running Ability
local AvatarAbilities = require("@rbx/AvatarAbilities")
local Identifiers = AvatarAbilities.Identifiers
local Ability = Identifiers.Ability
local Rule = AvatarAbilities.Rule
local Sensor = Identifiers.Sensor
local All, Any, Not = Rule.All, Rule.Any, Rule.Not
local Running: AvatarAbilities.AbilityDefinition = {
Name = Ability.Running,
Labels = { "CanFallDown" }, -- 能力がアクティブなときにブロードキャストされるラベル
StartsWhen = Sensor.Ground,
RunsWhile = Sensor.Ground,
}
FallingDown Ability
local AvatarAbilities = require("@rbx/AvatarAbilities")
local Identifiers = AvatarAbilities.Identifiers
local Ability = Identifiers.Ability
local Rule = AvatarAbilities.Rule
local Sensor = Identifiers.Sensor
local All, Any, Not = Rule.All, Rule.Any, Rule.Not
local FallingDown: AvatarAbilities.AbilityDefinition = {
Name = Ability.FallingDown,
StartsWhen = All( "CanFallDown", "Stunned" ), -- 能力を開始するために必要なラベル
Blocks = { Ability.Running }
}

ラベルは、TimedLabels辞書を使用してタイムド方式でブロードキャストまたは消費することもできます。

キー説明
TimedLabels.OnStartラベル(キー)と関連する期間を含む辞書。能力が開始されるときにラベルがブロードキャストされ、期間が終了すると自動的に期限切れになります。たとえば、OnStart = { Dashing = 1 }は、能力が開始されるときにDashingラベルを1秒間ブロードキャストします。
TimedLabels.OnStopラベル(キー)と関連する期間を含む辞書。能力が停止されるときにラベルがブロードキャストされ、期間が終了すると自動的に期限切れになります。たとえば、OnStop = { DashCooldown = 2 }は、能力が停止されるときにDashCooldownラベルを2秒間ブロードキャストします。
TimedLabels.Consumes能力がアクティブ化されるときに削除(消費)されるラベルのリスト。たとえば、格闘ゲームでプレイヤーが相手の攻撃をブロックした後にカウンター攻撃を許可する場合、CounterAttack能力はStartsWhen = "AfterBlock"とTimedLabels = { Consumes = { "AfterBlock" } }の両方を含むことができ、CounterAttack能力の二重トリガーを防ぎます。
Timed Labels
local AvatarAbilities = require("@rbx/AvatarAbilities")
local Identifiers = AvatarAbilities.Identifiers
local Rule = AvatarAbilities.Rule
local Sensor = Identifiers.Sensor
local All, Any, Not = Rule.All, Rule.Any, Rule.Not
local Dash: AvatarAbilities.AbilityDefinition = {
Name = "Dash",
StartsWhen = All( Sensor.Ground, Not("DashCooldown") ),
RunsWhile = "Dashing",
TimedLabels = {
OnStart = { Dashing = 1 },
OnStop = { DashCooldown = 2 },
},
}

条件

条件は、StartsWhenおよびRunsWhileで使用される1つ以上のラベル、センサー、または入力参照です。条件は、実行時にビットマスク操作にコンパイルされ、評価は整数演算です — テーブルウォークや文字列比較はありません。

目標構文例
1つの必須条件。StartsWhen = Sensor.Ground
世界マスク内にすべてのラベルが存在し、すべてのセンサーがアクティブなときのANDロジック。All()StartsWhen = All( "CanFallDown", "Stunned" )
世界マスク内に任意のラベルが存在するか、任意のセンサーがアクティブなときのORロジック。Any()StartsWhen = Any( "WallClimbing", "Climbing" )
ラベルが世界マスク内に存在しないこと、センサーがアクティブでないことを示す否定。Not()RunsWhile = Not("Stunned")

条件評価は、より複雑なロジックのために組み合わせることができ、たとえば、センサーがアクティブである必要があり、ラベルが存在しないことを示すためにAll()チェーンとNot()を使用できます:

local AvatarAbilities = require("@rbx/AvatarAbilities")
local Identifiers = AvatarAbilities.Identifiers
local Rule = AvatarAbilities.Rule
local Sensor = Identifiers.Sensor
local All, Any, Not = Rule.All, Rule.Any, Rule.Not
local Dive: AvatarAbilities.AbilityDefinition = {
Name = "Dive",
StartsWhen = All( Sensor.WaterSurface, Not("Recovering") ),
}

衝突

一部の能力は、他の能力がアクティブなときにはアクティブにできません。たとえば、キャラクターは泳いでいるときにジャンプできず、落下中に走ることもできません。エンジンは、能力の定義内でこれらの衝突を宣言的に解決します。

衝突キー目的
Blocks所有する能力がアクティブな間、リストされた他の能力は開始できません。たとえば、ScopeAim能力はBlocks = { Ability.Running, Ability.Jumping }を含むことで、キャラクターが武器のスコープを通して慎重に狙っている間に走ったりジャンプしたりできないようにします。
Stops所有する能力が開始されると、リストされた他の能力は強制停止され、再トリガーする必要があります。たとえば、Hover能力はStops = { Ability.Running }を含むことで、ホバリングを開始したときにキャラクターの走行動作を即座に停止させます。
Suspends所有する能力が開始されると、リストされた他の能力は一時停止され、所有する能力が停止すると自動的に再開されます。たとえば、カスタムスプリント能力はSuspends = { Ability.Running }を含むことで、スプリント開始時に走行が🄐一時停止し、🄑スプリント中にブロックされ、🄒スプリント停止時に再開されます。

もう1つのユニークな衝突キーはExclusiveGroupで、複数の能力をグループに配置し、それぞれにPriority値を持たせます。グループ内では1つの能力のみがアクティブになり、高い優先度のものが勝ちます。ただし、挑戦者が保持者の名前/ラベルをターゲットにしたStopsを宣言すると、優先度に関係なく勝ちます。

次のセットアップでは、3つの能力(Sprinting、Crouching、Stagger)がLocomotion排他的グループに追加されます。Sprintingは最高の優先度(200)を持っているため、Crouching(100)よりも勝ち、2つは同時に実行されることはありません。ただし、Staggerはスプリントを強制的に停止させるため(Stops = { Ability.Sprinting })、その優先度(150)が低くてもSprintingを中断して上書きすることができます。

local AvatarAbilities = require("@rbx/AvatarAbilities")
local Identifiers = AvatarAbilities.Identifiers
local Ability = Identifiers.Ability
local Rule = AvatarAbilities.Rule
local Sensor = Identifiers.Sensor
local All, Any, Not = Rule.All, Rule.Any, Rule.Not
local Sprinting: AvatarAbilities.AbilityDefinition = {
Name = Ability.Sprinting,
ExclusiveGroup = { Name = "Locomotion", Priority = 200 },
}
local Crouching: AvatarAbilities.AbilityDefinition = {
Name = Ability.Crouching,
ExclusiveGroup = { Name = "Locomotion", Priority = 100 },
}
-- 優先度の低い能力が優先度の高い能力を停止させることができます
local Stagger: AvatarAbilities.AbilityDefinition = {
Name = "Stagger",
ExclusiveGroup = { Name = "Locomotion", Priority = 150 },
Stops = { Ability.Sprinting },
}

入力

能力のInput定義は、能力をアクティブ化しようとするために使用される入力を指定します。入力の動作、アクションスロット、およびオプションのタッチボタンアイコンを構成するキーと値のペアを取ります。

local AvatarAbilities = require("@rbx/AvatarAbilities")
local Identifiers = AvatarAbilities.Identifiers
local Rule = AvatarAbilities.Rule
local Sensor = Identifiers.Sensor
local All, Any, Not = Rule.All, Rule.Any, Rule.Not
local Dash: AvatarAbilities.AbilityDefinition = {
Name = "Dash",
Input = { InputName = "Dash", Mode = "Press", ActionSlot = 5 }
}
  • InputNameは論理名であり、キーではありません。CCLは入力センサーを生成し、常にStartsWhenにANDします。

  • Modeは、この入力が能力をどのように開始および停止するかを定義します。RunsWhileは入力自体を含むことはなく、地面にいることや水中にいることなどの世界の条件のみを保持します。したがって、Modeは入力駆動の開始と停止の唯一のソースです:

    モード開始入力から停止
    Press押したとき。決して。能力は、衝突、自身のRunsWhile、またはStop()を呼び出すことで自ら終了します。
    Hold押したとき。放したとき。
    HoldとRepeats押したとき。放すと再発火が終了し、すでに飛行中のサイクルは終了しません。
    Toggleトグルオンのとき。トグルオフのとき。

    Pressはダッシュ、攻撃、投げなどの離散的なアクションに適しています。HoldとToggleはスプリント、狙い、ブロック、しゃがみ、浮遊などの持続的なアクションに適しています。HoldとRepeatsは、保持中に自己停止し再発火するアクション(たとえば、繰り返しジャンプ)に適しています。

  • Repeats(ブール値、Holdのみ)は、能力が各サイクルで自己終了し、入力が保持されている間に再発火するようにします。全体の保持の間に継続的に実行されるのではありません。

  • OutlivesInputWhile(Hold/Toggleのみ)は、能力がリリースまたはトグルオフを超えて実行され続ける条件です。特定の世界条件の下で入力を超えて能力が持続する必要がある場合に使用します。

  • ActionSlotは、入力アクションシステム内のInputActionsおよびInputBindingsのリストに関連付けられたアクションスロットを定義します。

    Several action slot input bindings are predefined by Roblox and, in the future, the Input Action Manager will allow you to reconfigure default input bindings for action slots as desired. Setting ActionSlot to 0 will choose the next available empty slot. On mobile devices, slots 1-7 populate to buttons on the screen (see diagram below).

    スロットキーボード & マウスゲームパッドタッチデフォルト割り当て
    1SpaceButtonA①ジャンプ
    2LeftShiftButtonL1②スプリント
    3LeftControlButtonB③しゃがむ
    4RButtonX④
    5MouseLeftButtonButtonR2⑤
    6QButtonY⑥
    7XButtonR1⑦
    8CButtonL2
    9FDPadLeft
    10GDPadRight
    11VDPadDown
  • CustomIcon、CustomIconActive、およびCustomIconInvalidは、能力がアイドル状態、アクティブ状態、または利用できない状態のときのタッチボタンのRobloxアセットIDを指定します。

RunsWhileは世界の条件のみを保持します。コンパイラは、Modeに基づいて入力の効果を能力の実際の継続に組み込みます。したがって、入力自体をStartsWhenやRunsWhileに入れるとエラーが発生します(そこにRule.Inputを参照しないでください)。HoldとToggleの能力は、デフォルトでリリースまたはトグルオフで停止するため、RunsWhileにそれを重複させる必要はありません:

local AvatarAbilities = require("@rbx/AvatarAbilities")
local Rule = AvatarAbilities.Rule
local Sensor = AvatarAbilities.Identifiers.Sensor
local All, Any, Not = Rule.All, Rule.Any, Rule.Not
local Glide: AvatarAbilities.AbilityDefinition = {
Name = "Glide",
Input = { InputName = "Glide", Mode = "Hold", ActionSlot = 6 },
StartsWhen = Not(Sensor.Ground),
RunsWhile = Not(Sensor.Ground),
}

HoldまたはToggleの能力が特定の世界条件の下で入力を超えて持続するようにするには、RunsWhileに入力を追加するのではなく、OutlivesInputWhileを設定します。次のCrouching能力は、プレイヤーがしゃがみ入力を放した後も、何かが上に残っている限りしゃがみ続けます:

local AvatarAbilities = require("@rbx/AvatarAbilities")
local Identifiers = AvatarAbilities.Identifiers
local Sensor = Identifiers.Sensor
local Crouching: AvatarAbilities.AbilityDefinition = {
Name = "Crouching",
Input = { InputName = "Crouch", Mode = "Hold", OutlivesInputWhile = Sensor.Ceiling, ActionSlot = 3 },
RunsWhile = Sensor.Ground,
}

センサー

センサーは、エンジンがあなたのために読み取る世界に関する名前付き値です。通常、センサーを読み取ることが多く、書き込むことは少ないです。便利なことに、いくつかのセンサーが事前に登録されています:

センサー説明
Sensor.Ground表面に立っている
Sensor.IsMoving移動入力が適用されている
Sensor.MoveInput移動ベクトル自体
Sensor.Ceiling何かが真上にある
Sensor.Climb登れる表面が範囲内にある
Sensor.Water / Sensor.WaterSurface水中にいる / 表面にいる
Sensor.Sit座っている
Sensor.Tipped倒れた
Sensor.ToolToolを持っている
Sensor.LookDirectionInput指示された視線の方向
Sensor.RotateToLookDirectionInputキャラクターが指示された視線の方向に回転すべきかどうか

コールバック

能力のコールバック関数を使用すると、特定の動作をスクリプト化できます:

カスタム能力をサーバーで登録しますが、そのコールバックは予測されたクライアントシミュレーションと権限のあるサーバーシミュレーションの両方で実行されます。コールバックの動作は決定論的である必要があり、両方のシミュレーションが同じ結果を生成するようにします。

コールバック実行されるタイミング使用例
OnSetup(managerCtx, abilityCtx)能力が登録されるときに1回実行されます。参照をキャッシュしたり、状態を初期化したりします。
OnStart(managerCtx, abilityCtx, hadLabel)能力がアクティブ化されるたびに実行されます。インパルスなどの効果を適用します。hadLabel()関数は、アクティブ化が開始されたときに指定されたラベルが存在していたかどうかを報告します。
OnUpdate(managerCtx, abilityCtx)各アクティブフレームで実行されます。タイマーやフレームごとの力などの継続的な作業。
OnStop(managerCtx, abilityCtx)各非アクティブ化時に実行されます。自発的または強制的。OnStart()で行ったことを元に戻します。
OnTeardown(managerCtx, abilityCtx)能力が削除されるときに実行されます。接続を切断したり、インスタンスを破壊したりします。

各コールバック関数の最初のパラメータmanagerCtxは、共有キャラクターおよびマネージャーのプロパティを持つManagerContextオブジェクトです:

  • managerCtx.AbilityOwner — キャラクターのModelで、managerCtx.AbilityOwner.PrimaryPartがルートパートです。
  • managerCtx.AbilityManager — 能力が自身のコールバック内で能力を追加、削除、クエリできるようにするためのマネージャーの簡略化されたビューです。
  • managerCtx.BodyParts — キャラクターの体の部分で、各肢の衝突をオンまたはオフにするためのヘルパーがあります。
  • managerCtx.ControllerManager — キャラクターのControllerManagerで、物理制御を行います。物理を必要とする登録された能力がない場合はnilになることがあります。
  • managerCtx.RootCFrame — ルートパートのCFrameで、フレームの開始時に1回スナップショットされ、コールバックがそれぞれ自分で取得しないようにします。
  • managerCtx.RootLookVector — キャラクターのルートパートが向いている方向。
  • managerCtx.RootUpVectorY — ルートパートの上向きベクトルのY成分。
  • managerCtx.TaskSynchronize() — 並列コールバックサポートが有効な場合、DataModelアクセスの前にコールバックを同期します。現在、OnUpdateは並列コンテキストで実行されないため、この関数は効果がありません。完全な並列Luauサポートは将来のアップデートで計画されています。

2番目のパラメータabilityCtxは、現在の能力登録のためのエンジン管理テーブルを持つAbilityContextオブジェクトです:

  • abilityCtx.Config — この能力登録の読み取り専用構成値。
  • abilityCtx.State — DataModelを通じて複製される可変状態。サーバー権限は、ロールバックおよび再シミュレーション中にこれらの値を復元します。
  • abilityCtx.Local — 複製されず、ロールバックに参加しない可変のスクラッチ状態。

カスタムコールバックデータはabilityCtx.StateまたはabilityCtx.Localに保存します。abilityCtxに直接カスタムフィールドを書き込むことはエラーです。

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