2012/11/26

ヒーラーフォロワーの作り方(2)

前記事の(1)の続きです。
前回はヒーラーのエイリアスと、AIパッケージを作って、それをヒーリングシーンとしてお膳立てしてやるところまで、やりました。
次はそのヒーリングシーンを呼び出すための仕組みを作りたいと思います。

動作確認を兼ねて、ドール城にカチコミにいきました。喧嘩上等ォ。

ドール城よりもブルーパレスの方が手ごわかった。不死属性の首長たちがてんこもりで。


【手順4】 対象を監視するモニタリングクエストを用意する

ヒーラーに対象となるキャラを回復させるためには、ヒーリングさせたいタイミングで、ヒーリングシーンをスタートさせてやる必要があります。
ヒーリングさせたいタイミング、とは、前回もちらっと触れましたが、対象(今回はプレイヤー)の体力値がある程度減った時です。
対象の体力値を取得すること自体は簡単なのですが、これは常時、ヒーラーがゲーム上で稼動している間、ずっと取得しつづけるような仕組みにしないといけません。
つまり、対象の体力値を取得し、一定値以下に減っていればヒーリングシーンをスタート、そうでなければ何もしない……という処理を一定の間隔で行う必要があります。

対象の体力値を一定間隔でモニタリングする仕組みを作るために、まずは専用のモニタリングクエストを用意します。

モニタリングクエストは、「Start Game Enabled」にチェックを入れないでください。
このクエストは、ヒーラーを雇用したタイミングで開始し、解雇したら終了させます。
また、ヒーラーが雇用されるたびに何度でもこのクエストのステージが使えるように、「Allow repeated stages」にチェックを入れておきましょう。
優先順位の「Priority」は0でかまいません。
このクエストは、役者も小道具も何も無い、裏方に徹したサポート用のクエストですので。

クエストを作成したら、一度設定画面を閉じてesp自体を保存してください。
クエストのオブジェクトは一度「保存」を挟まないと、設定できない箇所が多くあります。
保存が済んだら、再びクエストを開いて「Scripts」のタブを押します。
ここに新規スクリプトとして、モニタリングするスクリプトを追加してやります。

すみません。激しい色使いで。このくらいカラフルじゃないと、おばちゃん見づらいんです…

えーと、スクリプトについては、スクリプト内のコメント以上に詳しく説明する箇所は無いのですが……まあ、いつもこれだけ詳しくコメントつけてるのに、しばらく経つと自分でも何をしていたのかわかんなくなるんですよねえ……
とりあえず、簡単に要点をまとめてみますと。

まず、ゲーム内で一定の間隔で一連の処理をさせるために、「RegisterForSingleUpdate()」という命令を使っています。
この命令は、カッコ内で指定した数値のタイミング後に「OnUpdate」以下のイベントの処理を行ってくれるという……あらかじめ用意した処理を予約しておくための命令です。
SingleUpdateなので、一回こっきりの予約なのですが、予約した処理の中に、再び次回予約の「RegisterForSingleUpdate()」を入れていますので、最初の一回を起動しさえすれば、後は半永久的に処理し続けてくれます。

その最初の一回目……初回起動の命令が、「スクリプトの起動」というところで記述している「Setup()」という自作関数です。
この関数を呼べば最初の一回目の処理が始まります。
あとは、「event OnUpdate()」以下で、ヒーリング対象の体力をチェックする処理を用意しておくわけですが、大事なのは、ヒーリングシーンの最中はモニタリング処理をカットする、という点です。
前回も触れましたが、ヒーリング中の場合は処理をしない、という分岐を挟まないと、対象の体力値が減っている限り、このモニタリングスクリプトはヒーリングシーンを開始する命令をえんえんと出し続けてしまいます。
ヒーリングシーンは非常に繊細な処理ですから、シーンの最中はできるだけ邪魔しないようにそっとしておいてあげてください。

上記のスクリプトでは、プレイヤーの体力が8割を切っていたら、ヒーリングシーンをスタートさせることにしています。
ヒーリングシーンがスタートすると、前回作成したように、Phase1の開始時にHealingnowのフラグがオンになりますので、そのフラグがオンの場合は、何もしないように処理を回避しています。
ヒーリングシーンのPhase3が完了したら、Healingnowのフラグがオフになりますので、そうしたらまたこのモニタリングスクリプトは、対象の体力値をチェックしはじめます。
スクリプトの仕組みとしては、そんな感じです。

