2018年7月1日

【Papyrus.psc】オブジェクトに付けたスクリプトの関数やプロパティを呼び出して使う方法

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

あるオブジェクト等のスクリプトから、別のオブジェクトに付けたスクリプトの Function を呼び出したり、プロパティの値を取得・変更したりする方法です。


目次

  1. 別のスクリプトの Function を呼び出す
  2. Function に引数を付ける
  3. 別のスクリプトのプロパティを操作する

1. 別のスクリプトの Function を呼び出す

1-1. 呼び出し先の「実行スクリプト」

まず、最終的に実行される呼び出しのスクリプトを作成します。ここでは「実行スクリプト」と呼ぶことにします。
これに対して、呼び出しのスクリプトを「呼び出しスクリプト」と呼ぶことにします。
呼び出しスクリプトから指示して、実行スクリプトに書いた処理を実行してみます。

アクティベーターの中から「WETempActivator」を配置します。今回はドラゴンズリーチの2階を借りました。

付けるスクリプトの内容は以下のようにします。

Scriptname EkaRun extends ObjectReference

Function MessageShow()
    Debug.MessageBox("Run!")
EndFunction

Function ~ EndFunction で囲むと、関数を作れます。関数を作るというと大層なことに聞こえますが、作業を一括でまとめておいて、別の所から呼び出して使うものです。
Function に続く「MessageShow()」の部分が関数の名前になります。
このスクリプトでは Event を定義していませんので、配置したものをアクティベートしても何も起こりません。

スクリプトの名前「EkaRun」はあとで使いますので重要です。このスクリプトをコンパイルすると「EkaRun.pex」というファイルがscriptsフォルダに作成されますが、このファイルを次の呼び出しスクリプトで指定するため、先に実行スクリプトを作成しておく必要があります。

1-2. 呼び出し元の「呼び出しスクリプト」

次に呼び出し元として別のアクティベーターを設置します。「MetalLever01」を右側に配置し、以下のようなスクリプトを付けます。

Scriptname EkaCall extends ObjectReference

ObjectReference Property objTempActivator Auto

Event OnActivate(ObjectReference akActionRef)
    EkaRun scrRun = objTempActivator as EkaRun ; 実行スクリプトを変数scrRunに格納
    scrRun.MessageShow() ; 実行スクリプトの関数を呼び出す
EndEvent

objTempActivator プロパティには、先ほど設置した左側の「WETempActivator」を指定します。

スクリプトの中で EkaRun scrRun = objTempActivator as EkaRun は、

[実行スクリプト名] [任意の変数名] = [実行スクリプトのオブジェクト] as [実行スクリプト名]

という記述になっていて、これでオブジェクトに付いた実行スクリプトを変数に格納して取り扱うことができるようになります。
もしこのとき「EkaRun.pex」が存在していないと、この呼び出しスクリプトをコンパイルすることはできません。

ゲーム内でレバーをアクティベートすると、objTempActivator に付けた EkaRun というスクリプトの MessageShow() 関数が呼び出され、メッセージが出ます。

目次に戻る


2. Function に引数を付ける

2-1. 引数の設定

実行スクリプトの関数 MessageShow() には括弧が付いています。この中に引数(ひきすう)というものを設定することができ、関数を呼び出す際に任意の値を渡すことができます。
言葉ではわかりにくいので、実際に設定してみましょう。実行スクリプトを以下のように書き換えます。

Scriptname EkaRun extends ObjectReference

Function MessageShow(String asName)
    Debug.MessageBox(asName)
EndFunction

括弧の中で「String asName」という文字列型の引数を設定しました。
これをメッセージボックスの表示文字列として使っています。実行スクリプト内ではasNameに何も代入していません。呼び出しスクリプトの方からこの値を指定していきます。

2-2. 引数を付けて実行スクリプトを呼び出す

呼び出しスクリプトは次のように書き換えます。scrRun.MessageShow() の括弧内に、String型の引数を指定します。

