▲前のページへ
次のページへ▼

NPCアクションスクリプトの作成


【目次】
キャラクタエディタを開く
初期設定(init)状態の作成
待機(idle)状態の作成
割り込み処理の作成
割り込み処理からの派生ステートの作成
NPCアクションスクリプトを出力する


キャラクタエディタを開く

 AIエディタによるNPC制御を組み込んだら、これを受けてキャラクタエディタによる
 NPCアニメーション制御を実行します。

■ キャラクタエディタを開く
  Unity のメニューから MoEngine > CharacterEditor でキャラクタエディタを起動させます。
  

  起動すると、以下のような画面が開きますので、メニューから [保存] を選びます。
  

  保存する場所とファイル名は以下を指定してください。
    保存先の場所: C:/MOE_CEDEC_DEMO/MOE_CEDEC/Master
    保存ファイル名 :dragon_root.xml
  


初期設定(init)状態の作成

 キャラクタスクリプトの初期値を設定する「初期設定」の状態を作ります。

■ init ステートラベルの作成
  CharacterEditor 上で右クリックし、メニューから [システム処理] > [ステートラベル] を選択し、
  ステートラベル名を「init」とした上で、[開始]の Out 端子と自身の In 端子を繋いでください。
  

■ init ステートラベルの中身を作成する
  続けて、init ステートラベルの中身を作成していきます。
  initステート内の[エディタを開く] ボタンをクリックし、initステートウィンドウに以下の手続きを行なってください。
    ※ 内容として端的に説明すると、HPを200、攻撃力を30、死亡フラグをOFFに設定するという処理になります。

    ① 右クリックメニューから [変数・定数] > [変数の設定] を選択し、[開始] の Out 端子と自身の In 端子とを繋ぐ。
    ② 右クリックメニューから [変数・定数] > [定数] を選択し、型を「Int」、値を「200」にして、① の In 側 Value 端子と自身の Out 端子を繋ぐ。
    ③ 右クリックメニューから [変数・定数] > [ローカルメモリ] を選択し、型を「Int」、名前を「HP」にして、① の Out 側 Value 端子と自身の In 端子を繋ぐ。
    ④ 右クリックメニューから [変数・定数] > [変数の設定] を選択し、① の Out 端子と自身の In 端子とを繋ぐ。
    ⑤ 右クリックメニューから [変数・定数] > [定数] を選択し、型を「Int」、値を「30」にして、④ の In 側 Value 端子と自身の Out 端子を繋ぐ。
    ⑥ 右クリックメニューから [変数・定数] > [ローカルメモリ] を選択し、型を「Int」、名前を「ATK」にして、④ の Out 側 Value 端子と自身の In 端子を繋ぐ。
    ⑦ 右クリックメニューから [変数・定数] > [変数の設定] を選択し、④ の Out 端子と自身の In 端子とを繋ぐ。
    ⑧ 右クリックメニューから [変数・定数] > [定数] を選択し、型を「Int」、値を「0」にして、⑦ の In 側 Value 端子と自身の Out 端子を繋ぐ。
    ⑨ 右クリックメニューから [変数・定数] > [変数] を選択し、型を「Int」、名前を「DeadFlag」にして、⑦ の Out 側 Value 端子と自身の In 端子を繋ぐ。

  上記工程の結果、initステートウィンドウが以下のようになっていれば問題ありません。
  

■ init ステートウィンドウを閉じる
  init ステートの中身は上記だけですので、組み込み終わったら 右上の×ボタンを押して閉じます。
    ※ まだ CharacterEditor ウィンドウは閉じないでください。
  

■ CharacterEditor の内容を上書き保存しておく
  ここまでの操作で、CharacterEditer の内容を上書き保存しておきましょう。
    ※ まだ CharacterEditor ウィンドウは閉じないでください。
  


待機(idle)状態の作成

 キャラクタスクリプトの基本姿勢となる「待機」の状態を作ります。