ちなみに……このモニタリングスクリプトでは、フォロワー全員のAIをセラーナちゃん式のAIパッケージに切り替えるためのモニタリング処理も一緒に行わせる寸法でいます。
(…というか、もう搭載しちゃいました☆セラーナちゃんみたいなフォロワーが3人もいると非常にカオスです)
こういう、常時駆動型のスクリプトって、処理が重たくなりそうなので、いくつも付けるのはイヤなんですよね。
フォロワー全員にセラーナAIをつけるためと、ヒーラーのために、わざわざモニタリングスクリプトを別々に用意するのはもったいないと思ったので、一緒のModに統合してしまうことにしました。
そのため、今回は、ゲームのデフォルトのフォロワーシステムである「DialogueFollower」を直接改造するという暴挙に出ています。
単にヒーラーを作りたい、というだけならば、新規のフォロワーシステムを作って、そこにヒーラーの機能を搭載するのが、はるかに安全ですので、そちらをおすすめします。


さて、スクリプトを設置し終えたら、次はそのスクリプトを起動するための準備をします。
……おっと、その前に大事なことを忘れていました。
作成したモニタリングスクリプトのプロパティを、忘れずに指定してあげてください。
このスクリプトで使っているプロパティは3つ……整数型のプロパティの「UpdateInterval」とScene型のプロパティの「HealingScene」と、クエスト拡張Script型のプロパティの「DialogueFollower」です。
UpdateInterval」はRegisterForSingleUpdate()を行う、モニタリングの間隔の数値として用意した値です。おばちゃんは「1」を設定しています。
HealingScene」は、【手順3】で用意したヒーリングシーンを指定してください。
そして最後の「DialogueFollower」は……これは、ヒーリング中かどうかのフラグをプロパティとして設定したスクリプトのクエストを指定します。
おばちゃんは「DialogueFollower」クエストの「DialogueFollowerScript」スクリプトの中にフラグを追加したので、上記のような指定になっていますが、別のクエストの別のスクリプトの中に用意した場合は、それに合わせて変えてくださいね。

プロパティの設定が済んだら、次はスクリプトを起動させるために、クエストのステージを準備しましょう。
「Quest Stages」のタブに移って、ステージ0を作成してください。


ステージ0は、念のため「Start Up Stage」にチェックを入れておいてください。
「Start Up Stage」にチェックの入っているステージが、クエストが開始された時に最初に適用されるステージになります。
チェックを入れたら「Log Entry」の欄で右クリック→Newを押して、空のエントリーを挿入します。
本来はここに、ストーリー性のあるようなクエストでしたら、クエストの概略の文章を入れたりするんですけどね。
このクエストは、決してプレイヤーの目からは見えない裏方のクエストなので、そういう余計な説明は要りません。
重要なのは「Papyrus Fragment」という欄に追加するスクリプトです。


「kmyQuest」って何の略字なのかわかりませんが……まあ、それは置いておいて。
「kmyQuest」には、先程設置したモニタリングスクリプトを選択します。
そしてスクリプト記入欄に、「(kmyQuest as oba_UFS_MonitoringScript).Setup()」という一行を記述します。
(※スクリプトの名称などはご自分の環境に合わせて適宜、変更してくださいね)
これは先程のモニタリングスクリプトの中で用意した、初回セットアップの関数を呼び出すための記述です。
つまり、このクエストが始まってステージ0になった瞬間に、モニタリングスクリプトが起動して、モニタリングが始まるようにするのです。
これで、このクエストを開始すればモニタリング処理が始まり、このクエストを終了させればモニタリング処理そのものが消える……という仕組みが出来上がりました。
以上、これでモニタリングクエストは完成です。


【手順5】 ヒーラーのActorを用意する

さて、いろいろ準備が整ってきましたが……あともう一つだけ、予め準備しておかなきゃならないものがあります。
それは、ヒーラーになるためのキャラクター(Actor)です。
残念なことに、ヒーラーには誰でもなれるわけではないんですよね。
少なくとも、おばちゃんの作ったこのヒーラーModの仕様ですと、確実にヒーリング行為を行うためには、ちゃんとセッティングされたキャラじゃないとうまく動いてくれませんでした。

ヒーラーのActorの設定として、必要不可欠なセッティングは、以下の3つです。

