忍者ブログ

ファルログ

Home > ブログ > 記事一覧

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

仲間を守る!「新・補助系フォロワー」への挑戦③

バグに次ぐバグ…Packageを安定させるのにはなかなか根気が要ります。
テストプレイをしてPackageの動作を確認しながら、気分転換もかねて…良いフォロワーを作るために、最近はバニラの一人一人のキャラをじっくり観察したりしています。

【最強のテストプレイ相手・イリレス】

夜のドラゴンズリーチは静かで、「一騎打ち」のテストプレイに向いています。

 

皆が寝静まる中、ただ一人玉座の横に立ち続けるイリレスさん。

 

彼女を怒らせ、リアとともに手合せしていただいています。(時々、ファレンガーも「今のは何だ!?」と目覚めて参戦します。笑)



2対1でこちらにはヒーラーもいる。圧倒的に有利な状況だと思われますが…イリレスさんは我々同胞団の想像を超越した存在でした…。

様々なPerkやSpellにより物理防御と魔法防御の両方が硬い上、「CombatNightblade」という全く無駄のない軽装魔法戦士のステータスを持っています。戦闘開始直後に一瞬でオークフレッシュ→雷のマントで身を固めてきます。こんな素早い動作はプレイヤーにはできない戦い方です…。遠くにいてもイリレスさんに気付かれた時点で、魔法の盾を発動する間もなく「チェインライトニング」が飛んできます。さらには、CombatStyleが「csHumanBoss1H」という特攻型で、パワーアタックを多用した近接攻撃で頭蓋骨を粉砕し、よろめいた隙にピッタリと張り付いて雷のマントでビリビリと追い打ちをかける。スタミナが減りにくいPerkも持っていて、ほぼ切れることはない。盾バッシュも得意。極めつけは「冷気の付呪が施された剣」。敵対者のヘルス、スタミナ、マジカの全てを削り取る…あらゆる戦闘の要素が噛み合った惚れ惚れするようなNPCの一人です。クリエイターの方の作り込みに脱帽です。まさに、ホワイトランの守護神ともいうべき存在!!

全滅。走馬灯状態…。


このように、イリレスさんと戦っていれば自分で調整しなくてもガンガン削られていき、ヒーラーの挙動を見るのにとても便利です。ちなみに、フォロワーを守ってやらないと瞬殺されます。おそらく、イリレスさんに勝てるくらいのAIになった時には、なかなか優秀なヒーラーが誕生していることでしょう…。

【OverridePackageの統合】

「交戦モード」のPackageはHoldPositionのProcedureとして「攻撃的回復モード」に組み込み、一つにまとめることで、同じ動き(むしろ切り替えが早い軽快な動き)が再現できることが分かりました。別々に分けていた前回までの方法はかなり非効率だったようです。
Packageをまるごと切り替えるのには、Package内で切り替えるより多くの時間がかかってしまうようで、こちらの方がスムーズになりました。

【ポーション塗り分け機能の搭載】

今回は新たな試みとして、回復の薬によるヘルスのヒーリングしかできなかった「攻撃的回復」ヒーラーに、複数のポーションを使いこなす能力を与え、回復を行ってもらう方法を考案しました。

数種類のPerkを作成し、Actorに全部Addしてしまおう!と気楽に考えておりましたが、CreationKitはそんなに甘くありませんでした…。Perkを一つずつ作ってAddする方法だと、効果が上手く反映されていないことに気が付きました。違った種類を対象にしているPerk同士は干渉しないようですが、「Apply Combat Hit Spell」という同一タイプのPerkを複数持っている場合、同時に発動することができないようです。「攻撃的ヘルス回復」と「攻撃的スタミナ回復」を個別のPerkとしてActorに持たせると、上にある(先にaddした)Perkの効果のみが現れました。wikiで確認したところ、「同じ値に影響する時のためにPriorityを決めておく」というようなことが書いてあった(?)ので、回復Spellを仕込んだ接触攻撃Perkは、同時に一種しか発動できないようです……解決策を考えないと!

【攻撃的回復Perkの再設計~失敗例~】

別々のPerkを複数もたせる考えはどうやら無理そうなので、各Effectを一つのSpellに統合することにしました。バラバラにしておくとPerk欄も無駄に埋め尽くされてしまいますし、「攻撃的回復Perk」として一つにまとめておいたほうが便利です。