■ idle ステートラベルの作成
  以下の手順で CharacterEditor 上に idle ステートラベルを作成してください。

    ① 右クリックメニューから[システム処理] > [ステートラベル] を選択し、ラベル名を idle とする。
    ② [開始] の Out 端子と [idle ステートラベル]の In 端子とを繋ぐ。
    ③ [idle ステートラベル] の In 端子と Out 端子とを繋ぐ。

  上記操作によって、以下のような状態にしてください。
  

■ idle ステートラベルの中身を作成する
  続けて、idleステートラベルの[エディタを開く] ボタンをクリックし、idleステートのウィンドウを開いた後、
  idleステートウィンドウ内にて以下の手順で処理を行なってください。
    ※ 内容として端的に説明すると、変数 MotionType(前述のユニット割り込み)の値によって、待機・移動・攻撃を切り替えるという処理になります。

    ① 右クリックメニューから[システム処理] > [待機] を選択し、値を「200」に設定し、[開始] の Out 端子と自身の In 端子とを繋ぐ。
    ② 右クリックメニューから[変数・定数] > [比較分岐] を選択し、条件式に「Arg == Arg2」を設定し、① の Out 端子と自身の In 端子とを繋ぐ。
    ③ 右クリックメニューから[変数・定数] > [変数] を選択し、型に「Int」、名前に「MotionType」を設定し、② の Arg1 端子と自身の Out 端子とを繋ぐ。
    ④ 右クリックメニューから[変数・定数] > [定数] を選択し、型に「Int」、値に「1」を設定し、② の Arg2 端子と自身の Out 端子とを繋ぐ。
    ⑤ 右クリックメニューから[システム処理] > [ステートラベル] を選択し、名前に「idle_ready」を設定し、② の True 端子と自身の In 端子とを繋ぐ。
    ⑥ 右クリックメニューから[変数・定数] > [比較分岐] を選択し、条件式に「Arg == Arg2」を設定し、② の False 端子と自身の In 端子とを繋ぐ。
    ⑦ 右クリックメニューから[変数・定数] > [変数] を選択し、型に「Int」、名前に「MotionType」を設定し、⑥ の Arg1 端子と自身の Out 端子とを繋ぐ。
    ⑧ 右クリックメニューから[変数・定数] > [定数] を選択し、型に「Int」、値に「2」を設定し、⑥ の Arg2 端子と自身の Out 端子とを繋ぐ。
    ⑨ 右クリックメニューから[システム処理] > [ステートラベル] を選択し、名前に「run_ready」を設定し、⑥ の True 端子と自身の In 端子とを繋ぐ。
    ⑩ 右クリックメニューから[変数・定数] > [比較分岐] を選択し、条件式に「Arg == Arg2」を設定し、⑥ の False 端子と自身の In 端子とを繋ぐ。
    ⑪ 右クリックメニューから[変数・定数] > [変数] を選択し、型に「Int」、名前に「MotionType」を設定し、⑩ の Arg1 端子と自身の Out 端子とを繋ぐ。
    ⑫ 右クリックメニューから[変数・定数] > [定数] を選択し、型に「Int」、値に「3」を設定し、⑩ の Arg2 端子と自身の Out 端子とを繋ぐ。
    ⑬ 右クリックメニューから[システム処理] > [ステートラベル] を選択し、名前に「attack_ready」を設定し、⑩ の True 端子と自身の In 端子とを繋ぐ。
    ⑭ 右クリックメニューから[システム処理] > [ブランチ実行] を選択し、名前に「idle」を設定し、⑩ の False 端子と自身の In 端子とを繋ぐ。

  上記操作によって、以下のような状態にしてください。
  

■ idle_ready ステートラベルの中身を作成する
  idle ステートウィンドウ内に作成したidle_ready ステートラベルの中身を作成します。
  idle ステートウィンドウにある [idle_ready ステートラベル] 内の [エディタを開く] ボタンをクリックし、
  idle_readyステートのウィンドウを表示させた上で、以下の手続きを行なってください。
    ※ 内容として端的に説明すると、moveフラグをOFF=走らない状態にするという処理になります。

    ① 右クリックメニューから[ユニット制御] > [アニメーションパラメータ] を選択し、型を「Bool」、パラメータ名を「move」に設定し、
      パラメータ欄のチェックボックスを OFF にした上で、[開始] の Out 端子と自身の In 端子とを繋ぐ。
    ② 右クリックメニューから[システム処理] > [ブランチ実行] を選択し、名前に「idle」を設定し、① の Out 端子と自身の In 端子とを繋ぐ。

  上記操作によって、以下のような状態にしてください。
  

