堕落街道まっしぐら。

現在のゲームプレイ状況: アリスギア = ウマ娘 > DMMブラゲ > Crossout >> それ以外

MUGEN記述/AttackDistの重要性

普段はガードが硬いAIなのに、
遠距離からの攻撃(リーチの長い攻撃やビーム系の攻撃など)に対しては頻繁に被弾してしまう、
そんな光景を見た人も少なくないと思います。今回はそんな光景に関するお話。


攻撃動作を構成する要素として AttackDist というものがあります。
これは「相手がこちらの攻撃に対してガード動作を実行する距離」であり、
プレイヤー操作ではこの範囲内に居る時後ろキーを押すことでガード動作を行います。

内部処理は少し違いますが、AIでもガードを行う条件としては同じようなもので、
この範囲(InGuardDist)内に居る場合のみガードの実行を認識することができます。

しかしこのAttackDistは必ずしも攻撃範囲と一致するわけではなく、cnsで設定された値より
リーチの長い攻撃や、背後に届く攻撃に対しては圏外である場合がほとんどだったりします。
このAttackDistの届かない範囲にいる相手に対して自分の攻撃が届いてしまった時、
その攻撃はAIに対してガード不能な攻撃となってしまうわけです。
(人間操作の場合は後ろキーさえ入れていればAttackDistが足りなくてもガードできる)


ではどうするか。
対策としては、少なくとも攻撃する側/攻撃される側の両方がありますが、
これはキャラ制作上の不具合と言っても良いレベルなので出来る限りは攻撃する側が対応しましょう。


・攻撃する側の解決方法

 cnsファイル内[size]項目にあるattack.dist(proj.attack.dist)値を増やす
  カンフーマンを基にして作られているキャラだと初期値は160(90)になっていると思います。
  ですがこれよりリーチの長い攻撃や横幅のある飛び道具を持つ場合は数値を増やす必要があります。
  AttackDistは「攻撃するキャラ(飛び道具)の中心軸から前方方向にのみ発生する」ので、
  キャラの中心から最もリーチの長い攻撃の先端までの距離+50~80くらいが良いかと思われます。
  相手がこの範囲に入ったと認識できるのは「相手キャラのぶつかり判定先端」ではなく
  「相手キャラの中心軸」なので、多めに取らないとガード認識する前に攻撃が届いてしまったり、
  離れた位置から突進技などを出して突っ込んでしまったりしますし、
  逆に長すぎるとガード状態のまま手を出しにくくなってしまったりするので、
  この辺の調整はそれぞれの判断に委ねられることになります。

 攻撃動作のステート内(もしくは常時監視ステート)に AttackDist のステートコントローラーを設置する
  一部の攻撃のみリーチが長い場合はこちらの方が相手AIにも優しいです。
  該当する攻撃ステートのどこかにAttackDistのステコンを設置して、
  一時的に相手がガードを行う距離を伸ばしてあげるわけです。
  攻撃判定が発生する直前からではなく事前に(動作を開始した直後から)から実行させてください。
  予め身構えさせることができます。逆にこれをしないとやる意味が薄れます。
 (人によっては攻撃発生前の隙を突けなくなるから無い方がいいという考えもある)

[State ****, AttackDist]
type = AttackDist
trigger1 = 1 ;場合によっては攻撃判定が消失した後は実行されないようにするとベター
value = *** ;相手がどれくらいの距離に入ったらガードを認識するか


 上記AttackDistを実行するHelperを設置する
  要領は同じで、AttackDistを発生させるHelperを設置して相手がガードを認識できる範囲を補ってあげます。
  自分の背後にも届く攻撃やProjectile発生中の場合に活用すると良いかも。
 (上の方にあるとおりAttackDistはキャラの中心軸から前方にしか発生しないため、
  背後にいる相手に対して届く攻撃を出すと相手AIはガードができない)
 (Projectileが発生している間はキャラ本体からのAttackDistが0になるため、
  飛び道具を潜り抜けてきた相手に対して打撃を振るとその攻撃を相手AIはガードできない。
  これも人によっては隙を突けなくなるから無い方がいいという考えもある)

