Scriptを選択して右クリック。Edit Sourceします。
Editウィンドウが開いたら、以下の内容になるように貼り付けます。
Propertyの各行も、分かりやすいようにちょっとだけまとめてみました。
貼り付けたらEditウィンドウ上部よりFile > Saveします。無事にコンパイルが通れば、ひとまず成功です。
掃除人フォロワーを作ったときのScriptに手を加えて修正したものです。最初にScriptを書いた時はFunctionを一つ作るごとに動作テストしてました。一度土台を作ってしまえば似たようなクエストで使いまわせるので、今回はずいぶん楽。一気に全部書いて、まとめて動作確認するつもり。
もし間違ったPropertyを登録してしまった時は、このEdit画面で間違えたPropertyを消します。もし消したいPropertyに値を与えていたら、Propertyの画面で「ClearValue」ボタンを押して登録していた値を事前に消しておきます。そうしておかないとPropertyのデータが中途半端に残って、PapyrusLogに
エラーが出るようです。値を消し忘れても、CKで一度セーブした後、CKを立ち上げなおして再度読み込み&セーブしても直るようです。
逆にAddし忘れたPropertyがあれば、Scriptに直接書き込むこともできます。その場合はセーブしてEdit画面を閉じた後、「Property」ボタンを押して具体的な値を設定します。
作ったFunctionは上から順に、「人間フォロワーの雇用」「動物フォロワーの雇用」「自分のAliasを検索」「待機のOn/Off」「人間フォロワーの解雇」「動物フォロワーの解雇」
メンテナンス用として「人間フォロワーの全解雇」「動物フォロワーの全解雇」です。
基本的にバニラのScriptを真似していますが、全体的に簡素化、解雇に関してはかなり簡略化しています。バニラのフォロワーの解雇処理がややこしいのは、クエストがらみで強制的に別のフォロワーと置き換えられたり別れさせられたりするからみたいです。同胞団とか結婚式とか。自作クエストにはそういったしがらみがない上、「従者と別れた」等のお知らせメッセージも出さないつもりなので、要らない部分はごっそり削りました。
雇用時にフォロワーに設定している"IgnoreFriendlyHits()"は仲間割れ防止用の設定ですが、コメントアウトしています。この設定はかなり強力で、試したところ、プレイヤーから執拗な攻撃を受けても敵対できず、一方的に殺されるだけになってしまいました。この辺の挙動はできるかぎりバニラフォロワーに近い形にしたいので、他の仲間割れ防止策を思いつくまでは保留。どうしても思いつけなかったら、解禁することにします(どちらにしても、バニラ枠フォロワーからの一方的な仲間割れ攻撃は受けそうなんですけど)。
「自分のAliasを検索」するFunctionは、複数フォロワーを扱う際には必須の処理です。プレイヤーが話しかけた相手がどのAliasに入っているかが分からないと、待機も解雇も行えません。話しかけた相手のReferenceから直接Aliasを知るような方法が分からなかったので、Aliasの中身を順番に見ていき、話しかけた相手のReferenceと一致するかどうか調べて探し出す方法をとっています。
Aliasが増えると検索に時間がかかるので、FactionのRankなどを利用して個々のフォロワーに自分のAlias番号を持たせるなど、別の方法でAliasを割り出す必要が出てくるかと思います。
Scriptをセーブしたら、もう一度「Property」ボタンを押して、設定したオブジェクト類が外れたりしていないか確認しておきます。Script編集に没頭しているうちに何かやらかして、設定値がいつの間にか外れていることがあるので。CKを起動せず、外部のエディタツールなどでScriptだけを編集&コンパイルしていた場合は特に要注意です……。
同じようにして、AliasにAddしたScriptにも以下のソースを貼り付けてSaveします。
これは人間フォロワー用。
フォロワーAliasを3つ作っていますが、同じひとつのScriptをPropertyなしで使用しているので、どれかのAliasでScriptを編集するだけ。同じScriptを共有しているといっても、同じ指示書を配布しているようなもので、ゲーム内での処理は個々のAliasで別々に行われます。
こちらは動物フォロワー用です。
どちらのScriptも内容は基本的に同じです。以下の3つの処理を行わせています。
・待機を指示されたら3日後に自分の状態を確認し(QuestScriptから3日後に処理を開始しろの指示が飛んでくる)、まだ待たされているなら自力で待機命令を解除してプレイヤーのところに戻る。
・プレイヤーから攻撃を受けて敵対状態になったら、自動的に雇用解除。
・死亡したら自動的に雇用解除。
これもバニラフォロワーにくっついているScriptをお手本にしています。
ここまでできたら、あとはそれぞれの会話文に処理を呼び出す一文を加えるだけで、フォロワークエストを実際に使用することが可能になります。
前へ |
次へ
2. ブログ、楽しませていただいております!
ファル粕と申します。一年前からスカイリムをはじめて、つい最近まで通常のプレイをしておりましたが、ふと思い立ち、ckを勉強しはじめました。ckは自分には敷居の高いもので、何から手をつけて良いかわからなかったのですが、景色を見ながらのんびり旅をするのが好きなので、生活に関連したmodを作ってみたいなぁと探していたところ、フォロワーが人間らしいリアクションをとるUNIさんの考えたAIを再現したいと思い、挑戦しています。
QuestScriptのコンパイルまで、なんとか行けたのですが、GetName is not a function or does not existのエラーが出てしまい…先に行けない状況です。自分でも原因を調べておりますが、イスグラモルの知性が足りないようです…アドバイス頂けたなら幸いです。
何より、こんなに丁寧に理論をまとめて下さっているページが他に見当たらないので、それだけでも大変感謝しております!
Re:ブログ、楽しませていただいております!
私もCKは今年になってからさわりはじめて、まだ日は浅いですが作る楽しみにどっぷりはまりこんでしまいました!
きちんとした記事じゃないかもしれませんが、試行錯誤している過程がどなたかのお役に立てればと、恥ずかしげなく色々書いちゃってます。
未熟者ゆえに間違ったことや勘違いもありますので、眉に唾をつけてごらんいただけると幸いです。(あ、でも自作MODの動作確認はちゃんとやってますよ!)
>GetName is not a function or does not exist
早速ですが、すみませんっ。
GetName()はSKSEを導入していないと使えない関数でした。
デバッグ用メッセージでNPCの名前を表示させるのに使っていますが、Scriptを機能させるのに必須ではありません。
記事の方のScriptをSKSEなしで動作するように、変更しました。こちらをコピペして、もう一度試してみてください。多分大丈夫かと思うのですが、なにかありましたらまた教えてくださいませ。
成功を祈ってます!