■ run_ready ステートラベルの中身を作成する
  idle ステートウィンドウ内に作成したrun_ready ステートラベルの中身を作成します。
  idle ステートウィンドウにある [run_ready ステートラベル] 内の [エディタを開く] ボタンをクリックし、
  run_readyステートのウィンドウを表示させた上で、以下の手続きを行なってください。
    ※ 内容として端的に説明すると、moveフラグをON=走らせるという処理になります。

    ① 右クリックメニューから[ユニット制御] > [アニメーションパラメータ] を選択し、型を「Bool」、パラメータ名を「move」に設定し、
      パラメータ欄のチェックボックスを ON にした上で、[開始] の Out 端子と自身の In 端子とを繋ぐ。
    ② 右クリックメニューから[システム処理] > [待機] を選択し、値を「100」に設定し、① の Out 端子と自身の In 端子とを繋ぐ。
    ③ 右クリックメニューから[システム処理] > [ブランチ実行] を選択し、名前に「idle」を設定し、② の Out 端子と自身の In 端子とを繋ぐ。

  上記操作によって、以下のような状態にしてください。
  

■ attack_ready ステートラベルの中身を作成する
  idle ステートウィンドウ内に作成したattack_ready ステートラベルの中身を作成します。
  idle ステートウィンドウにある [attack_ready ステートラベル] 内の [エディタを開く] ボタンをクリックし、
  attack_readyステートのウィンドウを表示させた上で、以下の手続きを行なってください。
    ※ 内容として端的に説明すると、AttackTrigger1フラグをON=攻撃(1)を実行するという処理になります。

    ① 右クリックメニューから[ユニット制御] > [アニメーションパラメータ] を選択し、型を「Bool」、パラメータ名を「move」に設定し、
      パラメータ欄のチェックボックスを OFF にした上で、[開始] の Out 端子と自身の In 端子とを繋ぐ。
    ② 右クリックメニューから[ユニット制御] > [アニメーションパラメータ] を選択し、型を「Trigger」、パラメータ名を「AttackTrigger1」に設定し、
      ① の Out 端子と自身の In 端子とを繋ぐ。
    ③ 右クリックメニューから[ユニット制御] > [サブコリジョン] を選択し、オフセット値に(0, 0, -1), 効果範囲に 1, 効果時間に 0.5 を設定し、
      ② の Out 端子と自身の In 端子とを繋ぐ。
    ④ 右クリックメニューから[システム処理] > [ブランチ実行] を選択し、名前に「idle」を設定し、③ の Out 端子と自身の In 端子とを繋ぐ。

  上記操作によって、以下のような状態にしてください。
  

■ idle, idle_ready, run_ready, attack_ready ステートウィンドウを閉じる
  idle, idle_ready, run_ready, attack_ready ステートの中身は上記だけですので、
  組み込み終わったら 右上の×ボタンを押して閉じます。
    ※ まだ CharacterEditor ウィンドウは閉じないでください。
  

■ CharacterEditor の内容を上書き保存しておく
  ここまでの操作で、CharacterEditer の内容を上書き保存しておきましょう。
    ※ まだ CharacterEditor ウィンドウは閉じないでください。
  


割り込み処理の作成

 NPCキャラクタについては AI思考パターンに応じて「割り込み」が発生します。
 「割り込み」が発生したときに、前述の「idleステート」における「MotionType」を切り替える処理を加えましょう。