(1) Actorのステータスの「クラス」
(2) Actorの取得している「スペル」
(3) Actorの所持している「近接武器」の有無

ちなみにおばちゃんは、ヘイムスカー氏のActorを複製したものでしか試していないので、もしかしたら別種族だったらまた違うセッティングが必要なのかもしれません。
あくまで、ノルド男性ならこんな感じ、という参考までにごらんください。

(1)のクラスについては、これは「CombatMageElemental」というクラスが最適でした。
もちろん全部のクラスを試したわけではないので、もっと他に適したクラスがあるかもしれないのですが……ただ一つだけ言えることは、魔法をガンガン使えるタイプのクラスじゃないと、ヒーリング行為を行うことは難しい、ということです。

クラスの設定欄はActorの「Stats」のタブの下の方にあります。

最初はヒーラーは回復呪文さえ使えればいいんじゃない?と思っていたのですが、少なくともヘイムスカー氏の元のクラスの「Priest(プリースト)」のままでは、うまく動いてくれませんでした。
これは、おばちゃんがいろいろ観察してて思っただけなんですが……回復魔法のスキルの有無より、破壊魔法や変性魔法といった実戦で使える魔法のスキルを数多く持っているということが、ポイントのような気がするんです。

なぜかと言いますと……戦闘中の動作ってホント、システム側からの干渉がありすぎて、CKでは全くどうにもならないんですよ。
たとえば、誰でも心当たりがあるんじゃないかと思いますが、敵に遭遇した時、リディアさんみたいなマッチョなフォロワーにはもっと前方に壁として突っ込んでいって欲しいのに、後ろの方でちまちま弓を打っていて、全然前に出てきてくれない、ということがあります。
(その逆も多いですが……)
あれはたぶん、敵との距離が一定の間隔以上だと弓で攻撃する、という決まりがあるんだと思うのです。
敵の所まで走っていって殴った方が絶対に早いし強いのに、一定以上の距離があると、絶対に弓を取り出します。
そういったシステムから直接操作される現象は、何も弓だけではありません。
キャラの一定距離以内に敵が入ってくると、キャラは反射的に近接武器を構えます。
それは「システムからの神の声」のようなものです。
だから、ヒーリングシーンの真っ最中の、かめはめ波みたいな大げさなモーションを取ろうとしている最中でも、容赦なく割り込んできたりします。
もうこの干渉は、どうやっても止まりません。
プレイヤーのチームメイトをやめて戦線離脱するしかないです。

…で、何故、魔法をガンガン使うタイプがヒーラーに適してるか、というと。
魔法って、武器を構えるよりはるかにモーションが早いし、立ち直りが早いからです。
デュアルキャストは時間がかかっちゃいますが、ファイアボルトとかは片手をあげるだけで済みますし、オークフレッシュみたいな防御魔法などは一瞬シャキーンと光るだけです。
武器の方は、ただ構えるだけでも時間がかかるのに、さらになんか武者震いするようなモーションしたりとか、余計な動作がものすごく多い気がするんですよね。
そのせいで、ヒーリングするためのAIパッケージの動作になかなか移れないのです。
だから、ヒーラーにはできるだけ武器はつかわせないことがポイントです。
破壊魔法やフレッシュ系の防御魔法といった、立ち直りの早い魔法をガンガンつかわせてできるだけ無駄なモーションを行わせないようにするんです。
まあ、このセッティングのおかげで、ヒーラーというより、魔術師として活躍する方が目だってしまうんですけどね。


次に重要なセッティングは(2)のActorが取得している「スペル」です。
これはまず、「Healing」を取得していないと回復を行ってくれません。必須です。


いちおう、「Healing」さえ取得していれば、戦闘中でもヒーリングしてくれるのは確認しましたが、前述したように魔法をできるだけ数多く使わせるために、手間のかからない魔法のスペルをできるだけ数多くぶち込んでやった方が、ヒーリングの成功率が上がります。
Perkは無しでもかまいません。
おばちゃんは回復魔法の効果を上げるために付けてやってますが。

それから次に大事なのは(3)の「近接武器」の有無です。
これも理由は前述した通りです。近接武器を持っていると、ムダにぶんぶん振り回そうとするので、Actorのインベントリから取りのぞいてください。


