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.26 Fri
一からのAI作成講座2
これは一からのAI作成講座1の続きです。
さきにそちらを見ておかれると良いかと思います。
またこの講座はAIについて突き詰めていくものではありませんのでご了承ください。

それでは以下本題


前回の最後での「AIに技を振らせる」記述について、詳しい記述の仕方などを説明します。

一応その前に、前回軽く書いておいた説明をもう一回載せときます。


;技名
[State -1, 技名 or 何もなし]
type = ChangeState
value = 数字
triggerall = command = "なんとか"
triggerall = power >= 2000
trigger1 = statetype != A
trigger1 = ctrl
trigger2 = stateno = 200 && movecontact
trigger3 = stateno = 201 && movecontact
trigger4 = stateno = 211 && movecontact


とかこんなような記述が並んでいると思います。

(ちょっと説明すると、キャラの行動や状態にはステート番号ってのがそれぞれ付けられてます。
(一般的共通ステートでいえば、ただの立ち状態は0、ダッシュなら100です。
(
(この記述は"ChangeState"つまり、書いてるtriggerを満たす時に、キャラをvalueに書いてある数字のステートにする。
(
(要するに、これはある条件で、数字に対応した行動を起こさせる記述なのです。



1)AIのルール

AIを作成するにあたって、まず知っておいてほしいことです。


その前に、まず原則として、
不可能なはずのことをさせないように。ということを頭に置いといて下さい。

(超反応とかの話ではなく、例えば地上技を空中で出させるとか、
(飛び道具連射できないはずなのにやらせるとかの、根本的にできないはずのことはやらせないようにってことです。

もちろん、高レベルで一部技の性能が変わるAIってものもあると思いますが、
これは改変に近いので、やりたい場合はキャラ製作者に許可をとりましょう。

それでは本題に


----------その1

上に書かれた記述ほど優先順が高い。

(異なる行動に同じ条件をつけている場合、AIは一番上に書かれてる行動をします。


-----------その2

記述ミスはエラーメッセージが出るものと、出ないものがある。

(例えば
;技名
[State -1, 技名 or 何もなし]
type = ChangeState
value = 数字
triggerall = command = "なんとか"
triggerall = power >= 2000
trigger1 = statetype != A
trigger1 = ctrl
trigger2 = stateno = 200
trigger2 = movecontact
trigger4 = stateno = 211
trigger4 = movecontact
(
(上のような、trigger3が抜けているようなミスの場合エラーメッセージは出ず、
(trigger4以降が無視されるという処理を受けます。


-----------その3

横に長すぎる記述はエラーになる。

(&& などを使って横に続けて記述していくと縦の長さが短くできて良いですが、あまりに長いとエラーになります。
(無理に長くしても見づらくなるので、できるだけ適当な長さで抑えときましょう


-----------その4
エラーメッセージの内容について

エラーでMUGENが落ちた場合、エラーメッセージを見るとある程度原因を特定できます。
例えば
;技名
[State -1, 技名 or 何もなし]
type = ChangeState
value = 数字
triggerall = command = "なんとか"
triggerall = power >= 2000
trigger1 = statetype != A
trigger1 = ctrl
trigger2 = stateno = 200
trigger2 = movecontact
trigger3 = stateno = 211
trigger3 = moecontact  ;(←movecontactのスペルミス)

の記述をしてた時、エラメに 技名 or 何もなし と書いてあるはずで、
また、trigger3, 2というものも書いてあると思います。
このことから、、「技名 or 何もなし」のtrigger3の2行目になにかミスがあるということがわかります。


------------その5

全角は基本的に使えない。

(技名とか、コマンド名以外では、半角を使わないとエラーになります。
(特に、全角でスペースを打つだけでもNGなので気をつけましょう。
(大文字か小文字かは関係ないです。
(ただしコメントアウトしてた場合は別です


------------その6
;より右側はコメントアウト扱いされ、何を書いても無視し、エラーにもならない。

(一時的に一部記述を無効化したいときや、個人的なメモを書いとくのに使います。
(要するに上の「;より~」を実際のAI記述の中に適当に突っ込んでも全く問題がないわけです。


-----------その7
&& は and と同じ意味で、
|| は or と同じ意味。

(これらを使うことでtrigger1 = stateno = 200 && movehit など、条件を続けて書くことができます
(ただし例えば、trigger1 = stateno = 200 && movehit || stateno = 220 && movehit
(と書いたときと、trigger1 = (stateno = 200 && movehit) || (stateno = 220 && movehit)
(ではかなり意味が違ってくるので、()をうまく使いましょう。
(
(割と間違えやすい上に使わなくても記述はできるので無理に使うことはないです。
(でも使ってるうちにミスしなくなってくるので、早いうちから使っていくのもアリです。


-----------その8
トリガー = [○,×] は「○<=トリガー<=×」を表し、
トリガー = (○,×) は「○<トリガー<×」を表し、
トリガー = (○,×] は「○<トリガー<=×」を表す。

広範囲の数値を指定するときに使います。要するに = [1,3] は1から3までの数値指定です。
また&&や||と連続で組み合わせる場合、()で包まないとエラーが出ます。
例えば、
「trigger1 = p2bodydist X = [-5,60] && ctrl」 ではエラーが出ますので、
「trigger1 = (p2bodydist X = [-5,60]) && ctrl」と書かなければいけません。


----------その9
!は否定の意味があり、statetype != A で空中でないとき、!ctrlでコントロール可能でないときなどの記述ができる。

!(p2movetype = A && p2statetype = A)など、()を使って複数を否定することも可能です。
!(p2statetype = A && (p2bodydist X = [30,60]))とか、()を複数重ねたりするときもあります。

ただしMUGENでは、例えばVar(59)なら!Var(59)はVar(59)=0のみを意味し、
Var(59)=-1なんかのマイナスの数値は!var(59)とはされず、var(59)がONとみなされる特徴があるので注意!


---------その10
トリガーは基本的に満たせば=1、満たしてなければ=0の値をとっている。

ctrl=0 とか。要するに0ならオフ、1ならオン。
randomや、距離なんかを値として取るトリガーは例外です



こんなところでしょうか?
ちなみにスペースは一部を除いて、あってもなくてもよいです。半角である必要はありますが
例、ctrl = 0 と ctrl=0 は変わらない



2)トリガーなどについて
長くなるので別に記事を用意しました。そちらを御覧下さい



3)歩き、ダッシュ、ジャンプなどの制御について

歩きなどのボタンを押しっぱなしにしている必要のある動作や、ジャンプなどのボタンの押し方によって変わる行動は、
~.cnsファイル内の記述を弄らなきゃいけません。

具体的にいうと、cns内のcommand = の記述をそれぞれAI用に書き換えなきゃいけません。

例えば歩きの記述で、

[State 20, 1] ; 前に歩かせる記述
type = VelSet
trigger1 = command = "holdfwd"

x = const(velocity.walk.fwd.x)

[State 20, 2] ; 後ろに歩かせる記述
type = VelSet
trigger1 = command = "holdback"

x = const(velocity.walk.back.x)

のように記述している場合、

[State 20, 1] ; 前に歩かせる記述
type = VelSet
trigger1 = var(59) <= 0 ; AIフラグがOFF(人操作時)
trigger1 = command = "holdfwd" ; 前キーが押されてるとき
trigger2 = var(59) > 0 ; AIフラグがON(AI操作時)
trigger2 = enemynear,vel x <= 0 || p2movetype = H ;(近くの敵が止まってるか後退してる、または食らい状態の時)

x = const(velocity.walk.fwd.x)

[State 20, 2] ; 後ろに歩かせる記述
type = VelSet
trigger1 = var(59) <= 0 ; AIフラグがOFF(人操作時)
trigger1 = command = "holdback" ; 後ろキーが押されてるとき
trigger2 = var(59) > 0 ; AIフラグがON(AI操作時)
trigger2 = enemynear,vel x > 0 ;(近くの敵が前進している時)

x = const(velocity.walk.back.x)

こんなふうに書き換えます。

また、下のような書き方でもいいです。

[State 20, 1]
type = VelSet
trigger1 = var(59) <= 0 ; AIフラグがOFF(人操作時)
trigger1 = command = "holdfwd" ; 前キーが押されてるとき

x = const(velocity.walk.fwd.x)

[State 20, AI1]
type = VelSet
trigger1 = var(59) > 0 ; AIフラグがON(AI操作時)
trigger1 = enemynear,vel x <= 0 || p2movetype = H ;(近くの敵が止まってるか後退してる、または食らい状態の時)

x = const(velocity.walk.fwd.x)

[State 20, 2]
type = VelSet
trigger1 = var(59) <= 0 ; AIフラグがOFF(人操作時)
trigger1 = command = "holdback" ; 後ろキーが押されてるとき

x = const(velocity.walk.back.x)


[State 20, AI2]
type = VelSet
trigger1 = var(59) > 0 ; AIフラグがON(AI操作時)
trigger1 = enemynear,vel x > 0 ;(近くの敵が前進している時)

x = const(velocity.walk.back.x)


「なんかAIがちゃんと走ってくれない」ってのはだいたいこの記述をやってないせいです。
この他、大蛇薙などの溜めがある技も、cns中の記述に手を入れなきゃいけません。
まぁcommandを検索して、引っかかった記述は基本的にすべてAI仕様化しといた方がいいです。

さらに詳しくはこちらをご覧ください


4)ガード記述について


デフォでもまあまあガードしてくれますが、やはりしっかりガード用の記述をした方が良いです。
ニコMUGENwikiのAIガードテンプレや、ガードが上手いAIの記述を参考にするといいと思います。

ただ、意味を理解しないでコピペだけするのはあまりおススメしません。バグが出やすいし…
昨今はAI作成を志すひとのために、記述の近くにシッカリと説明を添えているAIが多いので、
そういうAIから学ぶととても良いと思います。

自分のAIは全く説明がないのでオススメ出きませんw


5)記述の順番について

後述のとおり、上に書いてある記述ほど優先度が高いです。
そこで、どんな行動を上に持ってくるべきかですが、


切り返しや割り込み、リバーサルなど

コンボ記述

ガード記述

対空・起き攻め・ぶっぱなど

移動行動

立ち回り技


みたいなのが望ましいです。もちろん意図によってはこの限りじゃないです。

詳しくは平成㌢氏のAI説明書の方を読まれると良いです。




ここまで見てくれた方なら、もう簡易AIなら作れるはずです!

前回の「4.AIに技を振らせる。」も参考にしながらAIに動きを追加して見てください。


;技名
[State -1, 技名 or 何もなし]
type = ChangeState
value = 数字
triggerall = command = "なんとか"
triggerall = power >= 2000
trigger1 = statetype != A
trigger1 = ctrl
trigger2 = stateno = 200 && movecontact
trigger3 = stateno = 201 && movecontact
trigger4 = stateno = 211 && movecontact

↑コレが


;技名
[State -1, 技名 or 何もなし]
type = ChangeState ; ステートを変更
value = 数字
triggerall = var(59)>0 && roundstate = 2      ; AIフラグON、戦闘中
triggerall = power >= 200             ; ゲージが2本以上
triggerall = p2statetype != A && p2statetype != L ; 相手が地上で、ダウンしていない

trigger1 = statetype != A          ; 地上にいるとき
trigger1 = ctrl               ; コントロール可能時
trigger1 = p2bodydist X = [30,50]      ; 相手が30~50の距離にいる
trigger1 = enemynear,ctrl = 0 && p2movetype != A ; 相手がコントロール下でなく、攻撃中でもない
trigger1 = enemynear,vel x >= 0       ; 相手が後退していないとき

trigger2 = stateno = 211 && movehit
           ; ステート211(近距離強Pらへんとする)で、攻撃がHITしている
trigger2 = p2bodydist X = [-5,50] ; 相手が-5~50の距離にいるとき

↑こうなるのもなんとなく理解出来ると思います。



もっと知りたい人は、他の方々のAI講座を見てみてください。こんな講座よりずっと詳しく書いてらっしゃいます。

やり始めれば、簡単なものです。軽い感じでやってみてください。



それではこの講座は終わりです。有難う御座いました~

スポンサーサイト

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

Comment
Posted by
どうも~。以前にスレで講座が消えてたことを話題にしてた者です。
再公開ありがとうございました!
2010.03.27 Sat 13:56 URL [ Edit ]
Posted by 名無し/Nanashi
わずかでもこんな記事を参考にしてもらえるなら本望で御座います
2010.03.27 Sat 15:55 URL [ Edit ]

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

Top↑

TrackBack
TrackBackURL
http://nanomugen644.blog54.fc2.com/tb.php/158-86b19f29

Top↑

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