Interrupt Override Packageとは、
特別な状況下でInterrupt Behaviorの既定のAI
(「死体観察」「警告」「戦闘観戦」「戦闘」)を上書きできるAI Packageです(一般的なAI Packageも、原始的なSandboxのふるまいをするデフォルトAIを上書きしていると言えるかもしれません)。
たとえば「Travel」のAI Packageで街道を移動中だったNPCが死体を見つけたとき、NPCは死体のそばにしゃがんで手を伸ばす行動をとることがあります。これは「Observe Dead Body」というInterrupt Behaviorが通常時のPackageを中断して実行されたから。デフォルトでは死体のそばにしゃがむだけですが、Interrupt Override Packageとして「Acquire」のAI Packageを特別に設定してやると、死体を気遣うかわりに
懐からお金を抜き取ってさっさと逃げるという行動に置き換えることが可能です。
Combat Override Packageは、NPCの戦闘中に実行されるInterrupt Behaviorを上書きできるAI Packageです。
Combat OverrideにAI Packageが指定されていなければデフォルトのAIが働いて、NPCはそれぞれのCombat Styleに応じた戦闘を行います。弓で狙われていたら遮蔽物に隠れる、逆に弓で狙っているほうは隠れた敵が狙える位置に移動する、オークフレッシュをかけてから特攻する、体力が低くなればポーションや回復魔法を使うなど、状況に即応した非常に賢い動きです。飛んでくる矢を見切って回避する技も披露してくれます。
戦うだけなら、デフォルトのAIだけでも十分でしょう。
ところが、このデフォルトのAIでは絶対にしてくれない行動というものもあります。たとえば、傷ついた味方に対する回復行動。「他者治癒」という魔法が存在しているにもかかわらず、NPCがこの魔法を使うことはありません。AI自体がそういう魔法を扱う枠組みを持っていないようです。
こういった例外的行動を行わせたい時、Combat Override Packageは非常に強力な手段の一つになります。
「UseMagic」のAI PackageをCombat Overrideに設定してやることで、「他者治癒」を味方に使わせることが可能になります。「Eat」Packageを使えば、戦闘中にパンをかじらせることもできるし、ポーションで自分を強化させることもできます。デフォルトのAIでは逃げ回るだけの子供も、「UseWeapon」を駆使したPackageを搭載することによって、敵を攻撃させることが可能になります。
AI Packageは決められた行動を決められたように行うだけなので、柔軟性に大きく欠けます。実行の判定も限られたCondition Functionを駆使するしかありません。しかし、賢いデフォルトのAIとうまく組み合わせることで、さらに幅の広い戦い方を演出することが可能になるでしょう。
前回から大分間が空いてしまいましたが、実際にPackageを作りつつ、Combat Overrideを扱うためのコツを探っていこうかと思います。
【ヒーラー用Combat Override Package】
まず最初に、プレイヤーを回復してくれるNPCのCombat Override Packageを作ってみることにします。
Override Packageといっても基本は一般的なAI Packageと同じです。実行される状況が違うだけ。
Packageを新規作成してIDを決めたら、「Interrupt Override」の項目から"Combat"を選択。この設定を行うのが一般的なAI Packageと異なるところです。これだけでCombat Override Packageになります。
この設定を忘れても動きましたが、Override系のPackageは通常時のAI Packageにはない特別な情報を取得してきます。忘れないほうが無難でしょう。
それ以外は通常のAI Packageを作るときと同じ方法でいけます。戦闘用なので、「Ignor Combat」などFlagsタブのいくつかの項目は機能しない等の違いはあります。
Procedure Treeを自作して、こんなAI Packageをつくりました(Procedure Treeの編集方法は
こちら)。
自分の命が危険にさらされていないとき(自分の体力が半分以上あるとき)、プレイヤーの体力が7割以下になったら「
Procedure:UseMagic」で「他者治癒」をプレイヤーに対して行います。
それ以外のときは、「
Procedure:HoldPosition」によって、デフォルトの戦闘AIが実行されます。
UseMagicの設定は、「Location」を「自分の周辺1500Radius」、「HoldWhenBlocked」をFalseにしています。こうすると、自分が今いる場所からプレイヤーに向けて、たとえ射線が塞がれていてもかまわず魔法を放ちます。
CastTimeの設定は、「0」にしていると魔法のデフォルトのキャスト時間が適用されるようです。ただし使う魔法が「治癒の手」などのようにキャストし続けるタイプのものだと、時間設定が必要です。
NumToCastは最大最小ともに「1」を設定し、一回だけ魔法を使わせることにしました。一回でプレイヤーの体力が回復しきらなくても、実行条件がTrueのままなので再度UseMagicが実行されて回復を行います。
HoldPositionの「Location」には"SelfLocation"を割り当てています。
Flagsタブの設定はこんな感じ。
Conditionsタブにて、そのNPCがプレイヤーのフォロワーになっているときだけこのCombat Overrideが有効になるようにします。
チームメイトになっているか、フォロワー専用のファクションのどれかに入っているかでフォロワー状態を判断するようにしました。
【NPCへの適用】
Packageができたら、FormListを新規作成してそこにPackageを登録します。このFormListはそのままAI Package Listとして機能します。複数のPackageが登録されていたら上から順にPacakgeを参照し、最初に実行条件が合ったPackageが実行されます。これも通常時のAI Packageの設定と同じです。
Combat Override ListをNPCに適用します。
ActorデータのAI Packagesタブにて設定できる場所があります。しかしActorデータに登録されている情報は、クエストの「エイリアス」というものによって実行されなくなることが多々あります。なので今回の場合、実はActorデータに登録するのは全く意味がありません。
バニラのフォロワー雇用クエスト「DialogueFollower」のFollowerエイリアス。雇用したNPCはこのエイリアスに放り込まれます。
エイリアスは適用されている間だけ、そのNPCに追加設定を与えます。ざっと見るとプレイヤーに追従するAIや、フォロワー専用ファクションなどの設定が登録されているのが分かります。エイリアスのAI Package Listに登録されているPackageは、ActorデータのAI Package Listに上乗せされる形になります。
右下のAlias Package Dataを見ると、Combat Override Package Listにも設定が入っています。
これもやっぱり通常のAI Package Listと同じなのですが、特定のNPCに適用されているエイリアスを含めて全体を見ると、上図のようになります。
ActorデータのPackage Listに、クエストエイリアスで設定されているPackage Listが上乗せされています。システムは上から順に実行可能なPackageを探すので、途中のクエストエイリアスで常時実行可能なPackageが設定されていると、下位のクエストエイリアスやActorデータに設定されているPackageは参照されないことになってしまいます。
上図の「優先度:低」のクエストをフォロワー雇用クエストと見るならば、これへさらに上乗せできる「優先度:高」のクエストを作り、そこのエイリアスにPackage Listを登録。エイリアスをNPCに被せることが必要になります。
ちなみに最強の優先度を誇るAI Packageは、クエストに設定されている「Scene」と思われます。一度実行されるとシーンが終わるか中断されるまで、より優先度の高いクエストのシーンといえど手が出せなくなるようです。
優先度100のクエストを新規作成し、エイリアスにCombat Override Listを登録しました。
これで戦闘中、このNPCはフォロワー雇用クエストの設定を無視してこちらの思惑通りの戦いができるようになります。
優先度の値は、自分が使っているフォロワー拡張Modの持つクエストの優先度より1大きければ十分です。無駄に大きいと別のModとの干渉が出てきます。今回はテストなので最強値を使用しています。
【動作確認】
今回ヒーラー用Combat Overrideを適用したNPCです。弓を持たせているので、普段は弓矢で戦います。
UseMagic中は魔法をキャストするまでまったくの無防備となってしまうため、ヒーラーにするNPCは極力敵に近づかない遠隔攻撃タイプが適しています。もしくはAI Dataで臆病設定にしてしまうのもありです。「Procedure:HoldPosition」実行中は敵から逃げ回りますが、プレイヤーの体力が減って「Procedure:UseMagic」が有効になると回復行動を行ってくれます。
カーススパイアーの野営地で実験。
NPCがかなり遠くにいて分かりにくいのですが、あんな遠くからでもしっかり回復をしてくれました。遮蔽物があってもNPCが回復魔法を使いさえすれば回復します。こちらの体力の減りに対する感度はかなり良く、一瞬で大ダメージを食らうことがなければまず死にません。
ちなみにUseMagicは、指定された魔法をNPCが覚えていなくても魔法を使わせることが可能です。
魔法に設定された本来の射程距離も関係ないらしく、キャストに成功すればターゲットには必ず当たり判定が出ます(修正:当たり判定はMagic EffectのDeliveryに寄るようです。UseMagicではDeliveryが"TargetActor"や"Self"になっている魔法が扱いやすいと思われます。その他のDeliveryでは射線と効果範囲を考慮しないとだめかもしれません)。
加えてマジカの消費もありません。
簡単なProcedure Treeながらも効果は絶大。プレイヤーを回復できたら、次は他のフォロワーも回復できるようにProcedure Treeを拡張してみることにします。
前へ |
次へ
1. 新連載、楽しみにしております
>「Eat」Packageを使えば、戦闘中にパンをかじらせることもできるし、「Sleep」で寝かせることだってできます。
この発想はありませんでした!「Eat」で食べながら戦うフォロワーは面白いですね~♪ 酒を飲んで酔拳を使ったり、ポーションで自身を増強してくれそうで実用性もありますね!「Sleep」を使えば、戦場で横になる、いかにも強キャラという雰囲気が出せそうです。
>賢いデフォルトのAIとうまく組み合わせることで、さらに幅の広い戦い方を演出することが可能になる
UNIさんの製作されているPackageを見ていたら、「攻撃的回復モード」と「交戦モード」が一つのPackage上で再現できることに気付きました…(汗) デフォルトをまるまる上書きすることばかり考えておりましたが、デフォルトのスタイルで戦わせて、特殊な条件の時にOverridePackageに移行させるという方法があったのですね!早速、この方法を試してみると、かなり上手くいきました!!
今までは作ったPackageがきちんと反映されるようにするためには、どのような点に気を付けなければならないかがピンとこなかったのですが、QuestとOverridePackageの関わりについて図解してくださっていたので、すごく理解が深まりました!!
それから、GetPlayerTeammateという関数があったなんて…今まで気づきませんでした。UNIさんのブログは読むたびに発見があります(^^)
ヒーラーのDarius氏の射程がスゴすぎる…(笑)この距離をものともしないヒーラーがいれば、敵陣へ乗り込むときにかなり戦略が立てられて面白そうです。皆でDarius氏の方へ敵が行かないように阻止しながら…実は遠くから回復してもらってお互いに守り合っている。NPCとの絆が生まれますね!
ド派手な戦闘改善modも入れていたことがありますが、modで改造していないバニラの戦闘も充分に趣があると感じております。強すぎないフォロワーとか、不自由な部分がある中であれこれ考えながらプレイする方が、案外好きなのかもしれません。そういったバニラの環境に少しだけ花を添えるような、ささやかなmodを作れると良いのですが…。
Darius氏とドラゴンの骨の間にいる「黒いサイジックローブ」を着ている方も気になりました。ダンマーの主人公さんでしょうか?
最近は製作に行き詰まりを感じておりましたので…UNIさんのブログを読んで救われている感があります。なんと…!嬉しいことに、新しい記事にさらに続きがあったので、そちらもじっくりと読ませていただきたいと思います!!
Re:新連載、楽しみにしております
敵が殴ってさえこなければ、UseMagicもUseWeaponも動かしやすくなるんでしょうけど、そういうわけにも行かず……。
>上位がStackedになっていると何故かFleeが機能しなくなってしまう
こちらで試してみたところ特に問題なく機能するようでした。一番下にConditionを何も設定しないFleeを置いて、上にプレイヤーを回復するUseMagicを置いたごく単純なTreeです。Procedureがうまく動くか動かないかは設定しているConditionも大事ですが、Tree構造によるところも大きいので、Fleeが機能しなくなってしまう原因もそこにあるように思います。
Branchで扱いにくいのはSimultaneousでしょうか。一緒に実行するProcedure同士の相性をよく考えないとうまく動いてくれません。特にSimultaneousで同時実行するProcedureは、その並び順にも気をつけないとどちらかのProcedureがまったく機能しなくなることもあるようです。
http://skyrimeasy.blog-rpg.com/ckworks/sweeper04
↑こちらの記事の冒頭で、PatrolとFindをSimultaneousで実行しているProcedure Treeを作っていますが、Procedureの並び順によってPatrolが機能しなくなることがありました。いまでも原因がよく分からないので、PatrolとFindを一緒に使うときはFindが上にくるように作っています。
「Procedure:Find」や「Procedure:Wait」はどのProcedureとも相性がいいと思っていたので、これは思わぬ落とし穴でした。Simultaneousは、「とても便利なBranchだけど、とにかくまともに動くまでが大変」という印象です。
>GetPlayerTeammateという関数があったなんて…
Conditionsの関数って、かなりの数があって目的のものがあるかどうかを探すのも一苦労だったりしませんか(^^; しかも関数の中には壊れていて使えないのもあるわ、プレイヤーを対象にしないと正しい結果を返してくれないのもあるわで、前に使ったことのある関数でも使うたびにCKwikiの説明を読み直して確認しながらやってます。
Procedure Treeを作るのはほんとに大変ですけど、やはりNPCがうまく動いてくれたときの喜びは相当大きいですよね。ファル粕さんのところのリアの成長も楽しみに見させていただいています。第3回でProcedureTreeがものすごく長くなってますね(汗) それからイリレスさんがヒーラー稼動実験のいい相手役になるとのことで、私も今度Dariusと一緒に挑んでみようと思います。
>Darius氏とドラゴンの骨の間にいる「黒いサイジックローブ」を着ている方も気になりました。
彼はまた別のフォロワー用NPCで、Dariusの旅仲間のリーダーです。以前カジートキャラバンのリサードをフォロワーにしたとき、仲間のカイラ達までついてきたのが面白くて。カジート達みたいに、パーティーで移動している一行のリーダーをフォロワーとして雇用すると、その仲間まで勝手についてくる……というのを考えています。そのためDariusには、自分がフォロワーとして直接プレイヤーに雇われている時、自分のリーダーがプレイヤーに雇われているからついて行ってるだけの時、プレイヤーから離れて自分達だけで旅をしている時(でもプレイヤーは近くにいて彼らの戦いを傍観している時)、の3つのパターンに対応したCombat Overrideが必要になります。できればPackage一つで対応してしまいたいので、今後彼のProcedure Treeもそこそこ長くなると思われます……。