MUGENのこととかいろいろ
未分類 | AI関連 | パレット | ポトレ | キャラ紹介 | MUGEN以外 | AI講座的なもの | その他 | キャラ | 
名の無限
≪2017.10  1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30  2017.12≫
プロフィール

名無し/Nanashi

Author:名無し/Nanashi
MUGENのAIをつくったり

あと自分が他所で名前出すときはこの呼び名に統一します。
他の方が呼ぶ分には名無しで構いません。

公開中のブツのリストなど

AI講座一覧

このブログはリンクフリーです。お気軽にどうぞ。

↓バナー


最新記事
Twitter
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
FC2カウンター
FC2カウンター
現在の閲覧者数:
検索フォーム
リンク
ブロとも申請フォーム
QRコード
QRコード
--.--.-- --
スポンサーサイト
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

スポンサー広告    Top↑

2010.03.27 Sat
AI的トリガー説明
ここではtriggerallだとか、ctrlなんかの「AI作成に役立つ記述」の意味や使いどころについて説明します。
もともと「一からのAI作成講座1」の1項目として書いたものだったので、基本的に初心者向けになっております

また、AIに関係ない部分についてはあまり説明してないのもあるのでご了承ください。
さらに詳しくはニコMUGENwikiのトリガー一覧や平成㌢氏のAI説明書を見るといいです。

随時追加する予定



-----------------------------------------------------------------------------------
trigger○ =


簡単にゆうと「条件○=」です。
triggerallは「すべてに共通な条件」、trigger1 は「条件その1」trigger2は「条件その2」
という感じです。

-----------------------------------------------------------------------------------
changestate


type = のところに使うもので、トリガーではないです。
type = changestate で「ステートを変更する」という意味。

value = にAIにやらせたい行動のステート番号を入れて、AIに行動させる「AIの基本」です。


-----------------------------------------------------------------------------------
null


これもtype = のところに使うものです。
type = null で「なにもしない」という感じの意味です。
主にtype = null;ChangeState で一部の行動を使わないようにしておくのに使います。
:= によるVar格納にも使うことがありますが、ややこしいんで初めは知らなくていいですw


-----------------------------------------------------------------------------------
ifelse(○,×,△)


条件によって分岐させる記述。始めに条件を書き、次に条件にあってた場合の値、その次にそれ以外の場合の値を書きます
上だと「もし○であったなら×、違ったら△」となります。コマンドの強弱の分岐に使われてたり。
()の中にさらにifelse記述を使い、複雑な分岐にもできます。

例、value = ifelse( (p2bodydist X >= 90 && p2movetype != H) ,1110 ,1100) 
ある程度離れてて、かつ相手が食らい状態でないなら1110を、それ以外は1100をとる記述。

ifelse(p2statetype = S,1,ifelse(p2statetype = A,2,ifelse(p2statetype = C,3,4)))
相手が立ちなら1、空中なら2、屈みなら3、それ以外(ダウン)なら4を返す記述。


-----------------------------------------------------------------------------------
var(○) または fvar(○)


varsetなどで好きな数値に変えれる「変数」です。○の中には数字が入ります。
数学で言う、I とか I みたいなものです。(Iの部分の見た目がvarになっているだけです)
とりあえず色んなスイッチとして使われていると思ってて下さい。AIスイッチもこれです。


-----------------------------------------------------------------------------------
enemynear,~


トリガーの前に置いて、「一番近い相手」を指定します。
ただし、死んでる相手も参照してしまうので、タッグではコレ用の「生死判別」が必須です。
記事にしてるのでそちらをどうぞ

例、enemynear,vel x > 0
一番近い相手が前に移動してる時の記述


-----------------------------------------------------------------------------------
numenemy =


いま場にいる相手の数を返します。
通常で考えると、シングル・チームだと1で、タッグだと2になります

相手がタッグかどうか知りたいときによく使います


-----------------------------------------------------------------------------------
enemy(0),~
enemy(1),~


トリガーの前に置いて、「相手ひとり」を指定します。
タッグなどで、相手のどちらか一方のみ指定したい場合によく使います

(0)がP2、つまり一人目の相手。(1)がP4、つまり二人目の相手を指定します、
ちなみに()を省略してenemy,~のみで記述した場合は(0)とみなされます

ただし、二人目の相手が存在しないシングル戦などでenemy(1),~を使うとエラーがでるので、
enemy(numenemy=2),~と記述しておくと良いです(numenemy=2を満たす時以外はenemy(0)になる)


