Oblivionいじり アレコレ

OBLIVIONのCSやMOD,改造などの情報を載せています。他にオマケ情報もあり。

任意のkfファイルをPickIdleで再生させる方法

ポーズMODなどでよく使う、任意のkfファイルを再生させる方法です。画像は私のバイクMODのものを使っています。

Idle Animationsにkfファイルを登録、Conditionsを満たしてPickIdle

流れとしては、「Idle Animations」(待機アニメーション)にトークンアイテムの所持を「Conditions」としてkfファイルを登録、何らかのスクリプトでそのトークンアイテムを「AddItem」して「PickIdle」させて「RemoveItem」すればOKです。

Idle Animationsにkfファイルを登録

まずCSで「Idle Animations」(待機アニメーション)にkfファイルを登録します。

「Idle Animations」は「skeleton.nif」毎に分かれています。人間やHorse、Daedroghなど、生物の種類毎にフォルダ分けされていて、それぞれに「skeleton.nif」というファイル名で骨格が存在しています。

今回は人間のkfファイルを登録すると仮定して、一番上の「Characters\_Male\IdleAnims」の下に作ります。他の生物なら該当の箇所に登録すればいいだけです。

階層的に親となるものを1つ登録

登録の仕方はどうでも機能すると思いますが、階層構造にしたほうが色々いいです。

まず「RaceMenuAnims」などと並んで1つ、そのMODで使う用に1つ登録します。私は同乗者用として「NR500PassengerMiscAnims」としました。IDは重複しなければ何でもOKです。

「アニメーショングループ」はそのMODで扱いたい部位を選択して下さい。体全体の場合は「Whole Body」か「Special Idle」で。バイクMODの場合は前者でないと上手くいきませんでした。

右上でkfファイルを登録しますが、これはあくまで親であって階層や「Conditions」などを整理するだけの存在なのでここには登録しません。「Must return a file」はよくわかりませんがチェックで。

「Conditions」は非常に重要で、この階層以下を再生させるための条件を指定します。よく使うかもしれない条件として、「GetIsID」(それのEdhitorID)や「GetSitting」(椅子や馬に座っている状態)や「GetItemCount」(アイテムの個数)や「GetQuestVariable」(クエスト変数)などがあります。

子として各々のkfファイルを1つずつ登録

親が設定できたら、次は実際に各々のkfファイルを1つ1つ登録していきます。

親と設定は同じですが、kfファイルの登録が必要になります。kfファイルは、その生物の「Skeleton.nif」があるディレクトリにある「Idleanims」ディレクトリ以下に置く必要があります。例えば、人間なら「meshes\characters\_male\idleanims」以下に置くということです。

違うディレクトリ、例えば人間の設定で「meshes\creatures\horse\idleanims」を指定しようとしてもムリなので注意。誤指定防止のためだと思いますが少し不便です。

「Conditions」には、そのkfファイルを再生させるための条件を指定します。今回はトークンアイテムを使うとして、「GetItemCount」で何らかのアイテムを指定します。詳しくは後述。ちなみに「Conditions」は右クリックから「Copy/Paste Conditions」すると楽です。

全てのkfファイルを登録できたら、次はスクリプトで実際にkfファイルを再生させます。

スクリプトでPickIdle

方法は非常に簡単で、スクリプトに以下のように書くだけです。

AddItem TokenItem 1
PickIdle
RemoveItem TokenItem 1

「AddItem」でトークンアイテムが渡されてそのkfファイルの再生条件を満たし、PickIdleでゲームエンジンが実際に条件に合った「Idle Animations」を探して再生させて、最後に「RemoveItem」でトークンアイテムを消します。

このようにリファレンスを指定しないと、このスクリプトを持つアクターに実行されます。「Player.PickIdle」や「ArenaFan1.Kill」とやれば、その特定のアクターに実行されます。

ちなみに、PickIdleは連続で実行すると上手く動きません。スクリプトの「Begin GameMode」などで毎フレーム監視しているような場合は、変数などで連続実行を回避する必要があります。バイクMODの場合こんな感じ↓

If RunningSI != 0
  AddItem NR500Idle 1
  PickIdle
  RemoveItem NR500Idle 1
  Set RunningSI to 0
EndIf

あと、現在再生中の「Idle Animations」を解除する方法は詳しくは試してはいませんが、「Player.Playgroup Idle 1」のようにするか、「Cycle Type」が「CYCLE_CLAMP」のリセット用の「SpecialIdle」を「PickIdle」させればOKだと思います。

おまけ1:Conditionsをどう設定するか

今回は「Idle Animations」の「Conditions」としてトークンアイテムを指定しましたが、他にもいくつかの方法があります。

kfファイル毎にトークンアイテムを用意
トークンアイテム数が膨大になりますが、固有のIDを付けることによってわかりやすくなる利点があります。
1つのトークンアイテムで、kfファイルによって個数を変える
「1個の時、2個の時、3個…」と指定することで、トークンアイテムが1つだけで済んでスッキリします。
クエスト変数やグローバル変数を利用
変数が増えてしまいますが、他から参照しやすいという利点があります。
Factionを利用
アイテムも変数も増やさずに実現できます。だけど私は試したことがありません。

有名なCTAddPoseの場合は、プレイヤーがMessageBoxで選んだボタン2つをクエスト変数「major」と「minor」として記憶して使っているようです。

おまけ2:トークンアイテムについて

トークンアイテム方式を利用する場合、アクターなどは専用のトークンアイテムを使うべきですが、例えばHorseのようなインベントリにアイテムを所持しないものの場合は、Appleのような普通のものをトークンアイテムとして使ってもOKです。

戻る