物を地面に置きたい

Modを作ろう

物を地面に置く方法を解説します。

物を地面に置くのは、以下のコードになります。

745 (papyrus)

MiscObject Property Gold001 Auto ; CKで紐づけしておくこと

Function PutGold()
    Actor kPlayerRef = Game.GetPlayer()
    ObjectReference kGoldRef = kPlayerRef.PlaceAtMe(Gold001)
    Debug.Trace("placed object reference is " + kGoldRef)
EndFunction

このPutGold関数を実行すると、プレイヤーの足元にゴールドが1枚落っこちます。これがうまくいくのは、ゴールドに正しいメッシュが設定されており、そのメッシュは正しいコリジョン(衝突判定)を持っており、物理演算によって地面に着地するからです。

では、ベッドロールを同じように置くとどうなるでしょうか。ベッドロールは重力にしたがって落下しないので、地面の傾斜と合わなかったり、何かにめり込んだり、宙に浮いたりします。

なぜ落下しないのかは私の勉強不足でわかりませんが、位置がおかしいのは何とかしたいです。そこで、何とかする方法を考えました。まず、最初にゴールドを落とし、動きが落ち着くまで待ちます。次に、ゴールドとベッドロールを入れ替えます。これで、おおむね正しい位置にベッドロールが出現します。

地面に物を置くサンプル (papyrus)

MiscObject Property Gold001 Auto ; CKで紐づけしておくこと
Furniture Property Bedroll Auto ; CKで紐づけておくこと

Function PutChest()
    Actor kPlayerRef = Game.GetPlayer()
    Float fAngleZ = kPlayerRef.GetAngleZ()

    ; Disableで作ると姿が見えない
    ObjectReference kGoldRef = kPlayerRef.PlaceAtMe(Gold001, , abInitiallyDisabled = true)

    ; プレイヤーの目の前に持ってくる
    kGoldRef.MoveTo(kPlayerRef, 80.0 * Math.Sin(fAngleZ), 80.0 * Math.Cos(fAngleZ), 20.0, abMatchRotation = false)

    ; 間違って拾ってしまわないようにアクティベートを禁止する
    kGoldRef.BlockActivation()

    ; 3Dを待つ
    kGoldRef.Enable()
    Utility.Wait(0.5)

    ; 上に向かってわずかに力を加える(すると落下しはじめる)
    kGoldRef.ApplyHavokImpulse(0.0, 0.0, 1.0, 0.1)

    ; 地面に着地して安定するまで待つ
    Utility.Wait(2.0)

    ; ベッドロールを用意する
    ObjectReference kBedrollRef = kPlayerRef.PlaceAtMe(Bedroll, abInitiallyDisabled = true)

    ; コインの位置に持ってくる
    kBedrollRef.MoveTo(kGoldRef)

    ; コインはもういらない
    kGoldRef.Delete()

    ; ベッドロールを表示する
    kBedrollRef.Enable()
EndFunction

ベッドロールの位置は正しくなります。ですが、ゴールドが見えるのは変なので何とかしたいです。チャリーンという音もおかしいです。

メッシュをNifScopeで開き、Alphaを0にします。0 BSFadeNode、6 BSTriShape、8 BSLightingShaderPropertyです。これで、プレーサーの見た目が透明になります。

Scaleを5くらいにしておくといいみたいです。小さいと床に着地したときにきちんと接地しない場合が増えます。PapyrusでSetScaleしても見た目だけがかわり、コリジョン(当たり判定)は小さくならないみたいです。

コリジョンのノードにHavokの設定が色々あります。0 BSFadeNode、5 bhkCollisionObject、4 bhkRigidBodyです。

項目名意味書式
Mass重さ100100軽いとコロコロ転がるようです。
1000にすると動き続けてダメでした。
Liner Damping移動の減衰1.00~1
Angular Damping回転の減衰1.00~1
Max Liner Velocity最大移動速度10遅いと着地までに時間がかかりすぎます。
Max Angular Velocity最大回転速度10

このあたりはHDT-SMPの設定と同じだと思います。

音がよくわからないのですが、おそらくはMaterialで決まるのだと思われます。0 BSFadeNode、5 bhkCollisionObject、4 bhkRigidBody、3 bhkConvexVerticesShapeです。SKY_HAV_MAT_MATERIAL_COINになっていると思います。SKY_HAV_MAT_UNKNOWN_4239621792にすると無音になるようです。

この仕組みを応用したのがQuick Bedrollのベッドロール設置やEnemy Equipmentの宝箱設置になります。

タイトルとURLをコピーしました