「ヘルス用」、「スタミナ用」、「マジカ用」の3種類のヒーリング効果を「回復の薬」のMagicEffectを元に用意しました(ヘルス用は前回作成済み)。



試しにこれらのMagicEffectをすべてaddしたSpellを作ってみました。Conditionsで「キャスターがポーションを一本以上所有している」という条件を各Effectに設定しました。(※ココ、間違えてました)



これで、「攻撃的回復Perk」に仕込む、複数の効果を切り替え可能なSpellが一応できたはず……。しかし、このSpellを発動するPerkを作ったところConditionsを設定しているにも関わらず、3つの効果が全て同時に発動してしまいました。Conditionsでは、フォロワー(キャスター)が「任意のポーションを所有している」という条件で、ヘルス、スタミナ、マジカのいずれかの効果だけを攻撃に付与するように設定したつもりでしたが、Spell側のConditions設定では自分の能力が無いことも伴い、効果を限定的に発動することができませんでした。何かが失敗しているようです。SpellのConditionsの設定は、PerkやPackageのものとは若干異なる点があることに後から気付きました。

※注意※ m(>_<)m

RunOnの扱い方が間違えていたようです。(ある対象の何を条件に発動するのか…。いつも自分はこの設定がミスっていることが多いです。)SpellのConditionsは「△△が、〇〇ならば、対象にSpellの効果を与える」という設定の仕方になっていますが、「キャスターが任意のポーションを持っている時に、指定した効果のみを発動する」という条件が、何故だか上手くできず…かなり時間を無駄に費やしてしまいました。CastingTypeを「Fire and Forget」、Deliveryを「Contact」にすると、SubjectもTargetも両方ともプレイヤー(Spellをかける対象)を示してしまうのかも…??Perk側やPackage側のConditionsの設定はそれぞれ微妙に異なる部分があり、混同しないように気を付けなければなりません。

Spell側ではConditionsが上手く設定できなかったので、改めてPerk側からアプローチすることにしました。Perk側の方は「Perk Owner(キャスター)」と「Target」の両方にConditionsが設定できるので、こちらで行った方がなんとかできそうな気がしました。

【攻撃的回復Perkの再設計~ちょっとだけ進歩の例~】

上述のような、一つのSpellの各EffectにConditionsを付けて発動をコントロールしようとする方法は…横着しすぎのようです。失敗を踏まえて、網羅的にSpellを作っていくことにしました。

ヘルス、スタミナ、マジカの3種類の組み合わせを考えると…、全部で7通りになります。全く所有していない時を入れると8通りです。

省略記号で示しておこうと思います。
インベントリ内[ヘルス薬、スタミナ薬、マジカ薬]、「==0」をなし、「!=0」をあり、とすると…

★[==,==,==] ①[==,==,!=] ②[==,!=,==] ③[==,!=,!=] 
④[!=,==,==] ⑤[!=,==,!=] ⑥[!=,!=,==] ⑦[!=,!=,!=] 

以上のようなパターンになります。
例えば、①は「マジカ回復薬のみ持っている」、⑦は「3種類全部持っている」、★は「ポーションを持ってない」ことを示しています。

一見するとごちゃごちゃな順番だと思いますが…少し意味があります。
PerkでPriority(優先度)を設定する必要があるためと、Packageで回復行動する時の優先順(上位のBranchに置く)ために順位を決めておきました。
番号が大きいほど優先度が高いです。つまり、ヘルス>スタミナ>マジカという優先順で、なるべくマルチに回復を行ってほしいという願望が表れています。ちなみに、③と④の順番が逆なのは…「ヘルス>スタミナ+マジカ」と考えたからです。生き残るためにはヘルスが最重要!

実際には「ポーションの所有パターン」に応じてPerk内の適切なSpellを取得する処理が行われるはずなので、順番はあまり問題にならないと思いますが、Package側の処理が少しスムーズになるのでは?との期待も込めて、このように並べました。

次に、上記の組合せに対応したEffectを持つSpellを用意しました(全7種類)。



用意したSpellを使って、「ポーションの所有パターン」ごとにPerk Entriesを構築します。



Perk Owner(フォロワー)のConditionsを設定。
GetItemCountを使いました。カウントする対象は、ヘルス回復の場合「FavorHealingPotions」を指定。スタミナとマジカ用はバニラに利用できるListが無かったため、FormListを新規作成し、回復の薬(小~究極)のアイテムを登録しておきました。



