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↑

2009.12.19 Sat
歩き、ダッシュ、ジャンプなどのAI仕様化について+AI用ステート
歩き、ダッシュ、ジャンプなどのAI仕様化について。
軽くAI用ステート作成についても

内容的に、初心者向け…かな?

(12/20:AI用ジャンプのステート番号修正、ジャンプ防止記述のミス修正)



歩きやジャンプなんかの一部の行動そのステートの中で特殊な処理を行う行動については、ChangeStateでそのステートに飛ばすだけではダメな場合があります。

ダッシュだったら、走るのを止めるための記述がStateDefのどこかにあるはずだし、製作者によっては技の強弱をStateDef内で判断してたりします。その辺をAIでも不具合なく処理されるようにしないといけません。


で、問題の何処に何を書けばいいのかですが、ChangeState自体は基本的にcmdの[Statedef, -1]内でいいです
あとは、飛ばしたステートのStateDefを探して、そのステート内をAI仕様化しましょう。StateDefがあるのはcnsの場合もcommonの場合もあります。

ただし、歩きやジャンプなんかは、MUGEN本体に付属してるcommon1.cnsを使用してることも多いです。Dateフォルダにあるやつですね。
キャラのcnsなどの記述内に該当するstatedefが無く、defファイルにcommon1.cnsが書いてあるならまずそうだと思っていいでしょう。
その場合は、common1.cnsから必要なStateDefの部分をコピーして、キャラのcnsに貼りつけてしまいましょう。それからAI仕様化すればいいです。もしくはcommon1.cnsファイル自体をコピー、キャラのファルダにペーストしてAI仕様化でもいいです。


で、問題のステート内部のAI仕様化ですが、

基本的にはcnsを[Statedef (ステート番号)]で検索して、そのステート記述内の「command = 」付いてる部分を弄ればいいです。
例としてジャンプの一部なら

-------------------------------------------
[State 40, 2]
type = VarSet
trigger1 = command = "holdfwd"
sysvar(1) = 1

[state 40, 3]
type = varset
trigger1 = command = "holdback"
sysvar(1) = -1
-------------------------------------------

の部分を

--------------------------------------------
[state 40, 2]
type = varset
trigger1 = var(59) <= 0
trigger1 = command = "holdfwd"
sysvar(1) = 1

[state 40, 2AI]
type = varset
triggerall = var(59) > 0
trigger1 = (前方に飛ばせたい条件1)
trigger2 = (前方に飛ばせたい条件2)
trigger3 = etc....
sysvar(1) = 1

[state 40, 3]
type = varset
trigger1 = var(59) <= 0
trigger1 = command = "holdback"
sysvar(1) = -1

[state 40, 3AI]
type = varset
triggerall = var(59) > 0
trigger1 = (後方に飛ばせたい条件1)
trigger2 = (後方に飛ばせたい条件2)
trigger3 = etc....
sysvar(1) = -1
----------------------------------------------

とか。
(前方に飛ばせたい条件)が判断された後に(後方に飛ばせたい条件)が判断されるため、
条件がかぶると最終的に(後方に飛ばせたい条件)と判断されてしまうので注意。

だいたいcommand = で検索してヒットする場所は、こういうふうにAI時の条件を追加した方がいいです。

なぜかというと、commandは「人操作時にこのコマンドが入力されたら」って条件なので、コマンドを入力せずに色々行動しているAIの場合は、ちゃんとAI用に記述しとかないと基本的に正常に働いてくれないからです。
まぁcommandのついている所の記述がナニを意味してるのか、理解しなきゃいけないので中々めんどい作業ですがねw






>>AI用のステートを独自に用意するのは?

この技術は要するに、人操作では絶対に飛ばない「AIだけのステート」を作って、色々とAIに活用するものですね。自分も最近はよく使います。

利点として、人操作時を考慮した記述をはぶけるということや、
ctrl=0の立ちステートを新たに作って、コンボ中などに強制的に待機させたりできます。

溜めキャラだったら、ctrl=0のしゃがみステートを作ればいかにも溜めてるように見せることができますね。
その場合、相手の行動如何でctrlsetを使い、ctrl=1にし直せるようにしとかなければ危ないですがw


基本的には、該当のStateDefをまるごとコピーしてその隣にでも貼りつけて、Statedefの番号を(重複しないように)変えればいいです。

例えば、
;--------------------------------------------------------------------
; Jump Start
[Statedef 40]
type = S
physics = S
anim = 40
ctrl = 0
sprpriority = 1

[State 40, 1]
type = VarSet
trigger1 = Time = 0
sysvar(1) = 0

[state 40, 2]
type = varset
trigger1 = command = "holdfwd"
sysvar(1) = 1

[state 40, 3]
type = varset
trigger1 = command = "holdback"
sysvar(1) = -1

[State 40, 4]
type = VelSet
trigger1 = AnimTime = 0
x = ifelse(sysvar(1)=0, const(velocity.jump.neu.x), ifelse(sysvar(1)=1, const(velocity.jump.fwd.x), const(velocity.jump.back.x)))
y = const(velocity.jump.y)

[State 40, 5]
type = VelSet
trigger1 = AnimTime = 0
trigger1 = prevstateno = 100 ;RUN_FWD
trigger1 = sysvar(1) = 1
x = const(velocity.runjump.fwd.x)

[State 40, 6]
type = ChangeState
trigger1 = AnimTime = 0
value = 50
ctrl = 1

;--------------------------------------------------------------------



