2017年11月29日

【Papyrus.psc】オブジェクトを表示したり消したりする

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

レバーを倒すことで首長の椅子を出したり消したりできるようにしてみましょう。


目次

  1. レバーを配置して新規スクリプトを付ける
  2. プロパティに首長の椅子を指定する
  3. Enable() と Disable()

1. レバーを配置して新規スクリプトを付ける

首長の中ではバルグルーフさんが2番目に好きです。椅子を特別仕様にしてあげたいと思います。

Render Window でドラゴンズリーチを表示し、椅子の脇にレバーを置きます。今回はアクティベーターの中から「MetalLever01」を配置しました。

レバーには、倒すアニメーションをさせるためのスクリプトがあらかじめ付いています。緑色の矢印が付いているものがそうです。
それらのスクリプトは全くいじらず、新規に「ChairLever」というスクリプトを追加します。

ChairLever のコードは以下のようにします。

Scriptname ChairLever extends ObjectReference

ObjectReference Property objChair Auto

Event OnActivate(ObjectReference akActionRef)
    If objChair.IsDisabled() == true
        objChair.Enable()
    Else
        objChair.Disable()
    EndIf
EndEvent

スクリプトの追加は前回と同様なので問題ないでしょう。
ObjectReference Property というのが出てきましたので、まずはこれを次項で説明します。

目次に戻る


2. プロパティに首長の椅子を指定する

2-1. プロパティについて

ObjectReference Property は、プロパティを定義しています。プロパティって何?という感じですが、簡単に言えば人や物品などをスクリプト内で扱えるようにする設定です。
今回の場合は首長の椅子を扱いたいので、「椅子はこれだよ」というのをスクリプトに教えてあげるわけです。

このプロパティに設定できる項目については、プロパティ一覧表 を作成してありますのでご参考になさってください。配置された物品を扱いたい場合は、「ObjectReference」を用います。

プロパティ名の命名規則は特に無いようです。関数や他のプロパティと被らない名前を付けましょう。

2-2. プロパティの指定

では、プロパティに椅子を指定してみましょう。ChairLever スクリプトを選択して、右側の「Properties」ボタンを押します。

プロパティ画面になったら、objChair プロパティを選択して「Edit Value」を押します。

ObjectReference プロパティの場合は Render Window から指定できます。「Pick Reference in Render Window」ボタンを押すと Render Window に照準マークが出ますので、首長の椅子をダブルクリックします。

下図のようになれば成功です。プロパティに首長の椅子を指定することができました。

目次に戻る


3. Enable() と Disable()

3-1. Enable か Disable かの判定

椅子に限らず、人や物品は「Enable」または「Disable」のフラグを持っています。Enable ならゲーム内で表示され、Disable なら非表示になります。

スクリプトでこの状態を取得しているのが objChair.IsDisabled() の部分です。
「== true」なら、「椅子が非表示のとき」という意味です。

この判定には IsEnabled() という、Enable かどうかを判定する関数も使えます。
しかし、この関数は内部で IsDisabled() を使って値を返しているだけなので、原則としては IsDisabled() の方を使うようにしましょう。

3-2. Enable または Disable の指定

objChair.Enable() と書けば、椅子を Enable にすることができます。
Disable にしたいときは objChair.Disable() です。

このスクリプト制御は単純でわかりやすいのですが、指定できない例外もあるので注意が必要です。それはオブジェクトに「Enable Parent」が指定されている場合で、これについては CKで既存オブジェクトを非表示にする方法 でまとめてあります。

3-3. じわっとした表示/非表示

Enable()Disable() は、一瞬で表示/非表示を行います。パッと切り替わります。
これをじわっと行うには、Enable(true)Disable(true) と書きます。

括弧の中に入れる値は「引数(ひきすう)」と呼ばれ、この値によって関数の挙動を変化させることができます。関数がどのような引数を受け取れるのかについては、creationkit.com をご覧ください。

Enable() 関数の場合、「Bool abFadeIn = false」という引数が設定されています。これが「true」ならフェードインし、「false」ならしない、という動きになります。

Enable(true) と書くと引数に「true」を指定したことになり、フェードインしながら表示されます。
引数を省略すると初期値が用いられますので、Enable() と書くと Enable(false) と同じ意味になり、フェードインせずに表示されます。

以上を取り入れて、レバーを倒すとタイミングよく椅子がじわっと出たり消えたりするスクリプトを書くと以下のようになります。

Scriptname ChairLever extends ObjectReference

ObjectReference Property objChair Auto

Event OnActivate(ObjectReference akActionRef)
    Utility.Wait(0.8)
    If objChair.IsDisabled() == true
        objChair.Enable(true)
    Else
        objChair.Disable(true)
    EndIf
EndEvent

Utility.Wait() で、指定された秒数だけ待ちます。これでレバーが切り替わるアニメーションを待っています。アニメーションのないアクティベーターなら Wait は不要です。
待つ秒数をどれくらいにするかは、実際にテストプレイをして決めましょう。

今回はバルグルーフさんが近くにいるかどうかを判定していません。座っているときにレバーを倒せば、空気椅子状態にさせることができてしまいます。

すごい!首長たるもの、運動不足では務まりませんからね。

目次に戻る


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

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


0 件のコメント:

コメントを投稿

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