Skip to content

mobのAI

Ponpon edited this page Nov 7, 2024 · 50 revisions

Mobの行動AI

Mobの動き方やスキルの実行を制御します。各種トリガーでの実行やループでの実行ができます。

NBT階層

AI
┣ Death
┣ Time
┣ Damage
┣ Initial
┣ Attack
┣ Block
┣ Tick
┣ Passenger
┃ ┣ Type
┃ ┣ Check
┃ ┗ Call
┣ ProjectileDamage
┃ ┣ Physical
┃ ┣ Fire
┃ ┣ Ice
┃ ┣ Lightning
┃ ┣ Light
┃ ┗ Dark
┣ TurnCount
┗ Turn #List
  ┗ {
    ┣ Index
    ┣ Target
    ┃ ┣ Look
    ┃ ┣ Radius
    ┃ ┣ MinRadius
    ┃ ┣ IgnoreBlocks
    ┃ ┗ Rotation
    ┣ Move
    ┃ ┣ Front
    ┃ ┣ Side
    ┃ ┗ Up
    ┣ Rotate
    ┣ Skill #List
    ┃ ┗ {
    ┃   ┣ Interval
    ┃   ┃ ┣ Min
    ┃   ┃ ┣ Max
    ┃   ┃ ┗ Current
    ┃   ┣ Loop
    ┃   ┃ ┣ Max
    ┃   ┃ ┣ Range
    ┃   ┃ ┗ Current
    ┃   ┣ Once
    ┃   ┣ MP
    ┃   ┗ Call
    ┣ Once
    ┗ Exit
      ┣ Loop
      ┃ ┣ Max
      ┃ ┗ Current
      ┣ Condition
      ┗ Time

各NBT解説

AI

必須。MobAIのルートタグ。

Death

任意。CallOnDeathタグの付与が必要。Mobが死亡した時に実行するスキルを指定する。
mobの仕様#Call類

Time

任意。PortalCooldownの設定とCooldownRequired,CallOnTimeOutタグの付与が必要。MobのPortalCooldownが0になった時に実行するスキルを指定する。
mobの仕様#Call類

Damage

任意。CallOnDamageタグの付与が必要。Mobがダメージを受けた時かつHitDamageTakenが付与されているときに実行するスキルを指定する。
mobの仕様#Call類

Initial

任意。CallOnInitタグの付与が必要。Mobが召喚したときに実行されるスキルを指定する。
mobの仕様#Call類

Attack

任意。CallOnAttackタグの付与が必要。Mobがプレイヤーに直接攻撃したとき、Mobが投てきしたエンティティ(撃った矢など)がプレイヤーに当たったときに実行されるスキルを指定する。
mobの仕様#Call類

Block

任意。CallOnBlockタグの付与が必要。SmartMotionを使用したうえで、ブロックに当たった際に実行されるスキルを指定する。
mobの仕様#Call類

Tick

任意。HasAI,CallOnTickタグの付与が必要。毎tick実行するスキルを指定する。Turn[].Skillの後に実行される。
mobの仕様#Call類


Passengers

任意。HasAIタグの付与が必要。騎乗状態について毎tickチェックする。
以下子タグの説明。

Type

必須。対象のMobの上下どちらを確認するかを指定。"up" or "down" のみ有効。

Check

必須。Mobの有無を確認するかを指定。bool値のみ有効。trueの場合は存在するかどうかを確認する。falseの場合は存在しないかどうかを確認する。

Call

必須。条件を満たした時に実行するスキルを指定する。
シート状だとCall_Passenger
mobの仕様#Call類
以上Passengersの子タグの説明。


ProjectileDamage

味方側の弾に指定する攻撃力。Physical,Fire,Ice,Lightning,Light,Darkの各属性攻撃値を指定する。


TurnCount

Turnがある場合必須。Turnのリストの数を記入する。
CallSkillのChangeTurn.Setで使用する。

Turn

任意。HasAIタグの付与が必要。リスト型。リスト内の行動パターンを繰り返し実行する。
以下子タグの説明。

Index

必須。現在のTurnリストの順番を記入する。1から採番する。
CallSkillのChangeTurn.Setで使用する。


Target

任意。Mobの敵対対象を探索する。敵対対象の位置には0-0-0-0-2が用意される。
以下子タグの説明。

Look

必須。どの種類のMobに敵対するかを指定。"Player","Friendly","Enemy","Mob","All","Parent","Child","Fixed"のみ有効。
"player"はプレイヤー、"Friendly"はプレイヤー含むFriendlyチームに入っているエンティティ、"Enemy"はEnemyタグが付いている敵エンティティ、"Mob"はMobタグが付いているエンティティ、"All"は全てのMob、"Parent"は紐づけられたParentのエンティティ、"Child"は紐づけられたChildのエンティティが対象となる。
"Fixed"は自身の向きに対し相対的に固定の向きを見る。Rotationでどの方向を見るかを指定する。またこの場合RadiusIgnoreBlocksの指定が必要ない。

Radius

LookFixed以外ならば必須。探索範囲(半径 m)を指定する。double型の数値が有効。

MinRadius

LookFixed以外ならば任意で、Radiusの指定が必須。探索範囲(半径 m)を指定する。double型の数値が有効。

IgnoreBlocks

LookFixed以外ならば必須。探索時に当たり判定のないブロック(block:no_collision)を無視するかどうかを指定する。bool値のみ有効。trueの場合、ブロックがあればその時点で探索を中断する。falseの場合、ブロックがあっても探索を続行する。
未指定の場合、falseと同じ挙動をする。
以上Targetの子タグの説明。

Rotation

LookFixedならば必須。"LeftUp","LeftDown","RightUp","RightDown"が有効。値の通りの方向を向く。


Move

任意。Mobの移動を制御する。
それぞれには最大10.23(約10m)まで指定できる。
以下子タグの説明。

Front

任意。Mobの正面方向の速度を指定する。double型の数値(0.01単位)が有効。Mobの前側に0-0-0-0-2がいた場合、前方向の速度になる。Mobの後ろ側に0-0-0-0-2がいた場合、後ろ方向の速度になる。

Side

任意。Mobの横方向の速度を指定する。double型の数値(0.01単位)が有効。Mobの左側に0-0-0-0-2がいた場合、左方向の速度になる。Mobの右側に0-0-0-0-2がいた場合、右方向の速度になる。

Up

任意。Mobの上下方向の速度を指定する。double型の数値(0.01単位)が有効。Mobの上側に0-0-0-0-2がいた場合、上方向の速度になる。Mobの下側に0-0-0-0-2がいた場合、下方向の速度になる。
以上Moveの子タグの説明。


Rotate

任意。floatのリスト型。水平・垂直方向の回転速度を指定する。Ratate[0]は水平方向、Rotate[1]は垂直方向。
正の値のときはその角度だけ回転させる。負の値のときはTargetタグのエンティティをちょうど向くように回転させる。


Skill

任意。リスト型。リスト内のスキルを繰り返し実行する。
以下子タグの説明。


Interval

必須。スキル発動までのインターバルを指定する。このタグを指定しなかった場合、スポーン後に即スキルを発動し、次回のインターバルを0-2147483647 から決定する。
以下子タグの説明。

Min

任意。次回のインターバルの最小値。int型の数値が有効。
シート状だとMin_Interval

Max

任意。次回のインターバルの最大値。int型の数値が有効。
シート状だとMax_Interval

Current

任意。現在のスキル発動でのインターバル。スポーン後最初にスキルを発動するまでの時間の指定もできる。int型の数値(1以上)が有効。
以上Intervalの子タグの説明。
シート状だとCurrent_Interval


Loop

任意。現在のスキルを何回繰り返すかを指定する。
以下子タグの説明。

Max

任意。2巡目以降のLoop.Currentを指定する。
シート状だとMax_Loop_Skill

Range

任意。2巡目以降のLoop.Currentをランダムに指定する。
Max~Max+Rangeで決定される。 シート状だとRange_Loop_Skill

Current

任意。現在のスキルの残り繰り返し回数。0になった時に次のスキルをセットする。最初にスキルがセットされた時に繰り返す回数も指定できる。
以上Loopの子タグの説明。
シート状だとCurrent_Loop_Skill


Once

任意。現在のスキルがSkillリストで繰り返される残り回数を指定する。Loopが終わって次のスキルがセットされる時にOnceがカウントする。0になった時にこのスキルはSkillリストから削除される。指定しない場合、このスキルはずっと繰り返される。

MP

任意。スキル実行に必要なMPを指定する。スキル実行前に判定し、実行後に消費する。
スキルのConditionでMPが変動し、必要なMP > 現在のMPになった場合、実行後のMP消費はなくなる。

Call

必須。実行するスキルを指定する。
mobの仕様#Call類
シート状だとCall_Skill
以上Skillの子タグの説明。


Once

任意。現在のターンがTurnリストで繰り返される残り回数を指定する。ターンが終わって次のターンがセットされる時にOnceがカウントする。0になった時にこのターンはTurnリストから削除される。指定しない場合、このターンはずっと繰り返される。

Exit

任意。この行動パターンを終了し、次のパターンをセットする条件を指定する。
以下子タグの説明。


Loop

任意。Skillリストの中がループした時にカウントする。
以下子タグの説明。

Max

任意。2巡目以降のループのカウントを指定する。
シート状だとMax_Loop_Exit

Current

任意。現在のループ残り回数。最初にパターンがセットされた時の回数も指定できる。Skillの順序が1つ消費された際に回数が減り、0になった時にこの行動パターンを終了する。
以上Loopの子タグの説明。
シート状だとCurrent_Loop_Exit


Condition

任意。Conditionに成功したらこの行動パターンを終了する。
mobの仕様#Call類
シート状だとConditon

Time

任意。この行動パターンの時間(tick)を指定する。0になった時にこの行動パターンを終了する。int型の数値が有効。
シート状だとTime_Exit
以上Exitの子タグの説明。
以上Turnの子タグの説明。

指定例

上にMobが乗っているかどうかを確認する。

{
  AI: {
    Passengers: {
      Type: "up",
      Check: true,
      Call: [{Name:"<Skill>"}]
    }
  }
}

スキルを AAABBAAABBAAABBBBBB… と実行する。

#AAAで一つ、BBで一つと考える。
#AAAは3回だけでいい。
{
  AI: {
    TurnCount: 2
    Turn: [
      {
        Index: 1
        Interval: {
          Min: 10,
          Max: 60,
          Current: 35
        },
        Loop: {
          Max: 3,
          Current: 3
        },
        Once: {
          Current: 3
        },
        Call: [{Name:"A"}]
      },
      {
        Index: 2
        Interval: {
          Min: 20,
          Max: 35,
          Current: 27
        },
        Loop: {
          Max: 1,
          Range: 2,
          Current: 2
        },
        Call: [{Name:"B"}]
      }
    }
  ]
}

注意事項

Exit処理実行の優先順

現在のTurnを終了して次のTurnに移動する処理があるが、終了する条件が
Exit.Loop,Exit.Time,Exit.Condition,CallSkill ChangeTurn
と複数個ある。
これらの条件を一つでも満たすと次のTurnに移動し、それ以外の条件は満たしていても無視されることがある。
条件がチェックされる順番は、

  1. ChangeTurn
  2. Condition
  3. Loop
  4. Time

である。

Exitの条件を複数個使用するときはチェックの優先度を考えて使用するとよい。

製作手引き
重要
仕様
定義
便利なページ
Clone this wiki locally