by adi ( フォント環境:MS ゴシック 標準 サイズ10 )  ■AI用・擬似コモンステート(Pseudo Common State)  Ctrlがある為、不安定になってしまう制御を正確に制御するためのAI用ステート。  簡潔に言うと「基本動作と全く同じ事をさせ、技を出す」というステートを作る。  ■システム概要   「繋げる技→x→追撃技」という名称を使います。  >「繋げる技」の基本動作へ戻る記述の手前に、   その記述をコピーし、AIである+技を繋げられる、という条件式とでAI用ステートへ飛ばす。  >AI用ステートではCtrl=0以外、戻る予定であった基本動作と同じ動作を行うようにし、   調整の必要があれば調整動作を擬似的に基本動作で再現させ、    タイミングが来た場合に「追撃技」へとステートを飛ばします。  >AI用ステートでタイミングを逸した場合は基本動作ステートへと戻します。  ※AI用ステートで基本動作以外の行為を行わせないように気をつけます。  ※ このステートで攻撃を受けても通常のやられステートへ移行するだけです。  ■言い訳  「AI用ステートですが、させる動作は手操作と殆ど同じです。」  許可さえあれば、むしろ使うべき手法だと私は思います。  ■ステートの制作方法の大雑把な説明  >Commonステートからそのステートをコピーしてくる。  >StateDefの下にCtrl = 0を追加する。Ctrl=1がある場合は書き換える。  >ステートにNoturnがない場合は、ターン処理を付け加えるなどの調整をする。  >ステート移行の記述を加える。技用も、基本ステート用も。  >変な動作を行っていないか確認する。  >-1,-2,-3ステートでそのステートを対象としている処理がある場合、   このステートも対象にするよう記述を加える。  ちなみに、Varを使うとより正確に制御できるかと思います。  ■終了タイミング目押し型の例(立ち用/前専用) [StateDef xxxxxx] type = S physics = S sprpriority = 0 Ctrl = 0 ;立ち動作アニメーション [State 0, 1] Type = ChangeAnim Trigger1 = Anim != 0 Value = 0 [State -1, 2] Type = ChangeState Value = *コンボ動作へ* Trigger1 = Time ; この場合、1フレームだけこのステートに残る。 [State -1, 1] Type = ChangeState Value = 0 ;立ちステートへ Ctrl = 1 Trigger1 = P2Dist X < 0 ; 相手が後ろ Trigger2 = Time > 1; 時間を空ける場合ここも調整。 ;■  ■立ち〜歩き の例 [StateDef xxxxxx] type = S physics = S sprpriority = 0 Ctrl = 0 [State -2, 1] Type = ChangeState Value = 0 ;立ちステートへ Ctrl = 1 Trigger1 = *コンボタイミングを逸した時*; [State -2, 2] Type = ChangeState Value = *コンボ動作へ* TriggerAll = Time ;最低1フレーム経ってから Trigger1 = *コンボタイミング* ;ターン処理 [State -1, 1] Type = ChangeAnim Trigger1 = P2Dist X < 0 ; 相手が後ろ Value = 5 [State -1, 2] Type = Turn Trigger1 = P2Dist X < 0 ; 相手が後ろ ;State,0 立ち動作 [State 0, 1] Type = ChangeAnim TriggerAll = Vel X = 0 ;速度を失っている場合。 Trigger1 = Anim != 0 && Anim != 5 Trigger2 = Anim = 5 && AnimTime = 0 Value = 0 [State 0, 2] Type = VelSet Trigger1 = Time = 0 Y = 0 [State 0, 3] Type = VelSet Trigger1 = abs(vel x) < 2 Trigger2 = Time = 4 X = 0 [State 0, 4] Type = ChangeState Trigger1 = !Alive Value = 5050 ;State,20 歩き動作・制御 [State 20, 1] type = VelSet trigger1 = command = "holdfwd" ; まず、この状態で、動作を確認しておく事。 ;Trigger1 = *前制御* x = const(velocity.walk.fwd.x) [State 20, 2] type = VelSet trigger1 = command = "holdback" ; Ctrl=0 のため攻撃は出来ないが歩行は出来ます。 ;Trigger1 = *後制御* x = const(velocity.walk.back.x) [State 20, 3] type = ChangeAnim triggerall = vel x > 0 trigger1 = Anim != 20 && Anim != 5 trigger2 = Anim = 5 && AnimTime = 0 value = 20 [State 20, 4] type = ChangeAnim triggerall = vel x < 0 trigger1 = Anim != 21 && Anim != 5 trigger2 = Anim = 5 && AnimTime = 0 value = 21 ;■  ■屈み→立ち の例 (Var1つ使用 1つのステートで複数の技に対応可能な例)  Var(*NextStateNo*) 移行したいステート番号を持ったVar [State -1,xxxx];技側 Type = ChangeState value = IfElse( StateType = S ,Var(*NextStateNo*):=*StateNo* ,*AI用StateNo*xxxx12* );屈みの場合処理が遅れる。 TriggerAll = StateType != A && Ctrl ; StateType = Cの場合立ち上がり動作を挟む為、StateType!=A ;IfElseの仕組み ;1.IfElseは、IfElse(xx ,yy ,zz)この三つで構成され、 ;   それぞれ(xx条件 ,yy条件真での数値 ,zz条件偽での数値)となっている。 ;2.Var(**):=xxx の:=はその記述が参照された時、Var(**)にxxxを代入するというもの。 ;3.Var(**):=xxx の数値はxxxである為、 上記の例で条件が真の場合*StateNo*のステートへ飛ぶ。 ;4.IfElseの行は真偽に関わらず全てが参照される為、 ;   上記の例で条件が偽の場合でもVar(**):=xxの代入は行われ、*AI用StateNo*へと飛ぶ。 ;.このAI用ステートは StateType = C && Ctrl が条件です。 ;AI用ステート 屈み→立ち [Statedef xxxx12] Type = S Physics = S Anim = 12 Ctrl = 0 ;開始時Var(*NextStateNo*)が無い場合、本来の立ちあがりステートへ [State xxxx12] Type = ChangeState Trigger1 = !Var(*NextStateNo*) && !Time Value = 12 Ctrl = 1 ;立ち振り向き処理 [State -1, 1] Type = ChangeAnim Trigger1 = P2Dist X < 0 ; 相手が後ろ Value = 5 [State -1, 2] Type = Turn Trigger1 = P2Dist X < 0 ; 相手が後ろ ;Var(*NextStateNo*)の技へ移行 [State xxxx12, 1] Type = ChangeState TriggerAll = StateType = S ; TriggerAll = Time && Var(*NextStateNo*) ;移行条件 TriggerAll = Time > x ;数フレームなら遅延させてもいい。;!Timeだと、遅延にならない。 Trigger1 = Var(*NextStateNo*) = *StateNo* ; Trigger2 = Var(*NextStateNo*) = xxx ; Trigger3 = Var(*NextStateNo*) = xxx && *他の条件* ; Value = Var(*NextStateNo*) ;途中でVar(*NextStateNo*)が無い場合、立ち上がり動作が終了したら立ちステートに。 [State xxxx12, end-1] Type = ChangeState Trigger1 = AnimTime = 0 && Anim != 0 Trigger1 = !Var(*NextStateNo*) Value = 0 Ctrl = 1 ;遅延で立ち上がり動作が終わってしまった時、立ち動作に [State xxxx12, state0];受付持続 Type = ChangeAnim Trigger1 = AnimTime = 0 && Anim != 0 Trigger1 = Var(*NextStateNo*) Value = 0 ;State,0 立ち動作 [State 0, 3] type = VelSet Trigger1 = Anim = 0 trigger1 = abs(vel x) < 2 x = 0 [State 0, 4] type = ChangeState Trigger1 = Anim = 0 trigger1 = !alive value = 5050 ;しばらくChangeStateが行われなかった場合、立ち動作に [State xxxx12, end-x] Type = ChangeState Trigger1 = Time > 30 ;0.5秒まで Value = 0 Ctrl = 1