;--------------------------------------------------------------------
; Jump Start
[Statedef 40]
type = S
physics = S
anim = 40
ctrl = 0
sprpriority = 1

[State 40, No Jump]
type = ChangeState
trigger1 = var(59) > 0
trigger1 = time = 0
value = 0
ctrl = 1

[State 40, 1]
type = VarSet
trigger1 = Time = 0
sysvar(1) = 0

[state 40, 2]
type = varset
trigger1 = command = "holdfwd"
sysvar(1) = 1

[state 40, 3]
type = varset
trigger1 = command = "holdback"
sysvar(1) = -1

[State 40, 4]
type = VelSet
trigger1 = AnimTime = 0
x = ifelse(sysvar(1)=0, const(velocity.jump.neu.x), ifelse(sysvar(1)=1, const(velocity.jump.fwd.x), const(velocity.jump.back.x)))
y = const(velocity.jump.y)

[State 40, 5]
type = VelSet
trigger1 = AnimTime = 0
trigger1 = prevstateno = 100 ;RUN_FWD
trigger1 = sysvar(1) = 1
x = const(velocity.runjump.fwd.x)

[State 40, 6]
type = ChangeState
trigger1 = AnimTime = 0
value = 50
ctrl = 1

; AI Jump Start
[Statedef 41]
type = S
physics = S
anim = 40
ctrl = 0
sprpriority = 1

[State 40, 1]
type = VarSet
trigger1 = Time = 0
sysvar(1) = 0

[state 40, 2AI]
type = varset
trigger1 = (前方に飛ばせたい条件1)
trigger2 = (前方に飛ばせたい条件2)
trigger3 = etc....
sysvar(1) = 1

[state 40, 3AI]
type = varset
trigger1 = (後方に飛ばせたい条件1)
trigger2 = (後方に飛ばせたい条件2)
trigger3 = etc....
sysvar(1) = -1

[State 40, 4]
type = VelSet
trigger1 = AnimTime = 0
x = ifelse(sysvar(1)=0, const(velocity.jump.neu.x), ifelse(sysvar(1)=1, const(velocity.jump.fwd.x), const(velocity.jump.back.x)))
y = const(velocity.jump.y)

[State 40, 5]
type = VelSet
trigger1 = AnimTime = 0
trigger1 = prevstateno = 100 ;RUN_FWD
trigger1 = sysvar(1) = 1
x = const(velocity.runjump.fwd.x)

[State 40, 6]
type = ChangeState
trigger1 = AnimTime = 0
value = 50
ctrl = 1

;---------------------------------------------------------------------

とするとよいでしょう。
ここではステート番号を41にしてますが、重複しなければ42でも43でも146とかでもいいです。
10040とかでもまぁいいのですが、基本的にコモン系のステートは元々の番号の近くの数が望ましいです(MUGENのちょっとしたルールみたいなもの。0~200内?)
なんかうまくいかなかったら数を変えてみるといいかもしれません。

応用としては、ここで「前方に飛ぶ条件」を trigger1 = 1 にしといて「後方に飛ぶ条件」は消しておくと、「前方へ飛ぶのみ」のジャンプステートを別に作ることができ、ジャンプを使用するコンボをさせる時にここに飛ばせば楽になります。
KOFキャラなんかだと、小ジャンプや中ジャンプなどを個別に作っておくと楽かもしれません。

またジャンプステートをAI用に作って使う場合、
元々のジャンプステートである40に、「ステート40になった瞬間立ちステートに戻る」と記述しておきましょう。MUGENの仕様による、「勝手にジャンプする」ということを防ぐことができます。例でもやっていますね。

まあStateDef 40に、

[State 40, No Jump]
type = ChangeState
trigger1 = var(59) > 0
trigger1 = time = 0
value = 0
ctrl = 1

追加するぐらいでいいかと。

その上でAI用のジャンプステートをChangeStateで使えば、想定外でのジャンプをなくすことができます


ちなみに上の[State 40, No Jamp]の条件にジャンプして欲しくない状況を書いておけば、
AI用ジャンプステートを作らなくても「勝手に起こるジャンプ」が割と有効に働いてくれるので楽ですw
自分はこっちの方法をとってますが、まぁしっかりと管理したいならAI用ジャンプステートを作った方がいいでしょうねwまぁ好みで選んでください。

スポンサーサイト

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

Comment
Posted by Winnie
AI専用ステートは同様にしゃがみも制御できますよね。

AI専用ステートとはいえ10040はまずいかもしれません。
mugenでは基本動作のステートは200番未満という取り決め(?)があるらしいので
もっと厳密に言えばジャンプなら40付近ダッシュなら100付近が望ましいですけれどね。
2009.12.20 Sun 11:42 URL [ Edit ]
Posted by 名無し/Nanashi
確かにw
まぁ10040は「記事に書く場合、41とかより10040の方がおおげさでわかりやすいかなー」と思って付けたんですが、逆効果ですねw修正しときます。
2009.12.20 Sun 17:20 URL [ Edit ]
Posted by 名無し/Nanashi
おまけにジャンプ防止記述のNo Jampは正しくはNo Jumpだったうえ、
stateno = 0 は value = 0 の間違いだった!!!

後者の間違いヒデェ…即修正しました。
2009.12.20 Sun 17:51 URL [ Edit ]

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

Top↑

TrackBack
TrackBackURL
http://nanomugen644.blog54.fc2.com/tb.php/115-99fd6446

Top↑

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