例、enemy(0),alive=0 || enemy(numenemy=2),alive=0
相手のどちらかが既にKOされているとき


-----------------------------------------------------------------------------------
roundstate


ラウンドの状態を示します。
とりあえず0~1が戦闘前、2が戦闘中、3がKOになった直後と覚えてください。
基本的にAIは戦闘中のみ動かすので、roundstate = 2をAI記述につけておくと変な動作をしないので良いです。

ただし、実は実際に動けるようになるroundstateは2になるので、
ctrl=0で管理しているAIなんかはroundstate=2だけだとほぼ確実にフライングしてしまうので注意しましょう

でも一部にroundstate >= 2 を付けとくことで、KO後に画面中央に走って勝ち挑発するなんてこともできます。


-----------------------------------------------------------------------------------
ctrl


コントロール可能状態という意味。キャンセル時以外の行動記述にはだいたい付いてます。
enemynear,ctrl = 0で、相手がコントロール不能な時を特定できます。

これがAI記述から抜けていることで起こるバグは多いので気を付けましょう。
食らい抜けなんかはまさにctrlが記述から抜けてると起きるバグですね。


-----------------------------------------------------------------------------------
random


ランダム。0~1000までの値がランダムに入ります
例えばrandom <= 333 にすればほぼ3分の1の確立と言えます。

ただ1フレームごとに値が変わるので、
ある技をキャンセルするのにrandom <= 333を使った場合、そのままだと、
キャンセル猶予が6フレだとすると、3分の1を6回試行するようなものなのでほぼ確実に出てしまいます。

なのでそこらへんをちょっと考えなきゃいけません。
個人的には、技をふるのにrandom<=100でも結構高い値だと思います。

また完全にランダムでもないらしい?でも気にするほどの誤差じゃないです。

ちなみに書かれているrandomごとにランダム値が入ってます。
要するにrandom && random で、左のrandomと右のrandomは基本的に違う数が入ります


-----------------------------------------------------------------------------------
statetype =
p2statetype =


キャラの状態の種類を特定するトリガーです。p2は相手の状態です。
Aで空中、Sで立ち、Cで屈み、Lでダウンです。

p2statetype != A && p2statetype != L 相手が空中でなく、ダウンしてもいないときのトリガー
↑はかなりよく使います。

ちなみにp2~系は基本的に一番近くの相手を参照します。覚えておきましょう


-----------------------------------------------------------------------------------
movetype =
p2movetype =


キャラの行動の種類を特定するトリガーです。p2は相手の状態です。
Aは攻撃、Hはやられ(ガード含む)、Iがその他(移動、ゲージ貯め、挑発など)
statetypeと間違わないように気をつけましょう。

技振りにp2movetype!=Hを指定するのは、タッグでの動きが凄く悪くなるのでオススメしません


-----------------------------------------------------------------------------------
stateno = ○
p2stateno = ○


○のステート番号のときのトリガー。
よくmovecontactと一緒に技のキャンセル記述として使われてます。
p2は相手の共通ステートを指定して使ったり。

例、stateno = 200 && movehit ステート200のときで、攻撃がHITした時
p2stateno = [120,159] 相手がガードのステートの時
p2stateno = [5000,5099] 相手が(ダウン以外で)食らい状態のステートの時


-----------------------------------------------------------------------------------
prevstateno = ○


直前のステートが○の時のトリガー。p2はないです。
直前ってのはひとつ前のステートってことで、どんなにすぐさっきのステートでも2つ前のはNGです。


-----------------------------------------------------------------------------------
movecontact
movehit
moveguarded


自分の攻撃が相手に触れた時のトリガー。
movehitがヒット時、moveguardedがガード時、
movecontactはその両方、つまり触れさえすれば1になります。
stateno と一緒にキャンセル用に使います。&& でひとまとめにすることを推奨。

ちなみに「攻撃が触れてからの相手の(食らい状態での)経過フレーム」を返すので、
movehit = 5 だとあたってから5フレ目になります。
キャンセルタイミングを指定するときに便利です

例、(stateno = 200 && movehit) || (stateno = 200 && moveguarded && random <= 100)
番号200の技が当たれば確実にキャンセルし、ガードされたら低確率でキャンセルする記述。


-----------------------------------------------------------------------------------
p2bodydist x =
p2bodydist y =

p2dist x =
p2dist y =

相手と自分との相対距離を特定するトリガー。bodydistは「当たり判定」との、distは「キャラの軸」との距離。
distの後の半角スペースはなぜか必須です。
xはx座標。yはy座標。