■ 割り込み処理を追加する
  以下の手順で、CharacterEditor 上に割り込み処理を追加してください。
    ※ 内容として端的に説明すると、AI(後述のロジック)から指示があったら ai_select を実行するという処理になります。

    ① 右クリックメニューから [システム処理] > [割り込み処理] を選択し、割り込み処理名を「Message」とする。
    ② 右クリックメニューから [変数・定数] > [比較演算] を選択し、比較演算を「Arg1 == Arg2」にして、① の Out 端子と自身の In 端子を繋ぐ。
    ③ 右クリックメニューから [変数・定数] > [変数] を選択し、型を「Int」、名前を「DeadFlag」にして、② の Arg1 端子と自身の Out 端子を繋ぐ。
    ④ 右クリックメニューから [変数・定数] > [定数] を選択し、型を「Int」、値を「1」にして、② の Arg2 端子と自身の Out 端子を繋ぐ。
    ⑤ 右クリックメニューから [システム処理] > [ステートラベル] を選択し、ステートラベル名を「end」にして、② の True 端子と自身の In 端子を繋ぐ。
    ⑥ 右クリックメニューから [変数・定数] > [比較演算] を選択し、比較演算を「Arg1 == Arg2」にして、② の False 端子と自身の In 端子を繋ぐ。
    ⑦ 右クリックメニューから [変数・定数] > [システム変数] を選択し、名前を「Interrupt Type」にして、⑥ の Arg1 端子と自身の Out 端子を繋ぐ。
    ⑧ 右クリックメニューから [変数・定数] > [システム定数] を選択し、名前を「DAMAGE」にして、⑥ の Arg2 端子と自身の Out 端子を繋ぐ。
    ⑨ 右クリックメニューから [システム処理] > [ステートラベル] を選択し、ステートラベル名を「damage_start」にして、⑥ の True 端子と自身の In 端子を繋ぐ。
    ⑩ 右クリックメニューから [変数・定数] > [比較演算] を選択し、比較演算を「Arg1 == Arg2」にして、⑥ の False 端子と自身の In 端子を繋ぐ。
       同時に、⑦ の Out 端子と自身の Arg1 端子とを繋ぐ。
    ⑪ 右クリックメニューから [変数・定数] > [システム定数] を選択し、システム定数名を「INTERRUPT_AI」にして、⑩ の Arg2 端子と自身の Out 端子を繋ぐ。
    ⑫ 右クリックメニューから [システム処理] > [ステートラベル] を選択し、ステートラベル名を「ai_select」にして、⑩ の True 端子と自身の In 端子を繋ぐ。
    ⑬ 右クリックメニューから [システム処理] > [割り込み終了] を選択し、⑩ の False 端子と自身の In 端子を繋ぐ。

  上記工程の結果、割り込み制御が以下のようになっていれば問題ありません。
  

■ end ステート処理を追加する
  続けて、CharacterEditor 上の ⑤ として加えた「end ステート」の処理内容について記述します。
  end ステートの [エディタを開く] ボタンをクリックして、end ステートウィンドウに以下の手順で処理を加えてください。
    ※ 内容として端的に説明すると、死んでいる間、割り込み処理(入力制御など)を何もさせないという処理になります。

    ① 右クリックメニューから [システム処理] > [割り込み終了] を選択し、[開始] の Out 端子と自身の In 端子を繋ぐ。

  上記工程の結果、end ステートウィンドウが以下のようになっていれば問題ありません。
  

■ damage_start ステート処理を追加する
  続けて、CharacterEditor 上の ⑨ として加えた「damage_start ステート」の処理内容について記述します。
  damage_start ステートの [エディタを開く] ボタンをクリックして、damage_start ステートウィンドウに以下の手順で処理を加えてください。
    ※ 内容として端的に説明すると、自分の体力値から、相手の攻撃力値を引くという処理になります。

    ① 右クリックメニューから [共通処理] > [ユニットパラメータ取得] を選択し、型に「Int」、ユニット名に「COMMON」、パラメータ名に「ATK」を設定し、
      [開始] の Out 端子と自身の In 端子を繋ぐ。
    ② 右クリックメニューから [変数・定数] > [システム変数] を選択し、変数名に「Fact Unit Id」を設定し、① の UnitId 端子と自身の Out 端子を繋ぐ。
    ③ 右クリックメニューから [変数・定数] > [算術演算] を選択し、計算式に「Value -= Arg1」を設定し、① の Out 端子と自身の In 端子を繋ぐ。
    ④ 右クリックメニューから [変数・定数] > [戻り値] を選択し、③ の Arg1 端子と自身の Out 端子を繋ぐ。
    ⑤ 右クリックメニューから [変数・定数] > [ローカルメモリ] を選択し、型に「Int」、名前に「HP」を設定し、③ の Value 端子と自身の In 端子を繋ぐ。
    ⑥ 右クリックメニューから [システム処理] > [割り込み終了] を選択し、ラベル名に「damage_wait」を設定し、③ の Out 端子と自身の In 端子を繋ぐ。

  上記工程の結果、damage_start ステートウィンドウが以下のようになっていれば問題ありません。
  