Scriptname EkaCall extends ObjectReference

ObjectReference Property objTempActivator Auto

Event OnActivate(ObjectReference akActionRef)
    String strName = akActionRef.GetBaseObject().GetName() ; String型の変数に名前を格納

    EkaRun scrRun = objTempActivator as EkaRun
    scrRun.MessageShow(strName) ; 実行スクリプトの関数を引数付きで呼び出す
EndEvent

レバーをアクティベートした人の名前が引数として実行スクリプトに渡され、メッセージボックスに表示されます。

2-3. 引数の命名法

引数の命名法は、creationkit.com の Function Reference ページ、Notesに出ています。
原則として「接頭語+任意の引数名」となっていて、接頭語は以下のものを組み合わせます。

  • a : Argument
  • b : Bool
  • f : Float
  • i : Int
  • p : Pointer
  • s : String
  • k : Form/Alias
  • u : Unsigned

通常は次のような記述で引数を設定して使うこととなります。[Name]は任意の引数名です。

  • Float af[Name]
  • ObjectReference ak[Name]
  • String as[Name]

もし複数の引数を設定したい場合は、括弧内にカンマ「,」で区切って記述します。

目次に戻る


3. 別のスクリプトのプロパティを操作する

3-1. 実行スクリプトにプロパティを設定する

実行スクリプトにプロパティを設定し、それを呼び出しスクリプトから操作してみます。
String型のプロパティを新たに設定し、それをメッセージで表示するようにします。今度は引数を使いません。

Scriptname EkaRun extends ObjectReference

String Property strProperty Auto ; 文字列型プロパティ

Function MessageShow() ; 引数なし
    Debug.MessageBox(strProperty)
EndFunction

このプロパティの値を、呼び出しスクリプトから指定してみましょう。

3-2. 呼び出しスクリプトから実行スクリプトのプロパティを取得・変更する

呼び出しスクリプトは次のようにします。

Scriptname EkaCall extends ObjectReference

ObjectReference Property objTempActivator Auto

Event OnActivate(ObjectReference akActionRef)
    EkaRun scrRun = objTempActivator as EkaRun

    ; 実行スクリプトのstrPropertyプロパティに名前を格納
    scrRun.strProperty = akActionRef.GetBaseObject().GetName()

    scrRun.MessageShow()
EndEvent

scrRun として実行スクリプトを扱えるようになっていますので、「scrRun.strProperty」とすれば実行スクリプトのプロパティを扱えるようになります。
ここでも「strProperty」というプロパティを実行スクリプトにあらかじめ作成しておかないと、呼び出しスクリプトをコンパイルできません。

プロパティにアクティベートした人の名前を直接入れて、MessageShow() というFunctionを呼び出しています。引数の場合と同様、名前がメッセージボックスで表示されます。

今回はメッセージの表示だけでお示ししましたが、呼び出しスクリプトをアクティベーターや魔法にそれぞれ付けて同一の実行スクリプトを扱うなどの設定をすることで、プレイヤーの操作に応じた柔軟な対応が可能になります。

もちろんFunctionを同じスクリプト内から呼び出すこともできます。そのときは関数名と括弧だけ書けばOKです。良くやるのは終了処理をまとめておく使い方ですね。

Functionはいつか書きたいと思っていたので使い方の一部をまとめてみましたが、頭がこんがらがりそうになりますね。
ただ、このFunctionはスクリプトを扱う人なら知らないうちに良く使っている機能です。
例えば「Utility.Wait()」なら、「Utility.pex」というスクリプトファイルの「Wait()」というFunctionを呼び出しています。「Game.GetPlayer()」も同様。

今回、最も大事なのは

[実行スクリプト名] [任意の変数名] = [実行スクリプトのオブジェクト] as [実行スクリプト名]

の書き方でしょう。他のスクリプトを操作できると、やれることの幅が大きく広がります。

目次に戻る


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

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


0 件のコメント:

コメントを投稿

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