Skyrim箱庭DIY

MODによる固有の環境不具合は自分で直して快適ゲーム。CTDにさようなら。Do It Yourself!!

【SkyrimSE】SkyrimにおけるBehaviorの構造イメージ解説(Havok Behaviorとの関係編)



スポンサーリンク

Havok Behavior

続き物です。前回は擬人化した"behaviorさん"でbehaviorの概念的なお話をしましたが、今回はもう少し具体的に。
SkyrimとHavok Behaviorの関係性と、どういうやりとりしてるの?ってあたりを、また個人的理解の元にメモっておきます。
behaviorってそもそも何よ??って人は、前回の記事をどうぞ。
skmod.hatenablog.com

※理解度の浅い点が多い為、嘘もあると思ってください。本文にある囲みの中の文言は特にそうで、個人的メモ書き程度に見てもらえればと。

SkyrimとHavok Behaviorとの関係ブロック(想像)図

ぼくのかんがえたブロック図。多分こんなイメージかと・・・動作からの想像図なので参考程度に。
ゲームエンジンとプラグインは分けると煩雑になるので、一緒にしてあります。
LEにも適用されるかはちょっと不明。annotationとかpayloadってLEでどうなってるのか知らないので・・・

HavokBehavior予想ブロック図

Skyrimからアニメーションファイルを直接操作することはできません。

  • animation event
  • animation variable

この2つを使い、SkyrimはHavok Behaviorからのoutputである、

  • animation data (再生するアニメーション)
  • annotation (アニメーション起点のanimation eventや攻撃アニメーションのmotion data等)
  • payload (annotationに付随する実行命令的な文字列)

を得ます。annotationとpayloadはSkyrim側で直接読んでることもありそうですが、ちょっと詳細不明(後述)。

これでゲーム内のアニメーションが動く仕組みだと思います。前回の記事に出てきた"Behaviorさん”に大雑把に丸投げすると、条件に合ったアニメーションが返ってくる感じ。
最終的な出力アニメーションは、必要に応じて複数のアニメーションファイルをブレンドします。実際はHavok Physicsによって地形に合った足位置等も加味されるかと(色々ばるんばるん揺れるやつも勿論!)。

annotationとpayloadは、バニラだと"animationdatasinglefile.txt"等からSkyrimが直接読んでそうなので、必ずしもHavok Behaviorが嚙んでる訳ではないかもです。ですがClip Generatorからもannotationやpayloadを出力できること、複数clipブレンド時にannotationとpayloadの抽出対象となるアニメーションファイルの選択作業等もある筈なので、ここでは「Havok Behaviorからアニメーションと一緒にSkyrimに送られる」というブロック図にしました(動作イメージを掴むには支障ない筈)。実際はHavok Behaviorから送られた物と、Skyrimエンジンが自分で取ってきた物を合体させてるのかも?
それからanimation variableはSkyrim側からread/write可能ですが、Havok Behaviorがwriteすることは無いかも?(readは使う)。boolなら何かフラグ的に書くのもあるのかな・・・ちょっと不明。


アニメーション再生ブロック(想像)図の各信号概要

もっかい再掲載。各信号についてまとめておきます。
HavokBehavior予想ブロック図

animation event

条件が整った時刻にトリガしてタイミングを知らせたり("weaponswing"で武器の振り始め開始を通知)、アニメーションの開始命令としてbehaviorが受け取ったり("IdleApploud2"で拍手のアイドルアニメーション再生開始)等、主に状態変化のedge検出に使う、んだと思います('_')
スクリプトではanimation variableともどもお馴染みですね。

全てのbehavior間でグローバルに使える訳ではなく、各behavior毎にローカルです。behaviorは種族毎にありますが、人間種族は更にたくさんのbehaviorに細分化されてる為、遷移状態次第では使い方に注意が要るかも?

新設するにはbehaviorファイルの更新(直接edit or NEMESIS)が必要ですが、Behavior Data Injectorを使えば更新無しで新設できます。例えばOARで差し替える新規アニメーションに、annotationとして新しいanimation eventを仕込んでトリガしたい!なんて時には大活躍。

ある程度スパンのある状態チェック(スニーク中、抜刀中みたいな状態のlevel検出)はanimation variableで行うと思いますが、animation eventでも同様の使い方をすることがある?(animation eventで状態チェックしてそうに見えた物もあったので)。


animation variable