;------------------------------------------------------------------------------
; AttackDist補助(常時監視ステート内に設置)
;------------------------------------------------------------------------------
[State -2, AttackDist Support]; AttackDistが届かないところは補助ヘルパー設置
type = Helper
triggerall = !NumHelper(9100) && MoveType = A
trigger1 = StateNo = **** ;貼りたいステートNo
trigger2 = StateNo = **** ;同上/複数ある場合はtriggerを分ける
name = "AttackDist"
ID = 9100
stateno = 9100
ownpal = 1
postype = p1
pos = 0,0
size.xscale = 1
size.yscale = 1
supermovetime = 99999
pausemovetime = 99999


;==============================================================================
[Statedef 9100]; AttackDist補助ヘルパー(適当なcnsファイル内に設置)
;==============================================================================
type = A
movetype = A
physics = N
anim = 9999 ;;0番アニメでもいいけど出来ればやられ判定の無いActionNo
ctrl = 0

;- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
[State 9100, -1/NotHitBy]; 無敵
type = NotHitBy
trigger1 = 1
value = SCA
time = 1

[State 9100, -1/AssertSpecial]; 影消し+非表示
type = AssertSpecial
trigger1 = 1
flag = NoShadow
flag2 = Invisible

[State 9100, -1/BintToParent]; 本体に追従
type = BindToParent
trigger1 = 1
pos = 0,8 ;設置地点を変える場合はここを弄る
facing = 1 ;向きを変える時(逆方向にAttackDistを出現させる場合等)はここを -1 に

[State 9100, -1/AttackDist]; ガード認識距離
type = AttackDist
trigger1 = 1
value = *** ;どこまで有効圏を広げるかはここを弄る/Nullなどで無効化した場合は[size]内attack.dist依存

;- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
[State 9100, F/DestroySelf]; 消滅処理
type = DestroySelf
trigger1 = Root,StateNo != **** ;親が該当ステートじゃなくなったらゴミ箱
trigger1 = Root,StateNo != **** ;同上/複数ステートが該当する場合も全部 trigger1

;- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
[State 9100, F/SelfState]; 間違いで本体が来たら立ちへ移行
type = SelfState
trigger1 = !IsHelper
value = 0
ctrl = 1



・攻撃される側の解決方法(AI製作者向け)

 ~蠎蠅MoveTypeを観察する
  P2MoveType = AやEnemyNear,MoveType = Aなどで相手が攻撃状態の時は
  AttackDist範囲内に居るか居ないかに関わらず、とりあえずガードさせようっていうタイプ。
  相手がAttackDist不足の攻撃を出していてもガードが期待できる半面、
  相手が攻撃を行わないステートでMoveType = Aだった場合もガードをしようと身構えてしまったり、
  相手がMoveType = Aじゃない場合にはガードを実行しないのが欠点。
  InGuardDistと組み合わせて使うとそれなりに堅くはなるけどガード一辺倒にならないよう注意。

 HelperにInGuardDistを感知させる
  自分の前方または後方にHelperを設置して、
  そのHelperがAttackDist範囲内に入ったら本体もガード準備をしようというタイプ。
  AttackDist不足のリーチが長い攻撃や、自分の背後に落ちる飛び道具などにも対応できるようになる。
  こっちもやりすぎるとガードしている時間が増えてしまい攻撃が出来なくなってしまうので注意。



攻撃する側としては相手にダメージを与えやすくなるので黙認したい部分もあると思いますが、
攻撃される側に立った時にこれのせいで負けてしまうと納得が行かなかったりするでしょうし、
やはりきちんとAttackDistを攻撃のリーチと対応させておくべきだと思います。
うちの「チェッカーマン」やstupa氏の「いっしょにトレーニング」を使えば
AttackDistがどこまで伸びているか や 相手がAttackDist内に入っているか を確認できます。