■ ai_select ステート処理を追加する
  続けて、上述の中で加えた「ai_select ステート」の処理内容について記述します。
  ai_select の [エディタを開く] ボタンをクリックして、ai_selectステートウィンドウに以下の手順で処理を加えてください。
    ※ 内容として端的に説明すると、AIからの割り込み値によって、変数MotionTypeの値を変更する=idleステートで行動パターンを変更するという処理になります。

    ① 右クリックメニューから [変数・定数] > [変数の設定] を選択し、[開始] の Out 端子と自身の In 端子を繋ぐ。
    ② 右クリックメニューから [変数・定数] > [システム変数] を選択し、システム変数名を「AI_Intrupt_Type」とし、① の In 側 Value 端子と自身の Out 端子を繋ぐ。
    ③ 右クリックメニューから [変数・定数] > [変数] を選択し、型を「Int」、変数名を「MotionType」とし、① の Out 側 Value 端子と自身の In 端子を繋ぐ。
    ④ 右クリックメニューから [システム処理] > [割り込み終了] を選択し、① の Out 端子と自身の In 端子を繋ぐ。

  上記工程の結果、割り込み制御が以下のようになっていれば問題ありません。
  

■ end, damage_start, ai_select ステートウィンドウを閉じる
  end, damage_start, ai_selectステートの中身は上記だけですので、組み込み終わったら 右上の×ボタンを押して閉じます。
    ※ まだ CharacterEditor ウィンドウは閉じないでください。
  

■ CharacterEditor の内容を上書き保存しておく
  ここまでの操作で、CharacterEditer の内容を上書き保存しておきましょう。
    ※ まだ CharacterEditor ウィンドウは閉じないでください。
  


割り込み処理からの派生ステートの作成

 上述の割り込み処理にて、「damage_start」ステートから、派生分岐するステート「damage_wait」を指定していますので、
 これからその「damage_wait」ステートを作成します。

■ damage_wait追加する
  以下の手順で、CharacterEditor 上に派生ステートを追加してください。
    ※ 内容として端的に説明すると、「ダメージを受ける」モーションを終了したら idle に戻すという処理になります。

    ① 右クリックメニューから [システム処理] > [ステートラベル] を選択し、ステートラベル名を「damage_wait」とし、「Idle」の In 端子と自身の Out端子を繋ぐ。

  上記工程の結果、CharacterEditor が以下のようになっていれば問題ありません。
  

■ damage_wait ステート処理を追加する
  更に、CharacterEditor の ③ で加えた「damage_wait ステート」の処理内容について記述します。
  damage_wait の [エディタを開く] ボタンをクリックして、damage_wait ステートウィンドウに以下の手順で処理を加えてください。
    ※ 内容として端的に説明すると、HPが0以下なら死亡ステートへ、それ以外はダメージモーションを取るという処理になります。

    ① 右クリックメニューから [変数・定数] > [比較分岐] を選択し、比較演算を「Arg1 <= Arg2」に設定し、[開始] の Out 端子と自身の In 端子を繋ぐ。
    ② 右クリックメニューから [変数・定数] > [ローカルメモリ] を選択し、型に「Int」、名前に「HP」を設定し、① の Arg1 端子と自身の Out 端子を繋ぐ。
    ③ 右クリックメニューから [変数・定数] > [定数] を選択し、型に「Int」、値に「0」を設定し、① の Arg2 端子と自身の Out 端子を繋ぐ。
    ④ 右クリックメニューから [システム処理] > [ステートラベル] を選択し、ステートラベル名を「dead_start」とし、① の True 端子と自身の In 端子を繋ぐ。
    ⑤ 右クリックメニューから [ユニット制御] > [アニメーションパラメータ] を選択し、パラメータ要素をTrigger、
      パラメータ名を DamageTrigger に設定し、① の False 端子と自身の In 端子を繋ぐ。
    ⑥ 右クリックメニューから [システム処理] > [待機] を選択し、数値 400 を設定し、⑤ の Out 端子と自身の In 端子を繋ぐ。

  上記工程の結果、damage_wait ステートウィンドウが以下のようになっていれば問題ありません。
  