「graph variable」、「アニメーション変数」等の別名。あらゆる動作や状態を示すフラグだったり、behaviorの状態遷移のスイッチングに使ったり、使い方が多岐に渡る変数です。移動方向や速度の情報を調べたり、装備中の武器によってbehaviorの遷移を分岐させたり、Magic Effectのconditionに使ったりと、挙げればキリがありません。
ゲーム内の旬な情報を知りたければ、まずはanimation variable(〃▽〃) ってとこですかぬ。
例えばsneak状態を調べる”IsSneaking”が、これに該当します。DARやOARでのアニメーション差し替え条件にも使われてるやつですね。

animation ivent同様に、behavior毎のローカル変数です。こちらも新設には、behaviorファイルの更新もしくはBehavior Data Injectorが必要。

"Character Properties"なるグローバル変数があります。
read onlyでバニラでは多分39個、新規追加可能。"IsMale”, ”IsHorse"みたいな普遍的な値ですね。ブレンド対象になるboneのグループ設定(右手のみ、上半身、等)に使われてるのは確認済。Skyrim側からアクセスできるのかちょっと不明。
新設手段はbehaviorファイルの更新のみ。


animation data

遷移した先のClip Generatorから、状況に応じてclip(最終出力前の部品的なニュアンスだと思う)をブレンドして、最終出力となるアニメーションを作ります。1つのclipだけでブレンド無しなことも多いです(physics除く)。

例えばクロスボウを構えた状態(CrossBow_IdleHeld.hkx)でジャンプ(mt_jump.hkx)すると、mt_jump.hkxを主軸に、右手だけCrossBow_IdleHeld.hkxが適用されます。結果としては、右手でクロスボウをしっかり握った状態でジャンプします。
これはbehaviorファイルによるブレンド設定なので、それぞれのアニメーションファイルを他に差し替えても同様に機能します(クロスボウ用の右手が握っていれば)。

annotation、payload

1つのアニメーションの再生-終了間動作に関連するパラメータ群。アニメーション再生時に解釈するのか、あらかじめ全部Skyrimが保持しておくのかはちょっと不明(なのでブロック図だとanimation dataと一緒に送信されるみたいに書いてます)。アニメーションファイル内に埋め込んだり、巨大なテキストファイルに羅列されてたり、Clip Genaratorが付与したりします。基本、アニメーション再生開始時刻を起点に経過時間ごとに記述しますが、Clip Genaratorで作られる物は、再生終了時からの逆算(マイナス時刻)でも設定可能。
ここで詳細書くと長くなるので、詳しくは別記事にて。
skmod.hatenablog.com


Skyrimとanimation eventの関係性

animation event = アニメーションの再生トリガではないです。再生トリガを期待する使い方も勿論ありますが(idleアニメーションとかポーズMODとか)、それはbehaviorファイルでそういう遷移に設定されてる為。SkyrimからHavok Behaviorにトリガしたり、逆にHavok BehaviorからSkyrimにトリガすることもあります。相互に”event”発生をお知らせ。

animation event=アニメーション再生トリガになる例

例えば、animation event ”IdleSurrender”は、これをトリガに”Supecial_Surrender.hkx”の再生まで一気に状態が遷移します。
その為、コンソールから

player.playidle IdleSurrender

を実行すると、降参というか万歳にも見えるアニメーションが再生されます。将軍サマまんせー。※Minutemanの将軍です
万歳三唱


animation event=アニメーション再生トリガにはならない例

animation event ”weaponswing”を同様に、

player.playidle weaponswing

としてみます。
ですが残念ながら、見た目には何も起きませぬ。アニメーション再生に繋がる状態遷移には使われてない為ですね。

これは攻撃アニメーションのタイミング管理に使われてます。
例えば両手剣攻撃。即攻撃ではなく、実際はごく短時間ですが武器の”構え”が発生して、そこから斬撃に繋がります。
この実際の斬撃開始タイミングを通知するのが、weaponswingです。アニメーションファイルごとにannotationを介してSkyrimに通知されます。アニメーションが変われば、このweaponswingのタイミングも変わります。例えば、これのおかげで武器のスイング音がうまく同期してるんだと思います。

AMCOの”mco_attack1.hkx"のannotationから抜粋。時刻0.433に、weaponswingが記述されてます。ただ、これはanimation event ”WeaponSwing”にpayload "Soundplay"が乗ってるのか、animation event ”Soundplay.weaponSwing"なのかどっちだろう・・・どっちもある('_')
まあこれのおかげで音が同期してる、ってことには違いないかと!

0.330000 preHitFrame
0.433000 Soundplay.WPNSwingUnarmed
0.433000 Soundplay.weaponSwing
0.533000 HitFrame

なんか長くなってしまったので、一旦この辺で。
次回、実際にbehavior graphを見ていきます。

続きはこちら
skmod.hatenablog.com