2017年12月6日

【Papyrus.psc】特定のモーションをとらせる

- Papyrusスクリプトの記憶を記録に残すシリーズその5 -

スクリプトで自由に寝転がったり座ったりしたい!


目次

  1. PlayIdle」を使う方法
  2. SendAnimationEvent」を使う方法
  3. モーションをキャンセルする方法
  4. モーションリスト

1.「PlayIdle」を使う方法

1-1. 起点となるものにスクリプトを付ける

まずはモーションをとらせる起点となるものにスクリプトを付けます。設置したアクティベーターでも良いですし、魔法に付けても良いです。新規スクリプトの付け方は前回まででやりましたので今回は省略します。

スクリプトには以下のコードを追記します。

Idle Property idlTest Auto ; モーションを指定するプロパティ

Event OnActivate(ObjectReference akActionRef)
    Actor actPlayer = Game.GetPlayer() ; プレイヤーを格納する変数

    If akActionRef != actPlayer
        actPlayer = None
        Return
    EndIf

    If actPlayer.IsWeaponDrawn() == true
        actPlayer.SheatheWeapon() ; 武器をしまう
        Utility.Wait(2.2)
    EndIf

    Game.ForceThirdPerson() ; 3人称視点に切り替え

    actPlayer.PlayIdle(idlTest) ; モーションの実行

    actPlayer = None
EndEvent

idlTestプロパティに実行したいモーションを指定すればOKです。モーションリストを参考にしてください。「PlayIdle」でモーションを実行します。

1-2. モーション実行前に必要な処理

モーションを実行する前に処理を2つ入れています。
1つは、武器を構えているときにしまう処理です。武器を構えているとモーションが出ないので、「IsWeaponDrawn」で構えを取得し、「SheatheWeapon」でしまわせています。
ここでのポイントは「Utility.Wait」です。これは武器をしまう動作を待っているのですが、動作が終了していないとその次のモーションが実行されません。上記では2.2秒待っていますが、指定するモーションによってはもう少し短くても良かったりしますので、テストプレイで確かめる必要があります。

もう1つの処理が、3人称視点への切り替えです。「ForceThirdPerson」で強制的に3人称視点になります。
1人称視点だと何のモーションか良くわからないものが多いのと、視点が動かせなくなったり不自然に両手が表示されたり等の不具合が出るものが結構あります。そのため、事前に3人称視点への切り替えが必要です。

以上が PlayIdle を使う方法で、おそらく正規のやり方だと思います。
ここまで説明しておいてなんですが、実はこの方法では実行できないモーションがかなり多くありまして、有用性は低いです

目次に戻る


2.「SendAnimationEvent」を使う方法

2-1. Debugスクリプトでモーションを再生する

こちらの方法なら再生できるモーションが多いのでおすすめです。
モーション名を文字列で指定する必要があるため、スペルミスしないように気をつけましょう。

Event OnActivate(ObjectReference akActionRef)
    Actor actPlayer = Game.GetPlayer() ; プレイヤー

    If akActionRef != actPlayer
        actPlayer = None
        Return
    EndIf

    If actPlayer.IsWeaponDrawn() == true
        actPlayer.SheatheWeapon()
        Utility.Wait(2.2)
    EndIf

    Game.ForceThirdPerson()

    Debug.SendAnimationEvent(actPlayer, "IdlePray") ; モーションの実行

    actPlayer = None
EndEvent

やり方は PlayIdle のときとほとんど変わりません。上記の例では「IdlePray」という、祈るモーションを指定しています。その他のモーションはモーションリストを参考にしてください。

2-2. モーション名をプロパティで指定する

モーション名の文字列はStringプロパティで指定することもできますので、複数の場所でスクリプトを使いまわす場合には以下のように2行だけ変更します。

;~
String Property strIdle Auto ; 文字列プロパティを追加
;~
    Debug.SendAnimationEvent(actPlayer, strIdle) ; モーション名をstrIdleプロパティで指定
;~

Stringプロパティは文字列を直接指定できますので、モーション名を書いておけばOKです。

目次に戻る


3. モーションをキャンセルする方法

3-1. 一部のモーションに有効な「IdleStop_Loose

継続モーションを解除するには、プレイヤーがジャンプしたり武器を構えたりする必要があります。これを任意の時点で解除する方法です。

一部のモーションでは、以下の記述でスマートに解除することができます。

;~
Idle Property idlStop Auto ; ストップモーションを指定するプロパティ
;~
    actPlayer.PlayIdle(idlStop)
;~

idlStopプロパティには「IdleStop_Loose」を指定します。このモーションは PlayIdle で使ったときのみ、一部のモーションをストップして通常状態に戻します。
例えば IdlePray モーションは、この方法で解除することができます。

3-2. 武器を構えて解除する

上記の方法で解除できない場合の方法です。武器を構えさせます。

    actPlayer.DrawWeapon()

動きは自然ですが、これで解除できないモーションもあります。

3-3. 強制的に着地させて解除する

プレイヤーを少し持ち上げて、強制的に着地モーションを取らせることでも解除できます。

    actPlayer.SetPosition(    \
        actPlayer.GetPositionX(), actPlayer.GetPositionY(), actPlayer.GetPositionZ() + 80    \
    )

z方向に 80 持ち上げています。この方法はほとんどのモーションを解除できます。着地モーションが出てしまうのと、モーションの種類によってはカメラがカクっと動くのが難点です。
スクリプト内の「\」は、途中で改行するためのエスケープ記号です。

目次に戻る


4. モーションリスト