Target(プレイヤーなど)のConditionsの設定。
GetInFactionを使いました。プレイヤーとフォロワーと同胞団だけを回復させます。この条件により、Target以外には回復効果が適応されないので、交戦モードの時に流れ弾が敵に当たり、攻撃しても回復させてしまう心配は無いと思います。



このようにして、記号で示した条件式の組合せで、7種類のPerk Entriesを設定しました。
作成手順は、CopyAllConditions→Paste→GetItemCountの不等号を変える→作成したSpellを設定→Priorityを設定、の一連の作業。

以上で、Perkが一通り完成しました!!結構、単純作業が多いです…(疲)

【AIPackageの再構築】

Perkは「攻撃的回復能力を取得させるため」に用意しましたが、今度は取得したPerkで「ヒーリング攻撃を『適切に』行ってくれるようにするため」にPackageを再構築していきます。

ActorのPerkをバージョンアップして、試しに前回のAIPackageで動きを見てみました。「ポーションの所有パターン」に応じて、反応できるかを確認する目的で行いました。



リアが必死に状況を考えながら戦っている…。持っているポーションに応じた回復を行ってくれています…! 3種類持っているときにはヘルス、スタミナ、マジカを同時に回復し、黄色のくるくる(ヘルス)、緑色のオーラ(スタミナ)、青色の帯(マジカ)のすべてのEffectが一斉に出ていました。前回のPackageのConditionsをまだ変えていないので、何も持たせていない時にも「ヘルスが8割未満」になると、こちらに矢を放ちますが回復はせず、Effectもかかりません。Perkの方は上手くできていたみたいです。

今の設定のままでは、スタミナやマジカが減っても反応しません。ここを『適切に』判断して行動できるようにするのが、次の目標です。

スタミナやマジカの変化にも反応させるために、Conditionsで以下のような条件を付けて再びテストプレイしました。3種類のゲージのいずれかが設定値(8割)未満になった時、このPackageが作動するはずです。



フォロワーをよく観察していると…思考停止や余計な事をやってしまう傾向があることに気付きました。
①「交戦モードに移行しない」、②「途中でポーションがなくなっても、矢を打ち続けてしまう」、③「回復してほしいゲージ(一定値未満)以外のゲージまでついでに回復してしまう」などです。扱うポーションの種類が増えた分、AIの処理が複雑になり、Packageの設定も今まで以上の繊細さが求められるようです…(苦)

①と②の問題は、交戦モードを攻撃的回復モードに組み込んだことにより発生したようです。Procedure Treeの構造やConditionsを設定する場所をかなり工夫しなければならなくなりました。間違った位置に設定したり、Conditionsの設定が適切でなかったりすると、立ったまま動かなくなってしまったり、永遠に弓を打ち続ける動作をしたりして、まともに回復を行ってくれなくなります。それから何故かFleeの動作が鈍くなりました。

ということで…まずはTree構造の見直しです!何度やっても上手くいかないこと数日間…(ゲッソリ)。ココが一番苦労した部分でした。ネックになっていた原因は「HoldPosition(交戦モード)」と「UseWeapon(攻撃的回復モード)」Branchの位置と条件付けでした。切り替えが上手くいかず、片方のBranchにしか動作が流れて行かなかったのだと思います。
非常に力技な方法ですが、最終的にSimultaneousを8パターン用意し、分岐を作って「ポーションの所有パターン」と同様のConditionsで縛ることで、やっと動くようになりました!!(感動)



ポーションの所有パターンは、Perk作成時に考えたように7種類あるため、7つのUseWeaponが含まれているBranchを用意しました。さらに、ポーションを全く持っていないときのConditionsを設定した、HoldPositionが含まれているBranchを追加し、計8通りに分岐するようにしました。

上手く動かなくなってしまったのは、UseWeaponの上に置いたFleeのせいでもありました。Fleeの上位のBranchをStackedに変更していたのが影響していたようです。Fleeは理由は分からないのですが…Sequence以下に置かないと作動しませんでした。

最後に、Package全体のConditionsで、回復行動を起こすゲージの割合を決めました。テストプレイでは3種類とも8割未満になったら回復するようにしていましたが、好みの値に調整。Targetのヘルス、スタミナ、マジカのどれかが設定値を切ると、このPackageが作動します。