ちなみにヒーラーのエイリアスの方で、弓を持たせる設定をしておらず、キャラクターが何も武器を持っていない丸腰の状態になると、戦闘に参加しなくなってしまいますのでご注意くださいね。
本当は弓も取り上げたいのですが、丸腰にはさせられないので、仕方なく持たせてやってるんです。
でもまあ、遠距離で使える魔法を取得していると、弓を背中から取り出して構えた瞬間に、「あ、俺には魔法があったんだ!」ということを思い出すのか、弓をしまってくれます。
最初から魔法使ってよ!と思いますが、そのくらいのモーションは大目に見てあげるしかないです。

以上で、ヒーラー用のActorの設定は終了です。
しつこいですが、この辺の調整は、たまたまおばちゃんの環境でうまくいってる…というだけかもしれませんので、あくまで参考程度にお考えください。



記事としては、いちおうこの辺りまでが、「ヒーラーの作り方」ということになります。
あとは【手順3】で用意したモニタリングクエストを、ヒーラーをフォロワーとして雇用する時に開始させてやるだけです。
ヒーラーのエイリアスをフォロワーとして働かせるためには、ヒーラー用のフォロワーシステムを作らなきゃなりませんが、それはヒーラーの作り方というより、フォロワーシステムの作り方になってしまうからなあ……どの程度、突っ込むべきなのか、悩みます。

ひとまず、長くなったので終わります。
続きはまたの機会に。

おまけ。ワンコになつかれてるレイロフ君。

フロドナー君をフォローするように設定してるのに……どうしてここに。
それにしてもヘイムスカー氏がやかましいです。真夜中なのに……大迷惑。

【関連記事】
ヒーラーフォロワーの作り方(1)
フォロワーの仕組み
フォロワー用ボイスタイプ追加Mod
きみはペット ~アニマルフォロワーのしつけ方~

