★☆ キャラ制作奮闘記 ☆★
(2001.03.06)
What's AI ? 〜応用編〜
AI について、もう少し書いてみたいと思う。
前回書いたサンプル AI は、状況(相手の状態)に対応して技を出す、「対応型」とでも言うべき
AI だった。
それだけでは説明としては不十分かな、とも思うので、今回は自分から攻め込むタイプ、いうなれば
「攻撃型」AI について考えてみたい。
さて、対応型だろうが攻撃型だろうが、AI であることには変わりはないので、その基本構造は
両者とも同じだ。
結局は、状況判断の条件が、より能動的(攻撃的)になるだけのことなのだ。
なので、今回は状況判断ロジックについてのみの解説とする。
前提条件として、COM使用キャラ証明用のスイッチは前回と同じくVar(30)を使用。
さて、ここではもっとも典型的な攻撃型AIの例として、連続攻撃を決めるAIを考えてみよう。
まずは、普通にプレイヤーが操作して連続技を決める場合、プレイヤーはどんな判断を
しているのだろうか。
・1発目の技を出す。
・1発目がHITしたなら、2発目の技をだす。1発目が外れていたら終了。
・2発目がHITしたなら、3発目の技をだす。2発目が外れていたら終了。
・3発目がHITしたなら、・・・・・(以下、最後の技まで続く)
これをAI非搭載のCOMキャラがやろうとするとどうなるのか。
・1発目の技を出すコマンドが選択されれば、1発目の技を出す。
・1発目がHITしており、2発目のコマンドが偶然選択されれば、2発目の技を出す。
・2発目がHITしており、3発目のコマンドが幸運にも選択されれば、3発目の技を出す。
・3発目がHITしており、・・・・・(以下、最後の技まで続く)
なんて感じになるだろう。
前回も説明したように、通常のCOMは、CMDファイルに定義されたコマンドを
ランダムに選択して技を出しているにすぎない。
従って、連続攻撃になる可能性は、コマンドの定義数が多ければ多いほど、極めて低くなることが
わかってもらえるだろう。
さて、AI である。
AIでは、ランダムで選択されたコマンドは無視させるのだと前回書いた。
従って、1発目がHITしていれば、2発目のステートに移行するように、ステートを定義してやればいい。
例えば、こんな感じですな。
; Combo Attack for AI ; Section 1 ;[State -1,1] type = ChangeState value = 210 trigger1 = p2statetype != L ; Not Lie down trigger1 = P2movetype != A ; Not in Attack trigger1 = var(30) = 30 ; AI = on trigger1 = p2bodydist X < 40 ; Near P2> trigger1 = p2bodydist X > 17 ; Near P2> trigger1 = statetype = S ; Standing trigger1 = ctrl ; Enable Control ; Section 2 [State -1,1] type = ChangeState value = 230 trigger1 = p2statetype != L ; Not Lie down trigger1 = var(30) = 30 ; AI = on trigger1 = StateNo = 210 ; Attack by Standing x trigger1 = movecontact ; Hit! ; Section 3 [State -1,1] type = ChangeState value = 220 trigger1 = p2statetype != L ; Not Lie down trigger1 = var(30) = 30 ; AI = on trigger1 = StateNo = 230 ; Attack by Standing a trigger1 = movecontact ; Hit! [State -1,1] : : :
これは、現在試作中のアテナ95用攻撃型AIからの抜粋だったりする。^-^;
この例では、遠距離立ち小パンチ→立ち小キック→遠距離立ち中パンチとつなぐコンボだ。
理屈としては、1発目の攻撃が相手に届いていれば2発目を放ち、2発目の攻撃が相手に
届いていれば3発目を、と次々とチェーンをつないでいく訳だ。
こうしておけば、例えば偶然2発目の攻撃をCOMが出し、それが相手に届けば、3発目以降の
チェーンコンボをつなごうとしてくれることになる。
対応型よりも条件がシンプルになる分、理解し易いのではないだろうか。
ここで注目して欲しいのは、2発目・3発目では自分の状態(立ち・屈み・空中)を一切考慮して
いないということだ。
なにか、ここだけを見ると、例えば空中で地上技が出てしまいそうな気がするかもしれないが、
さにあらず。
2発目・3発目いずれも、「先の攻撃が相手に届いていれば発動」という条件になっている。
「先の攻撃」を辿っていくと、1発目の定義まで遡るが、ここでは細かく自分の状況を指定してある。
1発目が当たった=1発目を出した=正しい状況で技を出している、という判断をするので、
2発目以降の条件は、このようにシンプルなものになっているのだ。
さて、ここでちょっとひねって考えてみよう。
例えば、先の例だと屈み攻撃がHITしても、AI によるチェーンは起きない。
また、近距離の立ち攻撃がHITしても同様だ。
どうせなら、これらの攻撃が当たっても、チェーンコンボを狙える AI にしてみよう。
; Combo Attack for AI ; Section 1 ;[State -1,1] type = ChangeState value = 210 trigger1 = p2statetype != L ; Not Lie down trigger1 = P2movetype != A ; Not in Attack trigger1 = var(30) = 30 ; AI = on trigger1 = p2bodydist X < 40 ; Near P2> trigger1 = p2bodydist X > 17 ; Near P2> trigger1 = statetype = S ; Standing trigger1 = ctrl ; Enable Control ; Section 2 [State -1,1] type = ChangeState value = 230 triggerall = p2statetype != L ; Not Lie down triggerall = var(30) = 30 ; AI = on trigger1 = StateNo = 210 ; Attack by Standing x trigger1 = movecontact ; Hit! trigger2 = StateNo = 200 ; Attack by Standing x trigger2 = movecontact ; Hit! trigger3 = StateNo = 400 ; Attack by Crouching x trigger3 = movecontact ; Hit! ; Section 3 [State -1,1] type = ChangeState value = 220 triggerall = p2statetype != L ; Not Lie down triggerall = var(30) = 30 ; AI = on trigger1 = StateNo = 230 ; Attack by Standing a trigger1 = movecontact ; Hit! trigger2 = StateNo = 430 ; Attack by Crouching a trigger2 = movecontact ; Hit! [State -1,1] : : :
こんな感じかな?
これで遠近立ち屈みに関わらず、攻撃が1発入れば、そのままチェーンコンボを狙うAIに
なった訳ですな。
もちろん、これ以外にも方法は考えられる。
地球さんのHP
では、Varを使った連続技の制御方法を掲載されているので、参考にしてみるといいだろう。
要は、コンボを狙わせるための条件(trigger)を、如何にして設定するか、なのだ。
今回の例は通常技によるチェーンコンボだったが、必殺技を絡めた連続技の場合も理屈は同じなので、
応用してみて欲しい。
さぁ、貴方も自分のキャラにAIを搭載してみませんか?