■ dead_start ステート処理を追加する
  更に、damage_waitステートウィンドウの ④ で加えた「dead_start ステート」の処理内容について記述します。
  dead_start の [エディタを開く] ボタンをクリックして、dead_start ステートウィンドウに以下の手順で処理を加えてください。
    ※ 内容として端的に説明すると、死亡フラグを立て、倒れるアニメーションをして、ユニットを削除するという処理になります。

    ① 右クリックメニューから [変数・定数] > [変数の設定] を選択し、[開始] の Out 端子と自身の In 端子を繋ぐ。
    ② 右クリックメニューから [変数・定数] > [定数] を選択し、型に「Int」、値に「1」を設定し、① の In 側 Value 端子と自身の Out 端子を繋ぐ。
    ③ 右クリックメニューから [変数・定数] > [変数] を選択し、型に「Int」、名前に「DeadFlag」を設定し、① の Out 側 Value 端子と自身の In 端子を繋ぐ。
    ④ 右クリックメニューから [ユニット制御] > [アニメーションパラメータ] を選択し、パラメータ要素をTrigger、
      パラメータ名を DownTrigger に設定し、① の Out 端子と自身の In 端子を繋ぐ。
    ⑤ 右クリックメニューから [システム処理] > [待機] を選択し、数値に「2000」を設定し、④ の Out 端子と自身の In 端子を繋ぐ。
    ⑥ 右クリックメニューから [共通処理] > [ユニット削除] を選択し、⑤ の Out 端子と自身の In 端子を繋ぐ。
    ⑦ 右クリックメニューから [変数・定数] > [システム変数] を選択し、⑥ の TargetId 端子と自身の Out 端子を繋ぐ。
    ⑧ 右クリックメニューから [変数・定数] > [システム変数] を選択し、⑥ の UnitId 端子と自身の Out 端子を繋ぐ。
    ⑨ 右クリックメニューから [システム処理] > [ブランチ実行] を選択し、ブランチ名に idle を設定し、⑥ の Out 端子と自身の In 端子を繋ぐ。

  上記工程の結果、dead_start ステートウィンドウが以下のようになっていれば問題ありません。
  

■ damage_wait, dead_start ステートウィンドウを閉じる
  damage_wait, dead_start ステートの中身は上記だけですので、組み込み終わったら 右上の×ボタンを押して閉じます。
    ※ まだ CharacterEditor ウィンドウは閉じないでください。
  

■ CharacterEditor の内容を上書き保存しておく
  ここまでの操作で、CharacterEditer の内容を上書き保存しておきましょう。
    ※ まだ CharacterEditor ウィンドウは閉じないでください。
  


NPCアクションスクリプトを出力する

 CharacterEditor で編集したNPC制御をスクリプトに出力します。

■ スクリプトを出力する
  CharacterEditor のメニューから [スクリプトを出力] ボタンをクリックします。
  

  保存する場所とファイル名は以下を指定してください。
    保存先の場所: C:/MOE_CEDEC_DEMO/MOE_CEDEC/Master
    保存ファイル名 :dragon_root.mos
  

  所定の場所(Master)にdragon_root.mos および dragon_root_param.h が作成され、
  以下のダイアログが表示されますので [OK] ボタンをクリックします。
  

■ CharacterEditor を閉じる
  スクリプトが出力されたら、CharacterEditor ウィンドウの右上の×ボタンをクリックして終了します。
  

  以下のダイアログが表示されたら[YES]ボタンをクリックしてください。
  


▲前のページへ
次のページへ▼