11 件のコメント:

  1. ものすごく分かりやすく、丁寧な解説で色々捗ります。さっそく試してみたいと思います。
    フォローワーの作り方は、わりと他の方のブログ等でも解説がありますし、複雑なイベントシーンやクエストでも絡ませない限りは難しくない(NPC作成に毛が生えた程度)ので、簡単に済ませても大丈夫な気はします。システムの介入…厄介です(*´Д`*)解説ありがとうございました。

    返信削除
    返信
    1. 他の方の環境でもうまくいくと良いのですが……
      いろいろ苦労した分、発見した法則はできるだけ書いたつもりですが、
      まだまだ見落としていたり、勘違いしていたりする部分があると思います。
      何かおかしい、と思うことがあったらぜひご指摘ください。

      削除
  2. レイロフの立ち位置は”憎めないおっさん”くらいでしょうか・・ねw

    そういえばなんでレイロフはクマさんアーマーに昇格しないんでしょうね?
    帝国側で内戦進めるとハドバルのアーマーが重装になってて一瞬、「誰?」って感じなのに・・・w

    返信削除
    返信
    1. お、おっさん……そんな歳なんですかね。レイロフ君って。
      言動がイキがってる中学生みたいなので、てっきり戦前生まれ(30以下)かと思ってました。
      まあ、でもこのゲーム、厨くさいオジサンは沢山いるから、歳は関係ないか。

      ハドバルって出世するんですか!?知りませんでした。
      私は帝国側で内戦クエはやったことないので……まあ、おそらく今後もやることはないでしょうが……
      そうか、ハドバル君はただでさえ、性格良くて甲斐性もあるのに、将来性まであるのか。
      どうして彼をお婿さんにできないのかと多数の女子が嘆くのも当然ですね。

      削除
    2. >>お、おっさん……そんな歳なんですかね。レイロフ君って。


      いやー・・・私の印象では髭、太めな胴回りが
      おっさんなんじゃなかろか・・・という印象を受けまして
      改めてCKで顔をのぞいてみたら、若そうな顔しているんですね。小汚かったですけど・・・(苦笑)

      最後に・・・
      男はみな歳を取ればおっさんになるのだから
      おっさんであることはたいしたことではないと思う
      大切なのはかっこいいおっさんになれるかどうかだと思う。

      削除
    3. そう、レイロフって、なんか妙に小汚いんですよね(笑)
      ハドバルと違って、まったく清潔感が無いのがモテない要因じゃなかろうか……
      顔見るたびに「風呂に入れ」と言いたくなります。

      スカイリムにはかっこいいおっさんが沢山いますね!
      その辺の一般市民も惚れそうになるレベルがごろごろしてて、うっとりします。
      レイロフ君はかっこいいというより、『とっぽい』オヤジ風ですね。

      削除
  3. おばちゃんさん、はじめまして。
    おばちゃんさんの記事を参考に、ヒーラーフォロワーを作成しようとしています。
    そこで、"ヒーラー用のフォロワーシステム"の作成の仕方の記事を書く予定はありますでしょうか?
    というのも、その手前まではできたのですが、知識がなくそこから先へ進めません(笑)
    また、別記事にちらっとたいまつを持たせておくとバグが〜というような事が書いてありましたが、現在もこの方法で作成したヒーラーフォロワーさんは使ってらっしゃいますか?

    よろしければお返事お願いしますm(_ _)m

    返信削除
    返信
    1. あ~、確かに今、記事を読み返してみると、「んで、この後どうすりゃいいの?」みたいな中途半端な説明ですよね。すみません;
      これを書いた当時はきっと、ヒーラー機能の作り方の説明としてはここまでで、後は単にフォロワーとして雇用・運用できるようにするという、ヒーラーに限らない「フォロワー枠の拡張の手順」の説明になってしまうので、それを書くなら別記事にしようと思ったんだと思います。
      まあ、時機を逃して、結局書かずじまいになってしまったんですが……


      > 現在もこの方法で作成したヒーラーフォロワーさんは使ってらっしゃいますか?

      当ブログのプレイ日記「タロス巡礼の旅」のヘイムスカーさんは、この記事を書いた当時に作ったヒーラーですが、今もバリバリ現役で回復してくれてますよw
      しかし今、私がヒーラーを新たに作るとしたら、プレイヤーのHPを常時監視するモニタリングの仕組みではなく、「Dragonborn」のリークリングの救援イベントのような、プレイヤーが攻撃を受けた時に発動するイベントとしてヒーラー機能を搭載するだろうなあと思います。
      この記事を書いた当時は、まだまだ知らないことが多すぎました……


      …というわけで、今となっては、この記事の続きとしてフォロワー枠の拡張の手順を書くのはためらわれるのですが、単なる「フォロワーシステムのしくみと拡張の仕方(人数の増やし方)」なら、記事を書くのもやぶさかではありません。
      時間が取れたらまとめたいと思いますので、気長にお待ちくださいね。

      削除
    2. 丁寧にお返事ありがとうございます。
      おばちゃんさんにたよりきらず自分でも試行錯誤しつつ、
      記事お待ちしています(笑)

      削除
  4. 見習いどばきん2014/07/10 15:10

    こんにちは!
    スカイリムに降り立って以来、おばちゃん様の興味深い宝石のような数々の記事を折に触れて読み返しています。
    CKもおそるおそる導入してみて、頭の上に大量のハテナを出しつつ現在勉強中です!

    フォロワーさんを自作すると愛着がとてもわいて少々どころかかなりアホな行動をとってもニヤリとしてしまいますね(笑)
    (自作フォロワーさんではないのですが、おばちゃん様のボイスタイプ追加MODでハドバル氏を誘拐したところ、道中のストクロ兵に「帝国の鎧が重くてどうのこうの」と愚痴りだしたのを見てしまって爆笑しました。素敵なMODをありがとうございます!!)

    私も衛兵一号さんと並んでフォロワー関連の記事をのんびりお待ちしています!
    暑い季節がやってきましたのでお体にお気をつけて下さい。

    返信削除
    返信
    1. コメントどうも有難うございます!
      ハドバルさん、そんなこと言うんですね。
      しかもストクロ兵に愚痴ってどうすんのさ(笑)

      私は最初ハドバルさんに会った時(オープニングのハドバルルート)
      あまりにも見ず知らずの人に親し気に話しかけてくるので、
      「この人、何か下心でもあるのでは?」
      …と思わず疑ってしまったくらいだったのですが、
      単にむちゃくちゃ人なつこいだけだった…ということが後で判明して
      かえって唖然としてしまいました。
      おそらく愚痴られたストクロ兵も(゚Д゚)…な感じだったと思います。

      > 暑い季節がやってきましたのでお体にお気をつけて下さい。

      有難うございます。今、13人目のドヴァキンさんのお供のために、
      フォロワーを作ったりしてるので、記事にまとめられたらなあと思います。
      また良かったら遊びにいらして下さい。

      削除