プレイヤーへの回復行動ができたので、今度は他のフォロワーも回復できるようProcedure Treeを拡張します。
とりあえず仲間を適当に見繕いました。老夫婦戦士とオーク女性です。華がないどころではない枯れたパーティーですが、これらのフォロワー達が「CurrentFollowerFaction」に加入していることが今回のポイント。
一般的に雇用中のフォロワーはModを使用していたとしても、このファクションに加入していることが多いです。Modで追加されたNPCを含め、フォロワーとなる不特定多数のNPCを探すには、このファクションが良い目印になります。逆に、Scriptを使わずAI Packageのみで彼らを検索する場合、ファクションくらいしか効果的に探せる方法が分からなかったともいいます……。
やっかいなことに、「CurrentFollowerFaction」に加入することなくフォロワーになる例外的NPCもいます。セラーナさんなど専用の雇用クエストを持つNPCが挙げられますが、少数派と思われるので彼らについては諦めることにしました。
【フォロワーの検索】
前回作ったAI PackageのProcedure Treeをこんな感じで拡張しました。
「Pablic Package Data」に新しく3つの項目を追加。既存の"SelfLocation"についてはRadiusを3000に修正し、前より広めに取りました。自分の周りにいる他フォロワーを検索する範囲設定と兼用させるためです。
Procedure Treeにはフォロワー回復用の「Procedure:UseMagic」を新たに追加し、さらにその前段階の行動として、「Procedure:Find」を行うようにしました。設定は上図のとおりです。検索の対象は「CurrentFollowerFaction」。これによって、このファクションに加入しているNPCを見つけることができます。加えて「Procedure:Find」実行中に武器を収めないよう、Flag Overridesの「Weapon Drawn」にチェックを入れています。
いつ、どんな条件で検索を行うかは色々なやり方があるので、ここで上げたProcedure Treeは一例に過ぎません。より効果的なTree構造もあると思います。
「
Procedure:Find」は他のAI Packageでもよく使われているProcedureです。
SearchLocationとTargetSelectorにて探す場所と対象を指定すると、検索結果をObjectListに列挙してくれます。またRandamizeListをTrueにしておくと、検索結果をランダムに並べ替えてくれます。
このObjectListに収められたデータは、他のProcedureでTarget指定して使うことができます。Procedureによっては、ObjectListにあるデータを最初から順番にすべて参照して使用できるものもありますが、Listの一番目のデータしか使わないものもあります。だいたい後者のProcedureが多く、UseMagicもおそらくListの一番目のデータしか使えないProcedureと思われます。
そのためこのProcedure Treeだと、回復できるのはフォロワー1人だけということになります。
「Procedure:Find」と一緒に「Procedure:Wait」をSimultaneous Branchにて実行しています。Findは指定されたものが見つかるまで終了することができません。他フォロワーを連れていない場合や、ヒーラーの周囲3000Radiusに他フォロワーがいなかった場合、Findの実行を中断するために必要です。時間は0.5秒で十分です。見つかるものが見つかれば、Findは一瞬で終わるようです。
プレイヤー回復動作の下に追加したフォロワー回復動作用の「Procedure:UseMagic」の設定。
TargetにはFindで探した結果である"FoundFollower"のデータを使用できます。
実行条件にも、"FoundFollower"をRun Onに設定して体力が7割以下のConditionを設定しています。死亡していないこともあわせてチェック。
最後に、ふたつの「Procedure:Magic」にはSuccess Completes Packageのチェックを入れておきました。回復動作を行ったら一度AI Packageを終了し、再度最初からProcedureTreeを繰り返してもらおうという魂胆です。これによってFindの検索結果である"FoundFollower"を定期的に更新できないかな、と考えていたのですが、結果はいまいち。一度戦闘が始まると、最初のFindで見つけたフォロワーの回復しか行わず、他のフォロワーを回復するところは見られませんでした。
【動作確認】
前回同様カーススパイアーにて。
ちゃんと他のフォロワーを回復してくれてます。でも戦闘中はこのフォロワーとプレイヤーの二人だけしか回復してくれませんでした。
Findしなおしても"FoundFollower"がこちらの思惑通り更新されていないのか、偶然前回と同じフォロワーが選ばれただけなのか分かりません。戦闘が一度収束し、再度始まれば別のフォロワーが回復対象に選ばれることはありました。
また、Findによってヒーラー自身が検索対象にあがるという現象は見られませんでした。ヒーラーも「CurrentFollowerFaction」に加入しているフォロワーですから、どうなるか心配だったんです。よかった。
おそらく検索範囲をヒーラー中心にしているためかと思われますが、SearchOwnInventoryを"False"に設定しているのも地味に効いているかも。
(↑バニラのテンプレート「Acquire」や「Eat」において、SearchOwnInventoryは、自分のインベントリ内を検索対象に加えるかどうかの設定に使われています。もしかしたらSearchOwnInventoryは、自分のインベントリ内というより自分自身まるごとを検索対象から除外する機能があるのかもしれません。いずれにしても今回ヒーラー自身が検索対象にならなかった理由が不明確すぎるので、取り消し線をつけました)
しかしやることが増えたせいか、前回よりすばやい回復ができなくなっている気がします。体力が8割以下のときに回復するよう条件を変えたほうがいいかな。弓持ちから魔法で戦うように変えるのもありか。弓を収めて魔法を構える動作で1.5秒くらいロスしてる気がします。
うー、でもフォロワー1人にしか対応できないってのもなんだかなぁ。
プレイヤーを回復してくれるだけでもありがたいのですが。
そこで"FoundFollower2"という新しいObjectListを用意してみました。
2回Findを行い、"FoundFollower"と"FoundFollower2"、2つのObjectListに見つけたフォロワーを放り込みます。運がよければそれぞれのListの1番目に別のフォロワーが並ぶことになるはず。
"FoundFollower2"に対するUseMagicも増やして、動作確認してみました。
結果はすばらしいの一言。運任せではありますが、回復できる他フォロワーが2人に増えました。プレイヤーとあわせて回復対象が3人。これだけでヒーラーが相当優秀に見えるようになります。
プロテクト属性で守られている他フォロワーの回復はおまけ程度の演出かもしれませんが、Scriptを使わなくてもここまでできるのであれば、個人的に大満足です。
気づいたらヒーラーが襲われていた図。
このProcedure Treeの問題点はいくつかあります。
UseMagic中に敵に殴られたりしてキャストのタイミングを逃すと、魔法を構えたまま固まってしまうのが一番の大問題。そうなると他の回復対象に対するUseMagicが実行可能状態になるか、もしくは戦闘が終わるまでそのままです。Procedureにはこんな風に、邪魔が入ると動作が止まってしまう繊細なものがあります。UseWeaponも同じ傾向を持つので、使うときは注意が必要。
敵に狙われないよう守ってあげるか、Procedure Treeのさらなる改善を目指すか、どちらかになります。
前へ |
次へ
1. Faction魔法によるFindの効率化
以前にUNIさんから、「ヒーラー」が対象を検索し、目的の人物にキャストするためには、「一つ一つActorを直に指定する」もしくは『Faction』で探し出す他ない、ということを教えていただきました。私もその後、『収集系フォロワー』の記事で、「Find:Procedure」関連の試行錯誤をし、対象物をConditionsの「IsInList」で絞り込むという方法に辿り着きました。
しかし、上記の2つの方法は検索の幅が広すぎる分、Findで取得したListが更新が上手く行かずに同じActorを狙い続けてしまったり、範囲内に存在する全ての対象を「Acquire」などして除外しない限り、結局は下位のProcedureに移行できないという問題がネックになっていました。ところが…!MagicEffectを作成している際に、『一時的にActorにFactionを与え、一定時間後にFactionを消去する』という画期的なScriptを発見しました!!
PapyrusScriptsの『VoiceCharmFactionScript』です。このScriptはEffectのStart/Finish時に、Propertiesの「CharmFaction」に指定したFactionをAdd/Removeする処理を一括して行ってくれるようです。あらかじめ任意の“自作Faction(空)”を用意し、Propertiesに設定しておき、Conditionsで絞った“目的の人物にのみ全体魔法などで効果と一緒にFactionを届けて”おきます。いわゆる、ヒーリングの前の“事前準備や目印を付ける”といった目的です。その上で、AIPackageのTargetSelectorから自作したFactionに属している人物をFindで検索・選択的に探し出して、UseMagicやUseShoutで目印の付いた対象だけにキャストさせます。
Factionを搭載したSpellをDurationタイプにしておけば、時間経過でEffectと共にFactionは消失するため、Findしても見つからなかった場合(=魔法の効果が切れた時)は、再び魔法をかけ直したり、自然にヒーリング以外の行動に移行・専念させることが可能です。ヒーラーを作る時には、対象を限定するためにProcedureの順番にかなり注意と工夫が必要になりますが、この辺の制約が若干ゆるめられ、AI製作の自由度がゆとりをもたらすような気がします。
自作のFactionは、メンバーを追加しない空のFaction(目印)として作成します。メンバーの絞り込みは、Spellの効果が出るか出ないかの条件で決めます。そのため…既存のActorに、変更は一切加わりません。新規FactionとEffectの組み合わせを複数用意すれば、「CompanionsFaction」という一括りのメンバーではなく、「アシスを除く、同胞団のメンバー」や「同胞団の女性限定」というように、余分な対象を事前に省くことができます。この方法を上手く活用できれば、「ヒーラーの硬直問題に対する安定化、ヒーリング対象の更新」などが図れそうです。元々、バニラのデータに存在しているScriptなので、そのまま使ってしまえばScriptフリーになるかもしれません。(←本人も良く分からない部分です。汗)
最大のメリットとして、ヒーラー自身のキャラによって認識が異なる、「味方」や「敵」といった検索対象を、「Actors:Any」や「CreatureFaction」などでざっくり集めてから、ProcedureのConditionsで念入りに絞り込むという製作上の手間が、かなり軽減されます。余分な対象が含まれる項目に依存せず、MagicEffectやSpellのConditionsで設定した、“効果を受けた対象のみを狙える”という利点があります。例えば、「男性のエルフだけ」、「〇〇の装備を着ている者」、「動物以外」など、従来のFactionだけではなかなか限定するのに苦労した細かい対象を、比較的簡単に狙えるようになりました。
もちろん、回復目的だけでなく「膝を着いている者」だけをあっという間に探し出して、遠くから弓で射るという…ゲスい攻撃にも応用できます。その他にも、「プレイヤー用の“目印魔法”として作り変えれば、フォロワーに回復してほしい対象に、プレイヤーが自ら好きなタイミングで目印(Faction)を付けたり、目印を消したりできる」。「Findの数だけ、他の検索結果に阻害されずに対象を取得できる」。なども良い点だと思います。
長くなってしまいましたが、短くまとめますと…“対象の絞り込み時に、本来AIのProcedureで条件設定を行うところを、逆にSpell側で予め全部行ってしまう”という、作成上の『Conditions設定の序列入れ替え』を目的とした方法です。
なかなか面白い製作に使えそうな予感がしていて、テストプレイやブログ更新を忘れて色々と実験しておりました(^^;) まだ、使えるのか使えないのかハッキリ分かっていませんが、だいぶ前に頓挫していた、リアの『攻撃的回復』の改善には役立ちそうです。
UNIさんご意見を是非、伺いたいです。全くダメかもしれませんが…画期的な方法に進化できればいいなぁと思っています!
Re:Faction魔法によるFindの効率化
確かに「Actor:Any」で探した後、さらにProcedureのConditionsで相手を見分けるのは、効率が悪くなってしまいますね。
魔法で一時的なFactionを与えてNPCにマーキングできると、相当賢く動けるAIを作れそうです。既存のScriptを使って簡単にできるのも嬉しいです! 既存のScriptを変更するMODはほとんどないと思うので、競合の心配もなさそうですね。
処理的には重くなってしまうかもしれませんが、複数のFaction魔法で周りのNPCに随時適切なFactionを割りつければ、刻々変わる戦況にも素早く対応できるのではと、ファル粕さんのアイデアを読んで思いました。瀕死になった時アクティブになるFaction魔法をつけておけば最優先で回復できるので、優秀なヒーラーが誕生しそうです。
プレイヤーが魔法を使ってフォロワーにターゲット指定できるのも、アイデア次第で遊び方が広がりますね。随所に隠密待機させたフォロワーに、ターゲット指定して一斉攻撃させられたら待ち伏せ攻撃っぽくできて面白いです。
これ全部、Scriptを自前で用意しなくてもできるかと思うと、かなりわくわくします。リアさんもこれで瀕死の味方にどすどす回復矢を撃つことになるのでしょうか。絵的にはかなり怖いですが、これほどありがたい援護射撃はないと思います(^^; ファル粕さんの記事、楽しみにしています! 私もFaction魔法を試してみようと思います。
※「VoiceCharmFactionScript」の他に「VoiceAllegianceFactionScript」というScriptも見つけました。未使用のScriptみたいですが、処理内容はFactionをつけはずしするだけのシンプルなものです(「VoiceCharmFactionScript」と違ってStopCombatの処理がないです)。ただこちらを使ってしまうと、Scriptフリーっぽくはならないかも。既存Scriptとはいえ未使用の物を使用してるので、もしかしたらセーブデータにScriptの記録が追加されるかもしれないです。
すでにゲーム内で使用されている既存Scriptを流用するのであれば、ほとんどScriptフリーに近い扱いができると思うのですが…。どのタイミングでScriptがセーブデータに記録されるのか、難しいですね。ちらっと自前のScriptで「Quest用Script」、「魔法用Script」、「Dialogue用Script」を出し入れして確認してみましたが、いまひとつ確信が持てる結果は得られませんでした(汗)