注意すべき点

x座標は背後に相手がいるとマイナスをとるほか、
p2bodydistは密着でもわずかにマイナスになる時があります。また「当たり判定」からの距離なので、相手の体勢なんかによって変わったりします。

なので前方のみを指定したい場合、p2dist x >= 0 && p2bodydist x <= 90 のような記述をオススメします


y座標は相手が自分より高い所にいるとマイナスをとり、自分より低い所にいるとプラスをとります。
というか、基本的にMUGENでは上方向がマイナスで下方向がプラスの値です。


例、p2dist x >= 0 && p2bodydist X <= 60 前方少し前までに相手がいる距離
  p2bodydist Y = [-80,-10] ちょっと上~だいぶ上までの高さに相手がいる距離


-----------------------------------------------------------------------------------
BackEdgeBodydist =
FrontEdgeBodydist =


画面端からの距離を特定するトリガー。Backが後ろ端からの距離。Frontが前端からの距離。
壁端に追い詰めたときや、追い詰められたときの行動によく使います。

キャラの向きで入れ替わるので注意。
またステージ端からの距離はこれでは分かりません。あくまで現在見えてる画面端からの距離です。


例、backedgebodydist <= 30 相手に壁端に追い込まれた時のトリガー。
enemynear,backedgebodydist <= 30 相手を壁端に追い込んだ時のトリガー。


-----------------------------------------------------------------------------------
life = ○
p2life = ○


現在のライフのトリガー。キャラによって設定されてるますが基本は最大1000です。
体力によって行動を変えたいときによく使います
相手のライフが低いときに超必でケズリ殺すのを狙ったりも。

lifemaxというlifeの最大値を返すトリガーもあるので
life <= lifemax / 3 ライフが最大の3分の1の時
という記述もできます。


-----------------------------------------------------------------------------------
power = ○


パワーゲージの量のトリガー。p2がないので注意。
ゲージ技には必ずpower>=1000とかが付いてなきゃいけません。
AI記述的には、他にゲージ管理のために使ったりします。

powermaxというゲージ最大量を返すトリガーもあります。
タッグの相方のおかげでゲージ最大量が上がってる時でもちゃんとそのときの最大量を返してくれるっぽいです


-----------------------------------------------------------------------------------
time = ○


そのステートでの経過時間(フレーム)を表すトリガーです。
キャンセルするタイミングを調整したり、色々使います。

ちなみにtime=0も機能しますが、-3ステート(通常、AIが書かれるところ)では処理の関係上ほぼ使えませんので注意。


-----------------------------------------------------------------------------------
animtime = ○


今のステートが終わるまでの時間を特定できるトリガーです。
マイナスの値からゼロに近づいていって、=0だとステートが終わったその瞬間を表します。


stateno = ○ && animtime = 0 でchangestateさせると、○が終わって即発動という記述ができます。
目押しコンボに良く使いますね

ただし、実はそのステートが終わる直前に別のステートに飛ばすようなものなので、
animtime=0を使って初めて可能なコンボ(人操作じゃ無理)もできたりしますが、
そういうコンボをさせるのはキャラ改変の部類にはいるのでやめましょう。

注意として、上に書いた通り「ステートが終わる直前に別のステートに飛ばす」記述なのでctrlはつけないように。発動しません。
といっても、「人操作では終わった瞬間にすぐ発動できない」ような行動はさせないように。


1フレでも、本来より早くなってるのはどうかという場合は「AI用の待機ステートを作る」目押しコンボのやり方がありますが
ややこしいのでここでは説明しませんw


ほか、enemynear,animtime <= -○ で相手の技が終わるタイミングを計れます。

例、enemynear,animtime = -6 相手のステートがあと6フレで終わるとき


-----------------------------------------------------------------------------------
numproj =


自分が出現させているproj形式の飛び道具の数を返すトリガー。
AI記述としてはenemynear,で相手の飛び道具の有無を確認するのによく使います。

ただし、MUGENではproj形式の他にhelper形式の飛び道具があるため、
このトリガーのみでは相手の飛び道具数は完全にはわかりません。

例、enemynear,numproj <= 0 相手がproj飛び道具を放ってない時のトリガー。


-----------------------------------------------------------------------------------
facing


キャラの向きを確認できます。1が右向き、-1が左向き。
enemynear,facing = facingなんかで相手の背後をとったかどうかによく使います。

例、enemynear,facing != facing 背後をとってもとられてもいない時のトリガー。
enemynear,facing = facing 背後をとった、またはとられている時のトリガー。
↑はp2bodydist X が正なら背後をとったとき、負なら背後をとられている時になる。


