スキルが3個のうちは、クールダウンもコストも自分で書けます。bCanUseFireball と Set Timer で十分です。ところがスキルが15個になり、「毒状態だと詠唱できない」「バフ中は消費MPが半分」「スタン中は全部止まる」といった条件が絡み始めると、フラグの組み合わせが手に負えなくなります。
UEには、この領域を 丸ごと引き受ける Gameplay Ability System(GAS) があります。強力ですが、導入コストも相応にかかります。この記事のゴールは、GASを完全に使いこなすことではありません。 自作のスキルシステムで足りるのか、GASを入れるべきなのかを、自分で判断できるようになる ことです。
先に前提を1つ。 GASの導入にはC++が必要です。 Blueprintだけでは完結しません。この記事は BlueprintからC++への移行入門 を終えた人を想定しています。
この記事でわかること
- GASが引き受けてくれる仕事の範囲
- 5つの登場人物(ASC / Ability / Effect / Attribute Set / Tag)
- Attribute と Gameplay Effect の3つの持続タイプ
- Cost と Cooldown が「Effectとして表現される」仕組み
- Gameplay Tagで「今は撃てない」を表す方法
- 実践: MP20消費・クールダウン5秒のファイアボール
- 入れない判断 の基準
GASが引き受ける仕事
GASは「スキルを作る機能」ではありません。スキルの周りにある 面倒な共通処理 をまとめて引き受ける仕組みです。
自作でスキルを1個作るとき、実際に書くことを並べてみます。
| やること | 自作だと |
|---|---|
| 発動できるか判定 | bCanUse などのフラグを自分で管理 |
| MPを消費する | 変数を減らす。足りるかの事前チェックも自分で |
| クールダウンを回す | Timerを1つ持ち、残り時間をUIへ伝える |
| 効果を適用する | 相手のHPを減らす。防御力の計算もここ |
| バフ・デバフを重ねる | 重複したときの扱いを毎回考える |
| 状態異常で止める | スキルごとに「スタン中か」を確認 |
ス キルが3個なら、この表を3回書くだけです。15個になると、6列 × 15行の管理になります。しかも列同士が干渉します。

GASは、この表の 左の列を全部エンジン側に持っていきます 。あなたが書くのは「このスキルは何をするか」だけになります。
代わりに払うのは、登場人物を5つ覚えるコストと、C++で最低限の土台を組むコストです。 この交換が割に合うかどうかが、この記事の判断ポイント です。
5つの登場人物
GASは部品の名前が多くて、そこで挫折しがちです。ただし中心になるのは5つだけです。

| 登場人物 | 役割 | 例えると |
|---|---|---|
| Ability System Component(ASC) | 全部の窓口。Actorに1つ付ける | 受付カウンター |
| Gameplay Ability | 1つのスキルの中身 | 「ファイアボールを撃つ」手順書 |
| Gameplay Effect | Attributeを変える指示 | 「HPを30減らす」伝票 |
| Attribute Set | HP・MPなどの数値の入れ物 | ステータス表 |
| Gameplay Tag | 状態や種類を表す文字列の階層 | 付箋(State.Stunned) |
流れで見ると単純です。プレイヤーがボタンを押す → ASCに「このAbilityを発動して」と頼む → ASCがコストとクールダウンとタグを確認 → 通れば Ability が走る → Ability が Gameplay Effect を相手に適用する → Effect が Attribute を変える。
ゲーム中のAttributeの増減は、原則としてGameplay Effect経由で書きます。 ダメージも回復もバフも、直接Setせずに伝票(GE)を切る。ここがGASのいちばんの流儀で、慣れるまでは遠回りに感じるところです(初期値の設定など、管理的な代入まで禁止というわけではありません)。
Gameplay Tagについては Gameplay Tagsでタグベースの柔軟な設計 で先に扱っています。GASはこのタグを全面的に使うので、先にそちらを読んでおくと理解が速くなります。
AttributeとGameplay Effect
Attribute は、GASが管理する数値です。HP、最大HP、MP、攻撃力、移動速度。ゲームのステータスと呼ばれるものは、だいたいAttributeになります。
Attributeは float ですが、ただの変数ではありません。 Base値とCurrent値の2つ を持ちます。
- Base値:基準になる値。ダメージや回復のように 永続的に変わる 増減は、こちらが動く
- Current値:Base値に、いま効いているバフ・デバフを乗せた結果。 実際に使われる値
攻撃力のBaseが10で、+5のバフがかかっていればCurrentは15。バフが切れると、何もしなくてもCurrentは10へ戻ります。 「バフを外したら元に戻す」処理を自分で書かなくていい のは、この構造のおかげです。

Attributeを変えるのが Gameplay Effect(GE) です。GEには持続の仕方が3種類あります。
| 持続タイプ | 挙動 | 使う場面 |
|---|---|---|
| Instant | 即座に Base値 を変えて消える | ダメージ、回復、MP消費 |
| Has Duration | 一定時間 Current値 を変え、切れると戻る | 5秒の攻撃力アップ、移動速度低下 |
| Infinite | 明示的に外すまで Current値 を変え続ける | 装備の補正、常時オーラ |
ここは間違えやすいので、もう一度。 ダメージはInstant(Baseを削る)、バフはDurationかInfinite(Currentを動かす) 。攻撃ダメージをDurationで作ると、時間が経つとHPが勝手に戻ります。
なお、Duration/Infinite に Period(周期) を設定すると話が変わります。周期ごとにInstantと同じ扱いで実行されるので、 Base値が削れて戻りません 。毒や継続回復はこちらで作ります。「時間で戻るのがDuration」は、周期を付けていない場合の話だと覚えておいてください。
Gameplay Effectのアセットは、GameplayEffect を親にしたBlueprintとして作ります。グラフは書きません。 Class Defaultsの設定だけで完結する 、データに近いアセットです(→ Data Assetによるデータ駆動設計 と同じ発想です)。
CostとCooldownもEffectで表す
GASを触っていて「なるほど」となるのが、ここです。
MP消費もクールダウンも、中身はただのGameplay Effectです。 Abilityに専用の指定欄はありますが、そこに入れるのは普通のGEアセットで、特別な仕組みは何もありません。