モーションを90個だけ抜粋してリストにしました。動作の簡単な説明と、その動作が継続して再生され続けるかどうかをまとめています。
これらのモーション名は、Gameplayメニュー > Animations... で表示される Idle Animations のツリーをたどり、Actors\Character\Behaviors\0_Master.hkx 以下の項目内にある Anim Event から抜粋しています。

名前 動作 継続
IdleActivatePickUp 目の前の物を取る
IdleActivatePickUpLow 足元の物を取る
IdleApplaud2 胸の前で細かく拍手
IdleApplaud3 顔の前で大きく拍手
IdleApplaud4 大袈裟に胸の前で拍手
IdleApplaud5 大袈裟に顔の前で拍手
IdleApplaudSarcastic 投げ遣りな拍手
IdleBeggar 膝を立てた横座り
IdleBlowHornImperial 戦闘ラッパを吹く
IdleBook_OnePage 1または4ページめくる
IdleBook_PageTurn 1または4ページめくる
IdleBook_Read 本を読む
IdleBoundKneesStart 後ろ手に縛られてひざまずく
IdleBracedPain 敬うようにお辞儀する
IdleCarryBucketFillEnter 桶を持って満たす
IdleCarryBucketPourEnter 桶を満たす動作(桶は出ない)
IdleChildApologize 頭をかく
IdleChildCryingStart 子供のように泣く
IdleChildFidget 両手を前後に大きく振る
IdleChildLayOnFloor 床に腹ばいになる
IdleChildPlayDirt 右手武器の柄で床を叩くような動作
IdleChildPlayDoll 人形でひとしきり遊ぶ
IdleChildShy もじもじする
IdleChildSitOnKnees 正座して首を左右に揺らす
IdleChildTaunt1 オーマイガーっ!
IdleChildTaunt2 ちっくしょう!
IdleChildTaunt3 だめだねぇ…
IdleChildTaunt4 あーはははは!
IdleChildWhineKick サッカーボールキック!
IdleChildWhineStompFeet 床をダンっ!
IdleCiceroDance1 バカ踊り
IdleCiceroDance2 リズムダンス
IdleCiceroDance3 バカ踊りショートバージョン
IdleCleanSword 剣を綺麗にする
IdleComeThisWay こっちこっち
IdleCowering 危なーい!
IdleDrink ジョッキから飲む
IdleDrinkPotion 栄養ドリンクを飲む
IdleEatingStandingStart 立ってパンをかじる
IdleExamine 腕を組んで見る
IdleFeedChicken 花かごを取り出してばらまく
IdleFluteStart フルートを吹く(音なし)
IdleGetAttention 両手を挙げて振る
IdleGive 何かを差し出す
IdleGrave_01 手を前にして黙祷
IdleGrave_02 手を後ろにして黙祷
IdleHoe クワで耕す
IdleInjured 弱腰の喧嘩態勢
IdleKneeling 足元を調べる
IdleLaugh 笑う(正面視点不可)
IdleLaydown 仰向けに寝そべる
IdleLeanTable テーブルに手をつく(テーブルは出ない)
IdleListenStart 人の話を聞く
IdleListenStartAngry 人の話を怒りながら聞く
IdleLookFar 遠くを見る
IdleLooseSweepingStart ほうきを持って掃除する
IdleLounge 空中待機ポーズ
IdleLuteStart リュートを演奏する(音なし)
IdleMesmerize 目の前の物を見る
IdleNervous キョロキョロする
IdleNoteRead メモを取り出して読む
IdlePointFar_01 遠くを指す
IdlePointFar_02 遠くを指す
IdlePray 祈る
IdlePrisonerBeat 右手パンチ
IdleRitualSkull1 空を仰ぐ
IdleRitualSkull2 空を仰ぐ
IdleRitualSkull3 空に向かってガッツポーズ!
IdleSalute 右の拳を胸に当てて挨拶
IdleSell ポーションを持って構える
IdleSilentBow お辞儀をして挨拶
IdleSitCrossLeggedEnter あぐらで座る
IdleSitLedgeEnter 足を降ろして座る
IdleSleepNod コックリ
IdleSnapToAttention 手を後ろに組んで気を付け!
IdleStudy 顎に手を当てる
IdleSurrender 両手を挙げて驚く
IdleT02AscendFemale 足を閉じて浮く(効果音有り)
IdleT02AscendMale 足を開いて浮く(効果音有り)
IdleTake 何かを取ってポケットに入れる
IdleUncontrollableCough 咳をする
IdleWarmArms 寒くて両腕をさする
IdleWarmHands 手を温める
IdleWave ばいばい!
IdleWipeBrow 額の汗をぬぐう
IdleWounded_01 疲れて座り込む
IdleWounded_02 傷ついて横たわる
IdleWounded_03 お腹を押さえて座り込む
IdleWriteLedgerEnter 羽ペンとノートを持つ
IdleWriteTableStandingEnter 羽ペンで書く(正面視点不可)

目次に戻る


【Papyrus.psc】シリーズリスト

補足:私はスクリプトを書くのは好きですが、専門家ではありません。内容は creationkit.com の情報と個人的な経験を基にして書いています。どうかご参考程度にご覧ください。


2 件のコメント:

  1. 初めまして。narekonekoと申します。
    今スクリプトを使ったMODを制作中で、アニメーション取らせるのにこのページが大変役に立ってます。記事を書いてくださってありがとうございます!

    返信削除
    返信
    1. narekonekoさん初めまして!
      お役に立ててすごく嬉しいです。今となっては載せているスクリプトも書き直したい部分がありますが、それでもこうして見て頂けるのはありがたいことだなぁと感じています。
      MOD拝見しました。料理人を連れていけるのは今までにない新しい視点でとても良いと思います。お互いにMOD作成を楽しみましょう!

      削除

注: コメントを投稿できるのは、このブログのメンバーだけです。