-----------------------------------------------------------------------------------
vel x
vel y


その時のキャラの速度(1フレで進む距離)を返すトリガー。両方0なら静止状態。間の半角スペースは必須。
xはx軸、yはy軸上。xは前進すると正、後退すると負の値をとり、
yは下降すると正、上昇すると負の値をとります。
enemynear,vel x > 0 で相手が前進してるときを指定できたり。
p2bodydist X の値に数式で組み込んで、相手の先を読んで技を出すこともできますが、初めはそれほど気にしなくてもいいです


-----------------------------------------------------------------------------------
pos x
pos y


p2bodydist と違って、画面端なんかからの相対距離を返すトリガー。
pos xは画面の真ん中からの距離を返します。自分は使ってませんw
pos yは地面からの単純な高さを表すので、相手の場所によらず一定の高さで技を出したいときなどに使ってます。
y座標は高いほど負の方向に大きくなるので注意。


-----------------------------------------------------------------------------------
HitDefAttr =


攻撃判定が出ている際に、どんな攻撃かを特定するトリガー。
始めに「S;立ち、C;屈み、A;空中」のどの状態かを指定(SCAのように続けて書くことで複数指定可能)し、
その後、「N;通常技、S;必殺技、H;ゲージ技(EX技なんかは違うことが多い)、A;全部」と
「A;打撃、T;投げ、P;飛び道具」を組み合わせて記述します。
基本enemynear,で使います。ややこしいです。自分はあまり使いません。

例、enemynear,hitdefattr = A,AA 相手の攻撃が空中打撃の場合
enemynear,hitdefattr = SCA,NT,ST,HT 相手の攻撃が投げの場合


-----------------------------------------------------------------------------------
inguarddist


相手の攻撃に対し、ガードモーションをとれる距離の時のトリガー。
ガード記述のほか、当身技や、緊急回避の記述に使ったりします。

ただし、相手の設定したガード距離が短かったり、特殊な状況(めくりなど)では
MUGENの仕様上、inguarddistが1にならないまま攻撃が当たるので、

AIの場合、inguardistのみではガードが不完全になってしまったりもします(人操作では後ろキーを入れとけば当たる瞬間にガードする)


例、enemynear,numproj = 1 && !inguarddist
相手の飛び道具が1つあって、ガードできる近さではない時のトリガー


-----------------------------------------------------------------------------------
numpartner


パートナーの有無を確認できるトリガー。1ならパートナーが存在。
partner,~の記述を使う場合、それより前の行に入れとかないとエラーメッセージが出ます。


-----------------------------------------------------------------------------------
partner,~


トリガーの前に置いて、「自分のパートナー」を指定します。
タッグ記述用に使います。

numpartnerを事前に記述してないと、「パートナーなんて存在しない!」というエラーメッセージが出続けるので注意

例、
trigger1 = numpartner = 1
trigger1 = partner,stateno = [5000,5099]
パートナーが存在し、パートナーが攻撃を食らっている時のトリガー。


-----------------------------------------------------------------------------------
ishelper


キャラがヘルパーなら1を返すトリガー。
!ishelperを記述につけておくと分身バグが起きても分身の行動を抑制できます。


-----------------------------------------------------------------------------------
alive


生きてるかどうかのトリガー。
つけておくとタッグでのゾンビ行動を防止できます。
またpartner,alive = で1ならパートナーが生きてるとき、0なら死んでるときにできます。

life=0になってからalive=0になるまで微妙に間があるようなので、
実はlife<=0とかlife>0でやったほうがいいかもしれない




こんなところです。
これらのトリガーをうまく組み合わせ、AIに技を振らせて行って下さいー
スポンサーサイト

AI講座的なもの    Comment(3)   TrackBack(0)   Top↑

Comment
Posted by 乱入者
こういう説明って作るのが大変ですね。
製作頑張ってください。
2010.03.31 Wed 23:09 URL [ Edit ]
Posted by 名無し/Nanashi
なかなか難しいものです
文章力が欲しい…
2010.04.01 Thu 02:06 URL [ Edit ]
Posted by AI初心者
例もわかりやすく、非常に参考になりました。
ありがとうございます。
2014.03.19 Wed 20:41 URL [ Edit ]

管理者にだけ表示を許可する

Top↑

TrackBack
TrackBackURL
http://nanomugen644.blog54.fc2.com/tb.php/159-7bc6c98a

Top↑

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。