おまけ:AI研究資料室(2012/10/17 摩擦係数計算式を修正)


重力計算式

X座標はAIにとって都合がいいように、距離を算出する式になっています。自分自身の移動は考慮していません。
2P側で1Pの軌道を計算する時など、自分の処理順が後になる場合は、扱いに注意が必要です。
これは、相手が既にそのフレーム分の処理を行って、情報が更新されているためです。
(自分の処理順が先になる場合よりも情報更新が1フレーム分早くなるので、計算結果がずれてしまいます)
また、経過時間計算では、0での割り算をしないように注意が必要です。
分母が0になっていないか、計算前に必ずチェックしましょう。


特定時間経過後の位置計算

Tフレーム後の距離:EnemyNear,Dist X - EnemyNear,Vel X * T

Tフレーム後のY座標:EnemyNear,Pos Y + EnemyNear,Vel Y * T + EnemyNear,yaccel * T * (T + 1) / 2

特定速度到達時の経過時間計算

Y速度がVになるまでの経過時間:(.25-(EnemyNear,Vel Y-V)/重力*2)**.5-.5

特定位置到達時の経過時間計算

距離がDになるまでの経過時間:(EnemyNear,Dist X - D) / EnemyNear,Vel X

Y座標がHになるまでの経過時間:Ceil(Abs((EnemyNear,Vel Y/重力*2+1)**2/4-(EnemyNear,Pos Y-H)/重力*2)**0.5-(EnemyNear,Vel Y/重力*2+1)/2-1)

平方根計算の部分は値がマイナスだとエラーを起こすので、最後の式にAbsを追加。
また、浮かせてからの拾い連続技で実用してみたところ1フレームずれるようなので、最後の式に-1を追加しました。
「重力」は相手の状態によって変化します。
空中やられ時はifelse(EnemyNear,GetHitVar(yaccel) = 0, .35, EnemyNear,GetHitVar(yaccel))となります。
通常はEnemyNear,yaccelですが、相手がVelAddなどで重力を増量している場合があるので注意。
できれば相手の位置を常時監視して、独自に重力を算出してしまった方がいいでしょう。
まあ、そんな事を言い出すとVel Xなどでさえ独自算出する羽目になってしまいますが……。
(Vel Xは画面端などに引っかかっても数値に影響を受けない)



摩擦係数計算

摩擦係数 = EnemyNear,Const(movement.stand.friction) or EnemyNear,Const(movement.crouch.friction)

Tフレーム後の移動距離:EnemyNear,Vel X*((摩擦係数)**T-1)/Ln(摩擦係数)

摩擦係数は立ち状態としゃがみ状態とで使い分けが必要です。
この式の使い道は、地上連続技で次の攻撃が届くかどうかを判断する時などでしょうか。
ただし、MUGENのべき乗計算は5乗と6乗の計算結果が逆になってしまうので、注意が必要です。

つまりこの式の場合、Tが6の時と7の時の結果が逆転します。
(他の数値でもこのバグが所々あるらしいので、確認作業が必須みたいです)
あと、0での割り算にも注意。摩擦係数1のキャラクターは存在するのかどうか微妙ですが……。
摩擦係数は立ち状態としゃがみ状態とで使い分けが必要です。

追記DHQさんに間違いをご指摘いただきました。どうもありがとうございますm(_ _)m



タッグ戦で死体を無視する方法

EnemyNear,は便利なリダイレクトですが、相手がKOされていても無視しないという欠点があります。
ここでは、管理人が使用している方法をご紹介します。
以下の式を-2ステートに置いて、EnemyNear,の代わりにEnemy(var(1)),を使用するだけです。

[State -2,EnemyNear確認]
type = VarSet
trigger1 = NumEnemy > 1
trigger1 = !Enemy(1),IsHelper;Player型ヘルパーを無視 使用するかどうかはお好みで
var(1) = (!Enemy,Alive || (EnemyNear,Alive && EnemyNear,ID != Enemy,ID))

もちろん、使用する変数はvar(1)以外でも構いません。



フライング防止

常時Ctrl=0に設定し、RoundStateでのみ行動制限しているAIは、イントロを飛ばすとフライングしてしまいます。
イントロを飛ばすと、行動可能になるタイミングよりも前にRoundStateが2になってしまうからです。
これは、一度システム側でCtrlが1にセットされたのを検知してから行動させるようにすれば直ります。
ただ、常時Ctrl=0に設定する方法は振り向きアニメが乱れる事があるため、管理人は推奨しません。
(解決方法があるかもしれませんが)
ジャンプなどCPU操作できてしまう動作は無視し、次のフレームで元のステートに返る方式にした方が無難でしょう。


参考:クリエイターズJAPAN2様


MUGEN研究所へ戻る
MENUへ戻る