MUGENのこととかいろいろ
未分類 | AI関連 | パレット | ポトレ | キャラ紹介 | MUGEN以外 | AI講座的なもの | その他 | キャラ | 
名の無限
≪2017.06  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 31  2017.08≫
プロフィール

名無し/Nanashi

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

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

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

AI講座一覧

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

↓バナー


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

スポンサー広告    Top↑

2009.10.28 Wed
タッグ時の生死判別記述について
現在絶賛修正中な「タッグ用生死判別」記述について書きます。
細かい間違いはコメント等で突っ込んでくれるとありがたい

ちなみに導入の仕方自体は記事の最後のほうに書くので、やり方だけ知りたいって人は飛ばしてください。


えーまずタッグ用生死判別ってのがなぜ必要かというと、
タッグ時、相手の死体にAIが反応しないようにするためです。

死体に反応してずっと小足振ってたり、バクステしたりしちゃまずいってことですね。


なぜAIが死体に反応しちゃうのかというと、一部の記述が死体を無視しないからで、
一部の記述ってのが何なのかというと、基本的にEnemyNearです。
「一番近い敵」を参照する記述ですね。

たぶん他にも死体に反応するんだろうけど(Target指定とか)、とりあえずP2指定系はタッグでの死体は無視してくれたと思う。
少なくともP2BodyDistはちゃんと無視してた。



で、ここから次の線までは自分がやってた間違いの話。

「EnemyNearが死体に反応しちゃうんなら、EnemyNear,Aliveをトリガーに入れとけばとりあえず死体に小足振ったりしないだろう」
と安易に考え、入れてたわけです。

これがなぜ間違いか、下の図をみてもらいましょう

そういや影二カスタムのAI作られないね
↑蟹のAI記述全部にEnemyNear,Aliveを入れてると仮定した状況
(ちなみにあくまで仮定なので、実際は別に蟹さんに間違った生死判別記述は使われてません)

この状況だと蟹は、
ダンが近くにいながら、一番近い敵である影二が死んでるので、
結果、何も行動しませんおいしく頂かれます

ようするにこの記述だと、死体に反応しない代わりに、死体が一番近いときに
生きてる相手に反応できなくなっちゃうのです。

だからEnemyNear,Aliveをまだ入れてる自分のAIは、タッグでニートする確率がかなりのハズw



じゃあこの不具合をなくすにはどうすればいいのか説明します

EnemyNearは実はEnemyNear(0)を略したものらしく、

カッコの中が0だと「1番目に近い敵」を参照し、
カッコの中が1だと「2番目に近い敵」を参照するようになります。
カッコを略すと(0)と同じ「一番近い敵」ってことですね


これを利用して、上の図のような「一番近くの敵が死んでる」ときのみ、
EnemyNear(0)をEnemynear(1)に変えることができれば、生きている「2番目に近い敵」に反応できるわけです。


で、この0と1を変えるのは、Varを使えば可能となります(以下、例としてVar(50)を使うことにします)

つまり、敵が二人の時、

「一番近い敵が生きてる時はVar(50)=0」
「一番近い敵が死んでる時はVar(50)=1」となるようにしておいて、

Enemynearを、EnemyNear(Var(50))と記述すれば
カッコの中の値が状況に応じて0と1で切り替わるようになり、これでちゃんとした生死判別ができるようになるというわけです。




最後に実際の記述ついて。
なお以下の記述は他のAI製作者様の記述を参考にしております。感謝。

;=================================
[State -1, タッグ用生死判別];
Type = VarSet
triggerall = var(59)
triggerall = RoundState = 2
trigger1 = NumEnemy = 1
trigger2 = NumEnemy = 2
trigger2 = EnemyNear(0),life > 0
var(50) = 0
IgnoreHitPause = 1

[State -1, タッグ用生死判別];
Type = VarSet
triggerall = var(59)
triggerall = RoundState = 2
trigger1 = NumEnemy = 2
trigger1 = EnemyNear(0),life <= 0
var(50) = 1
IgnoreHitPause = 1

;=================================

これをAIフラグの下にでも置いといて、
後はEnemyNearをEnemynear(Var(50))で置換すればいいです。

置換機能のあるテキストエディタがあると楽ですね

またできるだけ記述をコンパクトにまとめたいという人は、


;=================================
[State -1, タッグ用生死判別];
Type = VarSet
triggerall = var(59)
trigger1 = RoundState = 2
var(50) = 0 + (NumEnemy = 2 && EnemyNear(0),life <= 0)
IgnoreHitPause = 1

;=================================

でいいと思います。


ということで、以上です。分かりにくかったらすいません;;
AIだけでなく、EnemyNearを本体の管理に使ってるキャラにもこの生死判別は有用だと思いますんで、良かったら参考にしてください。


うん。冒頭でも書きましたが、間違ってたら言ってくれると嬉しいです。勉強になりますしね^^

スポンサーサイト

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

Comment

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

Top↑

TrackBack
TrackBackURL
http://nanomugen644.blog54.fc2.com/tb.php/75-5fade0b3

Top↑

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