Packageが一通り完成したので、現在のAIを分析してみます。
プレイヤーのゲージが設定値未満でない時には、OverridePackageは作動しないので、Defaultの戦い方をしてくれます。プレイヤーのゲージが設定値を割っていて、任意のポーションを持っている場合は、UseWeaponで組合せに応じた回復を行ってくれます。プレイヤーのゲージが設定値を割っていて、フォロワーがポーションを全く持っていない時には、OverridePackageのHoldPositionが作動し、Packageに指定してあるCombatStyleで戦ってくれます。現在の設定だと素手で殴るモードになります。

これで①「交戦モードに移れない」、②「途中でポーションがなくなっても、矢を打ち続けてしまう」問題は解決できた…はずです。たぶんですが…(焦)

③の問題「回復してほしいゲージ(一定以下)以外のゲージまでついでに回復してしまう」とは、どういう状況かというと……例えば、フォロワーがヘルス回復薬とマジカ回復薬を所有している状態で、プレイヤーのヘルスが75%、マジカが15%になったとき…マジカ不足(30%未満)を感知して攻撃的回復を行ってくれますが、その際にマジカだけでなく、70%未満になっていないヘルスもついでに回復させてしまいます。マイナスではないのであまり気にならないのですが…的確にポーションを塗り分けている賢いフォロワーには見えません…(汗)
それに、これではマジカを意図的に切らせることで、ヘルスを永遠に回復させ続けるという…チート戦術が可能になってしまいます。

そこで、Perkに仕込むために作成した各SpellのConditionsに、Package全体に付けてあるのと同様の「対象者のゲージが何%未満の時に発動」という条件を付けてみました。すると、同時回復の際に一定値以上になっているゲージの方は回復効果が乗らなくなりました。③の問題もなんとか解決できました。

 

【既知の問題】

・フォロワーと決別し敵対してもなお、攻撃的回復を行ってくれるという不自然さ。別れてからもかつての戦友を想い続けるなんと健気なフォロワー…(笑)

・③の問題を解決するために付けた「ゲージが何%未満の時発動」の条件のせいなのか…同じように設定してあるのに、「スタミナを回復させる機能」だけが失われてしまいました。もしくは発動が異様に遅いです。スタミナ回復はヘルスやマジカに比べて何故か…AIにないがしろにされ気味です…。当分はスタミナだけは「ついで回復」を許すしかなさそうです(汗)

・全体的にかなり動作が不安定になってしまっております。行動を分岐させた分、足元に弓を構えるバグが以前よりも頻発するようになりました。

【雑感】

Packageの作成をするようになって徐々に分かってきた事なのですが、割と自由なTree(条件を絞っていないTreeの構造)になっていると、行動の発動率が高いのですが、戦闘中の予期せぬ状況の変化によって行動がそちらへ流れて行ってしまい、本来とってほしい行動とは別のことをしてしまう感じです。反対に、綿密な条件付けによってTreeを縛っておくと、行動の流れが一本になって確実になる印象を受けました。しかし、自由度が無い分、一つでも不備があると行動をとれなくなってしまうようで、発動率を安定させるための条件付けが大変です。前者は行動パターンが少ない時に向いていて、今回のような複数の行動を作り込んでいくような場合には、後者の方を試行錯誤する必要があるように思います。
コツをつかめればいいのですが、Conditionsの設定がまだ難しく感じます…。2つ以上の効果をつけるだけでこれほどの手順が必要になって来るとは…!ややこしい…。そろそろ、酔いどれハンツマンで飲みたい…。

…さらなるAIを目指して、つづきます!!



【新人リアの成長】 vol.3~敗北と挫折~

ヴィ「完敗だったな…。イリレスは強かった。」

リア「くっ…!」



ヴィ「どうしたんだリア?そんな深刻そうな顔をして…」

リア「真剣に相談に乗ってくれるの?…私、色々なポーションをまだ使いこなせていないみたいなの…。考えながらだと焦りすぎてしまって、回復の頻度も悪くなった…。このままじゃ、アエラのような勇猛な盾の姉妹になれないわ……。どうしたらいいと思う?」

ヴィ「そうだな。誰だって困難に直面すれば…弱気になるよ。そんな時には、この言葉を思い出せ…」

「…止まない『バグ』は、無い!!!」





リア「は?」

ヴィ「・・・えっ!?」

リア「あなた本当にヴィルカスよね?…ファルカスじゃないのよね?」

ヴィ「そ、そうだが…(汗)」

リア「人の気も知らないで……」



「とっとと行きな!(怒)」

ヴィ「はい……セラ。」

拍手[1回]

PR

PAGE TOP