※あくまで私の制作方法に則った手引きです。 ※不備ありそうです。 AI制作の手引き その1「キャラクターの情報」 by ADI 15:52 2011/10/29 ちょっと追記 17:07 2010/12/01 18:14 2010/09/27 とれ拡張の話をちょくちょく追加 22:32 2010/09/20 ユニット番号についてちょっと 00:43 2010/06/20 11:49 2010/05/12 ちょいちょい ・・・ 00:24 2009/10/22 AIの初歩 から書き直し始め |
ステート記述に関して大体分かってきたらAIを制作… …する前に、その為に必要な情報をメモしていきます。 まずAIは【AI制作者の考える動作を、CPUが代行しているだけ】。 厳しい言い方になりますが、「格闘ゲームが苦手だけどAIなら〜」というのは危険です。 AIという通称でも、あくまでコンピュータープログラム、CPUです。 処理命令をつけてやらないと作動しません。 「どういう時、どういう動作をするべきか」を考えるのはAIを作る人です。 とは言うものの、強さをそこまで気にしないのなら、 あとはステートの記述方法さえ分かっていれば大丈夫ですが。 ただし、複雑なシステムを持っているキャラなどは、 初めてステートプログラムを触れる人には向きません。 ステート記述を眺めたりしていって、構造に慣れておかないと、 挫折するか大失敗するかのどちらかです。 ステートの勝手が分かるようになるまでは、 簡単なキャラ、KFMなどをいじるといいかも。 |
0.CNSの形式を知る。 ↓ 1.キャラの動きを調べる(動作など) 2.キャラの性能を調べる(細かい数値) 3.キャラの動作の予定表を作る。 ↓ 4.キャラの内部処理を調べる。(Var・Commandなど) 5.キャラの内部処理をAI用に記述調整する。 ↓ 6.テストしつつキャラの動作を記述していく。 6−1.防御・反撃系統(攻撃を受けたときなど) 6−2.コンボや特殊動作など(攻撃を当てたとき他) 6−3.基本動作(自由に動ける時) ↓ 7.実戦を何度もさせて問題のある場所を調整する。 |
今回はAI制作に使う「キャラクターの情報」をまとめます。 ■■■1.キャラクターの情報 >技の性能と立ち回り等のメモ まずキャラを操作し、どういう動作が可能かを確認する。 【キャラクターの動きを知らずにAIは作れません】 トレーニングモードや適当な相手と戦って、 どういう状態でどういう動作を行えるのかを確認します。 細かい所は「いっしょにとれーにんぐ」というMUGENキャラを使うと楽です。 必要であれば>いっしょにとれーにんぐ非公式拡張ファイル<も適応させましょう。色々と便利です。 基本としては 地上・空中・対空 の近〜遠距離 切り返しリバーサル・回避技・起き攻め コンボ(キャンセル+目押し)・攻撃失敗時のリカバリー 得意な距離 苦手な距離 その為の移動 等の動作をメモファイルに書いておくといいかも。 細かいことはあとで調べる為、あくまで目安です。 もう一度言いますが【キャラクターの動きを知らずにAIは作れません】 >ステート番号など技の情報 まず前回でも使った-1ステートの場所を開きます。 なお、編集するファイルはダブルクリックすれば、 テキストソフトで開けるようにしておくと何かと便利かもしれません。 ちなみにCmdファイルは、「***.cmd」であることは多いですが、 Defファイルの内容を変えれば、別に***.cmdでなくとも動きます。 .距離確認の為の記述追加 [Statedef -1]; のすぐ下に、 [State -1];◇デバッグ表示 Type = DisplayToClipBoard Trigger1 = 1 Text = "P2BodyDist X=%f, \t P2Dist Y=%f" Params = P2BodyDist X, P2Dist Y IgnoreHitPause = 1 という記述を加えます。 これを加えて読み込ませると、そのキャラのデバッグ表示の最下段に 「 P2BodyDist X=*横の距離数値* P2Dist Y=*縦の距離数値* 」 が表示されるようになるはずです。 デバッグ表示とは、左下などに現れる白い文字たちです。 初期状態だと表示されっぱなしみたいですが消している場合、 Ctrl+Dを押すことで表示されるはずです。 そこで更にCtrl+Dを押していくと次のキャラ・ユニットに回り、 またキャラユニットからヘルパーユニットなどに回り、次がいないと表示が消えます。 .攻撃範囲の確認 P2BodyDist Xは、「相手の衝突判定から自分の衝突判定まで」の距離です。 離れれば数値が増え、密着状態だと 0〜-x 後ろであればマイナス数値。 そして、それぞれの技がどの距離まで届くのか、この数値でメモしていきます。 数値は細かいですが、判定の前後するキャラも居ますので、 細かい数値やギリギリの数値は必要ありません。 相手も動くわけですから、細かくても5刻みの数値でもいいくらいです。 「とれーにんぐ」のCボタン→XボタンやZボタンの目盛りで計れる距離は 「その状態で自分の中心からの距離」であるため数値が多めに出ます。 StartのOptionからPointerTypeを[BodyDist]にするとP2BodyDist X分の数値が出ますので そちらを参照する方が正確です。そしてそれとCボタン+Aボタンを組み合わせて 始動時の数値と技の判定が出る数値を計算すれば、ちゃんとした距離を測れます。 追記※通常の一緒にトレーニングのP2BodyDistの表示には不備があります。 相対値は問題ないので上記の移動距離計測には問題ないものの、 絶対値(P2BodyDist X値)は本来のP2Bodydist Xと異なる場合があります。 ( 非公式拡張ファイルではP2BodyDist Xそのものの数値を用いるようになります ) 当たり判定の大きさ知りたい場合は、Ctrl+Cを押すと判定の枠を表示されます。 青い枠が「くらい判定」で、赤い枠が「攻撃判定」、緑の枠は必要ない何か。 キャラクターの足元に表示されている横棒が、「衝突判定」です。 二回押すと範囲が半透明に塗りつぶされ、三回目で表示が消えます。 P2Dist Yは、「相手の高さから自分の高さまで」の距離です。 自分の基準位置が相手の基準位置より上にあるとプラス数値、 相手の基準位置が上側にあるとマイナス数値が表示されます。 ・図解・ 自 -Y _分_ _的_ 判定枠を出したときの衝突判定の位置が基準位置。 +Y こちらもどの程度の高さまで届くのか、おおよそをメモしておきます。 ちなみに空中の当たり判定もキャラによって異なりますので注意。 KFMは当たり判定が小さい為、目安にすると大体のキャラに当たるかも。 必要ならば始動攻撃の範囲の他、コンボが可能な範囲なども調べましょう。 .ステート番号と発生フレーム数 記録したメモがあれば必要ありません。 追記:いっしょにとれーにんぐ非公式拡張ファイルの 命中・終了フレーム測定の機能で調べるという手もありますが、 デバッグ表示の見方などは覚えていおいたほうがいいかと思います。 ※太い文字以外詳しく読む必要はありません。 デバッグで表示されている情報は
1行目が処理の情報、2行目が「NAME(名前)」と「ID(ID番号)」と(ユニット番号) 3行目 ( 滅多に使わない ) 「ACTIONID」は動画の番号 「SPR」は表示画像のスプライト番号 「ELEMNO」は動画が何枚中何枚目か、その横の「TIME」は動画の何フレーム中何フレーム目か 4行目 ( 特に使う ) →「STATE NO」はStateNo,ステート番号で、何番の処理を行っているか 「CTRL」はCtrl,コントロールのフラグで、基本的に1なら動ける 「TYPE」はStateTypeと呼ばれるもので1から4の数値を表示 >1がS,立ち 2がC,屈み 3がA,空中 4がL,倒れ状態 を表す 「MOVETYPE」はMoveTypeと呼ばれるもので0から2の数値を表示 >0がI,1でも2でない 1がA,攻撃動作中 2がH,くらい動作中 →「TIME」はTimeで,そのステート内での経過フレーム数を表示。 5行目以降が、命令:DisplayToClipBoardで表示している内容。 記述された情報が表示できます。その命令が無ければ何も表示されません。 ( 表示は上書きされ、表示後命令がない場合は消えず、ずっと同じ情報です。 ) ちなみに処理の順番はデバッグ表示と同じ順番でユニット番号の小さい順からです。 ユニット番号の処理は特殊でヘルパーは必ずしも新しい方は処理が後というわけではありません。 詳しくは[ヘルパーに関してのメモ/Helper.txt]の中ほどを参照 太文字にしてある、4行目の「 STATE NO 」と「 TIME 」を調べます。 例えば開始から動かしていない場合、STATE NO : 0 で TIME : xx は増え続けます。 動作を行うとSTATE NOが変化し、TIMEもリセットされるはずです。 STATE NO,ステート番号については、前回説明したとおり「動作の番号」です。 使う基本動作のステートを並べると ;◇ 0:立ち 11:屈み( 10:立ちから屈み 12:屈みから立ち) ;◇ 20:歩き 40:ジャンプ始動 45:空中ジャンプ始動 ;◇100:ダッシュ 105:バックステップ 120:ガード始動 ;◇130:立ちガード待機 131:屈みガード待機 132:空中ガード待機 こんな感じ。( ※ダッシュ・バックステップはキャラによって異なることも ) AIではこれらの動作をさせたい場合、 これらの番号が必要になりますので、メモしておきましょう。 攻撃などの動作は、途中でステートが変化している場合もありますが、 それらは「始めの方」のステート番号をメモします。 次にTIMEはそのステートでの経過フレーム数です。 試合中にキーボード右上の[Pause/Break]を押すと一時停止、 その状態でその隣の[Scroll Lock]を押すと1Fだけ進みます。 ちなみにアニメーションは大抵、数Fに一度動く程度ですが、 TIMEなどを見ていると、しっかり動いている事が分かるはずです。 で、TIMEなどを使って調べることは「攻撃判定の発生フレーム」です。 当たる距離で攻撃を出し、すぐさま[Pause/Break]で一時停止、 [Scroll Lock]を押していって、攻撃が命中した時のTIMEを確認します。 または命中した時に基本一瞬だけ発生する、ヒットポーズという「停止フレーム」 その「一瞬だけ止まった時の数字」で確認することも可能です。 素早くてヒットポーズでも確認できない場合は、 OPTIONS(オプション)の Game Speed を Slow 9 にしましょう。 もしくは「とれーにんぐ」でCボタンを押してから攻撃を出し、 Aボタンでコマ送りしていって確認すると、とても簡単です。 「とれーにんぐ」を使わない場合や、攻撃で停止しない場合は上記の方法を。 そして確認した数字に+1をした数が、発生フレーム数です。 アニメーションフレームは1から、TIMEは0から数えている為、一応+1。 ちなみに技によっては、途中でステートが変化している場合もあります。 その場合、TIMEは始動からの数ではありませんので注意。 また暗転などの演出中もTIMEは動いている為、それの確認は面倒。 追記:とれーにんぐ非公式拡張ファイルならいくらか確実に調べられます。 こちらは全ての技を調べる必要はありません。 調べるのは発生が早い技などだけで十分、 他の技はおおよそ早いか、遅いか程度でかまいません。 ちなみに今回調べる発生フレームは、単なる優先順位用です。 ただし慣れてきたら他の使い道も分かってくるので調べることになりますが。 .-1ステートの控えコピー と 確認 -1ステートの記述は何度も見直したり、見比べたりする為、 メモとして個別のファイルにコピーしておきましょう。 そして、一応なのですが「ステート番号」の確認もしておきます。 前回説明したとおり、-1ステートには、 [State -1, *名前*] Type = ChangeState Value = *始動ステート番号* TriggerAll = Command = "***" ;*コマンド条件式とか* Trigger1 = Ctrl && StateType = ** ;*状況条件とか* Trigger2 = MoveContact && StateNo =*** ;*コンボ条件とか* と言ったような記述が並んでいます。いるはずです。 先ほど記録した動作の名前とステート番号が合っているか、 名前やCommandを参考に、ステート番号を照合しておきます。 ちなみに記述の順番は基本的に「超必殺技・必殺技・通常技」だと思われます。 ただ制作者によって記入名がまちまちなので、 名前が分からなかったり、合っているか疑わしい場合は、 [State -1, Test] Type = ChangeState ;命令:ステート変更 Value = *ここに番号* Trigger1 = StateNo = 0 ;条件:ステート番号0の時 という記述を-1ステートの先頭に書くことで、立ち状態(StateNo=0)なった時、 書いたステート番号へ移り、技であればその技を実行しますので、 それで確認をしましょう。読み込み直しは「試合画面でShift+F4」を活用すると楽です。 Nullでない限り基本、ステート番号は-1ステートのものを基準とします。 Type = null; は無視をして構いません。 ちなみに調べた情報は、 番号 技名(略) 距離 数値 早さ 評価 備考 ,200 A 至近距離 X,40 早xF ○ 最短・コンボ豊富 ,220 6A ・近距離 X,45 遅 × 死に技(遅い+上段) ,600 空中A 至近・空 X,30 早xF 高さ-30~10程度まで ...必殺技 1000 必殺1 ・近中・ X,85 遅 × 対地・弱い 1120 射撃1 ・・中遠 X*** 早 射撃 3000 必殺2 ・・中遠 X160 遅 突進・中段・ガード反確 3010 必殺3 ・・・遠 X200 遅 突進・強判定・対屈み不可 ...超必殺技 3020 超必殺1 ・近中・ X,80 早 ○ 発生無敵 という感じで、まとめて表にしておくと後々使いやすいです。 もちろん各自で分かりやすいように、距離の列をはぶいたり、 ダメージやヒット・ガードの有利フレームを必要に応じて書きましょう。 ステートプログラムについて分かってくると、 暗転のフレームや無敵時間に関しても調べられますが割愛。 コンボのキャンセルなどの情報も別に、 分かりやすく表でまとめておくとコンボ確認の際に便利です。 >実際のメモファイルの例※簡単なAIであればここまで調べる必要がありません。 >ちなみにこうした情報をまとめるのはエク,セルがオススメ。表を使いまわして色々できますし。 どんなコンボをさせたらいいのか分からない、という人は、 とりあえず一通りの技を何に繋がるのか確認し、 何につなげたほうが良いのか考えて、表にしていくといいでしょう。 200,X>210,Y 200,X>410,2Y 210,Y>220,Z 220,Z>1000,必殺1 400,2X> ※左側が条件にする技で、右側が使用する技です。左から右に繋げます。 まず条件にできる技を並べて、右に何を入れるか考えるという形式です。 つなげるほうがいい技というのは、別の技に繋がっていったり、 火力が高かったり、派手であったりすることなど。 複数の技に繋がるとしても、一つに絞ったり全部使わせる必要はありませんが、 不利なくキャンセルできる技ならばキャンセルする方がいいでしょう。 攻撃によってはガードされると繋がらない場合もあります。 割り込みなどの可否を調べたい場合は、とれーにんぐ非公式拡張ファイルで確実にできます。 固め用の攻撃とコンボ用の攻撃を別々にするという手もあるので、 より作り込みたい場合は調べて、別に固め表を作っておくといいかもしれません。 >動作設計図 .動作表の作成 以上で調べた情報から、どういった時にどのような動作をさせるのか という具体的な表を作成します。それがAIの設計図です。 ここで格闘ゲームに関する思考が必要になります。 「受けるダメージを最小限に。与えるダメージを最大限に。」 詳しいことは[格闘ゲームの基本/Game.txt]とか参照。 1.発生フレームが遅い技は、近接で使わない。 2.前後の隙の大きい技は、他に技が無くともコンボ以外控える。 3.得意な間合いから進んで出たりしない。出る動作は低確率に。 得意な間合いというのは、例えば 相手に行動の余地を与えない行動が可能な間合い(射撃キャラの遠距離) 最も高いダメージの望める攻撃ができる間合い(コンボキャラの近距離) 苦手な間合いというのは、相手に行動を封殺されかねない間合いなど。 「どの距離で何が出来るか」といったものである。 ■テキスト [格闘ゲームの基本に関する話/txt] [対人に関する話/txt] [魅せ要素に関する話/txt] [リスクに関する話/txt] テキストの話を要約してしまうと、 1.発生F・有利不利F・ダメージ・範囲・コンボの有無などを考慮して行動する。 >有利不利フレームとはヒットorガードの後などに片方だけが動け、有利もしくは不利な状態のこと。 2.可能な限り単一な動作を避け、同じ条件でも複数の動作をするように。 >これは対人しかり、リスク回避しかり、魅せ要素しかり。弱くなるかもしれませんが。 3.最良の攻撃・コンボばかりを使わず、他にも見て楽しいものも入れること。 >魅せ要素のようにも思えますが、わずかながらリスク回避も含まれてます。 1についてもっと言えば、「終了状態」も考慮して、 コンボの〆はダメージより有利な状態で終了するほうを選ぶなど。 また多様な相手を想定して、いくらか対応できるようにすること。 例えば、冒頭でも書いてあった攻撃失敗時のリカバリーというのは、 当たらなかった時にそれを繰り返すといった行為の抑制でもあります。 確実な抑制にはVarが必要ですが、何かあって損はないかと。 目安表(メモファイルにコピペとかしてどうぞ) ;■防御関係 ; ◇反撃動作(素早いor発生無敵の攻撃) ; >*ステート番号* *技名* *備考* ; > ; ◇回避動作(移動・無敵移動など) ; > ; ◇ガード(通常のガード) ;■コンボ関係 ; ◇キャンセルコンボ(Ctrlが戻る前に繋がるコンボ) ; > ; > ; ◇目押しコンボ(Ctrlが戻ってから繋ぐコンボ) ; > ; > ; ◇移動→攻撃(ダッシュ攻撃・飛び込み・めくりなど) ; > ; ◇設置→移動(出来るキャラ) ;■基本動作 ; ◇起き攻め(ガー不重ね・対倒れ攻撃・ジャンプなど) ; > ; ◇攻撃動作(使いにくい間合いで技を使わない) ; >(近接 素早い攻撃) ; >(対空迎撃) ; > ; > ; >(中距離〜) ; ◇移動動作(苦手な間合いを嫌う・得意な間合いに入る・飛び込みなど) ; > ; >前進・前ダッシュ(超遠距離) ;■挑発・他 ; ◇挑発(つけたいなら) ガード>コンボ>動作 の順番なのは優先順位の問題。 ちなみに、無理に全種類の攻撃を使う必要はありません。 ただかと言って、攻撃の種類を限定しすぎるのもいけませんが。 距離の感覚はP2BodyDist Xで -20__0__20__40__60__80_100_120_140_160_180_200_220_240_260_280_300_320 * * *+ * * * * + * * * * + * * * * + * * * * + * * * * + * * * * + * * 密着 近距離 ・ 中距離 ・ 遠距離 ・ 画面両端 ・画面外 という感じの数値。(あくまで目安、印の右が0。) ちなみに開幕の距離はステージや相手にもよりますが大体80〜120辺りです。 フォントは[MS ゴシック]で丁度 -20__0__20__40__60__80_100_120_140_160_180_200_220_240_260_280_300_320 * * *+ * * * * + * * * * + * * * * + * * * * + * * * * + * * * * + * * -○○--> <○○--><○○><○○----> <○○--> <-○○-------------------------> <○○------> <-○○○○---------------------------------------- <○○○○------><-○○○○-----><-○○○○-----> * * *+ * * * * + * * * * + * * * * + * * * * + * * * * + * * * * + * * -20__0__20__40__60__80_100_120_140_160_180_200_220_240_260_280_300_320 こんな感じに範囲の記録をしておくと距離の重複の確認がしやすいかも。 割り振りは確率を使えば行えるので、重複していても問題はないです。 ただ全く動作の無い箇所は、移動などで穴埋めしておきましょう。 多数の技の割り振りをより綿密に考慮する場合は、適当な間隔でグループを分け -20__0__20__40__60__80_100_120_140_160_180_200_220_240_260_280_300_320 * * *+ * * * * + * * * * + * * * * + * * * * + * * * * + * * * * + * * -投げ--> <--A--><B><C><D><-E-><--F--><---G---><----H-----------------グループ分け <--X--><--Y--><-前歩き-> <----A----> <--6X--> <-2X-><--B--> <6Y> <-2A-><2B><2Y><-X射撃-> <X必殺><A必殺> <B必殺> <-----前転-----> * * *+ * * * * + * * * * + * * * * + * * * * + * * * * + * * * * + * * -20__0__20__40__60__80_100_120_140_160_180_200_220_240_260_280_300_320 という感じに技の種類をグループ区切りで決めておくと、 確率を割り振るのが楽になります。ただしこれは早見表ですので、 簡単な情報を一緒につけた表で作っておくほうがいいかと。 StNo ,-2,2 4 6 8 10 12 ( *10 ) ,200 ,X A , ,400 2X A , ,420 2A A , 1000 sX A ,X必殺 ,220 ,A A-B , ,430 2B B , ,210 ,Y B-C , ,230 ,B B-C , 1200 sA B-C ,A必殺 ,750 rf A-B-C ,前転 ,410 2Y C , 1300 sB C-D ,B必殺 ,,20 歩 D-E ,前進 2000 6X D-E , 1500 pX D-E ,X飛び道具 ,105 bs D-E ,バックステップ 2100 6Y E , 勿論、この設計図は「予定」です。 調整の段階で大体変更することになります。 設計図を作ったのはある程度整頓して作っておく事で、 何がどこにあるか分からない、という事を避ける為です。 あとあらかじめ設計図を作っておくことで、 動作考え〜ステート考え〜動作考え〜ステート考え〜 というのを防ぎ、 ステート記述を考えること、AIの制作へ打ち込めるようにします。 思いついたことがあればメモをしておきましょう。 >ちなみに デバック表示に記述で書いてあったIgnoreHitPause=xとは、 xを1に設定した場合、その記述はHitPauseを無視して処理しますよ、というものです。 この記述がある場合は、条件と同様に忘れないようにしましょう。 HitPause(ヒットポーズ)とは上で紹介した通り、攻撃を当てたときの停止時間のこと。 この停止時間中はTimeなどの処理も止まり、「ポーズ状態」になります。 攻撃を当てたり受けたりした時にVarSetしたい場合などで必要です。 |
>Commandの話 AIにはCommand入力による制限がない為、人には出来ない動作をできます。 歩きながら溜めコマンド攻撃、飛ばずにn回転コマンド攻撃以外にも、 手操作では不可能なフレームからのつなぎや、無敵切り返しも可能。 コマンド入力の関係上、通常は別の技が出るような技でも出せてしまいます。 加えてAIは人間が敵わない反応速度を持っているため 実のところゲーム上、元々AIは人間よりも優位なプレイヤーなのです。 ただ本当に強い人はAIが敵わない分析と順応性を持っており、 AIはプログラムに従うだけなので絶対的に優位にあるわけではありません。 まず、強いAIはAIの為のステート技術に長けているだけでなく、 どの条件でどのように動けばいいのかといったことを考慮する、 「格闘ゲームの為の思考」があってこそ作れるものです。 結局、「AIに格闘ゲームを行わせている」だけなので、 立ち回りその他のことは、AIの制作者が考えることです。 元があるキャラによっては優秀なプレイヤーの動作を研究するという手法もあります。 まあ、かといって強さばかりがAIではありませんが。 >その2へ |
例えばテキストの話は、対AIの極限を目指すには無用なことばかりです。 とても強力な技が1つ2つある場合、それらを振らせるだけで、 「その技を何度も看破しなければ勝てない状態」にできます。 人間であれば看破する為の動きを繰り返すことも可能ですが、 AIの場合は元々の命令通りにしか動けないため同じように、 「その技を看破できる行動」ばかりを振らせていなければ、勝てません。 もちろん、性能上ほとんどの行動で看破できるようなキャラでも勝てますが、 AIに対しては単一の方が不利のつきやすい分、有利もつきやすいのです。 でも、そればっかりを見たいですか? だからといって、動作を増やしすぎれば不安定になって事故は増えますが。 より「分からない試合」としては、そのくらいが丁度いいかもしれませんし。 まあ結局、技の確率などは個人の裁量です。 あと単一でもそれ自体が ネタとして 面白いキャラはいます。 |
余談 ちなみに技の発生フレームは、ステート番号の確認で使った ステート強制変更の記述を使った方が楽です。 追記:とれーにんぐ非公式拡張ファイルの方が楽かもしれません。 余談2 「ユニット」という用語を僅かながら使っていますが、重要な用語です まず操作できるキャラクターも勿論、ユニットです。 そしてユニットはキャラクター以外に、「Helper,ヘルパー」というものがあります。 ステートコントローラーType=Helperによって射出するそれは、 操作できるキャラクターと、ほぼ同等の制御をすることができ、 デバッグ表示も可能な、「高性能な分身」です。 Helperは特殊なエフェクトや分身、固有ゲージや、 特殊な飛び道具などを表現する際に、使われるものですが、 AIに使われることもあります。 が、詳しい説明は割愛。 |