「Papyrus関数追加サンプル」の編集履歴(バックアップ)一覧はこちら

Papyrus関数追加サンプル」(2018/02/07 (水) 18:44:51) の最新版変更点

追加された行は緑色になります。

削除された行は赤色になります。

#contents -サンプル:&ref(ExampleAddFunctionBySKSE.zip)(動かし方は中にある readme.txt を参照のこと) *目的 SKSE プラグインによって Papyrus で使える関数を追加する''最小サンプル''を提供することが目的です。 関数の追加方法を覚えることで、適宜、用途・要求速度などの状況に応じて Papyrus と C/C++ とを組み合わせてスクリプトが書けるようになります。 *前提 [[SKSEプラグイン開発環境構築手順]]にて、skse 本体のコンパイルができる状態にあることが前提となります。 プラグインのサンプルプロジェクトである samplePlugin を元に Papyrus 関数を追加するよう書き換えます。 *手順概要 まずは作業手順についてですが、以下の手順を踏みます。 +CK を使って追加する関数を Papyrus スクリプトで定義し、psc/pex ファイルを用意する。 +プロジェクトを準備する。 +追加関数を実装する。 +追加関数を Papyrus 関数として使えるよう登録する実装を追加する。 +dll をビルドし、配置する。 +skse_loader.exe で Skyrim を起動する。 細かく1つ1つ順を追って説明していきます。 *手順詳細 **psc/pex ファイルの準備 CK を起動し、メニューから [Gameplay]→[Papyrus Script Manager]を開きます。 開いたら、Papyrus Managerのリスト上で右クリックし、[New...]を選択して新しいスクリプトを作成します。 #ref(create_psc.png); サンプルプラグインの名前は「Calculator」とします。また、Sum 関数は v1 と v2 の値を足した値を返すこととします。要はよくある計算機の例です。 以下、ソースの事例です。 Scriptname Calculator int Function Sum(int v1, int v2) global native ポイントは、 -''native'' と書いてあること。 -関数本体が無いこと。 です。 必要最小限ということで今回は未 extends/global の関数を事例に挙げますが、extends/global 以外の関数も定義可能です。 このソースを保存すると普通にコンパイルでき、pex ファイルが作成されるので「Skyrim\Data\Scripts」フォルダを確認してみて下さい。psc ファイルは「Skyrim\Data\Scripts\Source」フォルダにあります。 **プロジェクトの準備 ***dll ファイル名の変更 samplePlugin プロジェクトを活用しますが、そのままビルドするとできあがるプラグイン dll ファイルが samplePlugin.dll になってしまいます。 独自の名称の dll ファイルを作成するため「ソリューションエクスプローラ」で「samplePlugin」プロジェクトを選択し、F2 キーを押してプロジェクトの名称を変更してください。 ここでは「Calculator」とします。 #ref(rename_project_name.png); すると「Calculator.dll」が生成されるようになります。 また、dll作成時に「プロジェクトとライブラリの名前が違う」と警告が出るので、exports.defも編集します。 (編集前) LIBRARY "samplePlugin" EXPORTS SKSEPlugin_Query SKSEPlugin_Load (編集後) LIBRARY "Calculator" EXPORTS SKSEPlugin_Query SKSEPlugin_Load ※ プロジェクトファイル名自体は「samplePlugin.vcproj」のままですが気にしないことにします。 ***skse プロジェクトの機能を拝借 skse プロジェクトの機能を使うため依存関係を作って、機能を使えるようにします。 以下、手順です。 +「ソリューションエクスプローラ」で「skse」プロジェクトを右クリックし「プロパティ」を選択する。 +「構成プロパティ - 全般」タブの「構成の種類」を「スタティック ライブラリ(.lib)」に変更する。 +「ソリューションエクスプローラ」で「Calculator」プロジェクトを右クリックし「プロジェクト依存関係」を選択する。 +「skse」プロジェクトにチェックを入れる。 **追加関数の実装 以下に追加する Add 関数の例を示します。 // SInt32 や StaticFunctionTag などを使うために必要になる。 #include "skse/PapyrusNativeFunctions.h" // ... 省略 ... SInt32 Sum(StaticFunctionTag* self, SInt32 v1, SInt32 v2) { return v1 + v2; } Calculator.psc と比較してみてください。ポイントは以下の通りです。 -skse/PapyrusNativeFunctions.h をインクルードしている。 -int には SInt32 を使う。 -第一引数に self を追加する(global の場合は StaticFunctionTag*)。 -関数の中身をしっかりと実装する。 **Papyrus 関数として使えるよう登録する実装 SKSE プラグインには以下の2つの関数を必ず実装する必要があります。 |役割|シグネチャ| |SKSE プラグインの導入可否判断|bool SKSEPlugin_Query(const SKSEInterface * skse, PluginInfo * info)| |SKSE プラグインの初期化|bool SKSEPlugin_Load(const SKSEInterface * skse)| SKSEPlugin_Load 関数にて追加関数を Papyrus 関数として使えるよう登録します。 重要な部分のみ抜粋します。 bool RegisterScaleform(GFxMovieView * view, GFxValue * root) { VMClassRegistry* registry = (*g_skyrimVM)->GetClassRegistry(); // Calculator.Sum 関数を登録 registry->RegisterFunction( new NativeFunction2<StaticFunctionTag, SInt32, SInt32, SInt32>("Sum", "Calculator", Sum, registry)); return true; } extern "C" { // ... SKSEPlugin_Query 省略 ... bool SKSEPlugin_Load(const SKSEInterface * skse) { _MESSAGE("load"); // register scaleform callbacks // Scaleformコールバックを登録する。登録に成功するとtrueを返す。 // 登録名が既に使用済みの場合は登録失敗になるので、ユニークな名前で登録すること。 g_scaleform->Register("Calculator", RegisterScaleform); return true; } }; SKSEPlugin_Load は、SKSE によって呼び出されるSKSE プラグインの初期化関数です。ここで RegisterScaleform 関数を登録しています。 RegisterScaleform 関数が Sum 関数を Papyrus 関数として使えるよう登録する実装です。 NativeFunctionX の X は引数の数によって 0 ~ 9 まで使えます。<> の中および引数は以下の通りです。 |<> の1番目|親クラス。グローバル関数の場合は、親クラスにStaticFunctionTagを指定。| |<> の2番目|戻り値の型。| |<> の3番目以降|引数の型を順番に。| |引数の1番目|関数名| |引数の2番目|クラス名| |引数の3番目|関数ポインタ| |引数の4番目|VMCrassRegistry*| 本サンプルでは1つだけの追加ですが、いくつでも追加できます。 **ビルドとできた dll の配置 ビルドすると以下のフォルダに「Calculator.dll」ができあがります。 -skse_X_XX_XX/src/skse/Release 「Calculator.dll」を以下のフォルダにコピーすれば関数の追加は完成です。 -Skyrim/Data/SKSE/Plugins CK 内の Papyrus スクリプトで Calculator.Sum 関数が使えるようになっています。
#contents -サンプル:&ref(ExampleAddFunctionBySKSE.zip)(動かし方は中にある readme.txt を参照のこと) *目的 SKSE プラグインによって Papyrus で使える関数を追加する''最小サンプル''を提供することが目的です。 関数の追加方法を覚えることで、適宜、用途・要求速度などの状況に応じて Papyrus と C/C++ とを組み合わせてスクリプトが書けるようになります。 *前提 [[SKSE64プラグイン開発環境構築手順]]にて、skse 本体のコンパイルができる状態にあることが前提となります。 プラグインのサンプルプロジェクトである samplePlugin を元に Papyrus 関数を追加するよう書き換えます。 *手順概要 まずは作業手順についてですが、以下の手順を踏みます。 +CK を使って追加する関数を Papyrus スクリプトで定義し、psc/pex ファイルを用意する。 +プロジェクトを準備する。 +追加関数を実装する。 +追加関数を Papyrus 関数として使えるよう登録する実装を追加する。 +dll をビルドし、配置する。 +skse_loader.exe で Skyrim を起動する。 細かく1つ1つ順を追って説明していきます。 *手順詳細 **psc/pex ファイルの準備 CK を起動し、メニューから [Gameplay]→[Papyrus Script Manager]を開きます。 開いたら、Papyrus Managerのリスト上で右クリックし、[New...]を選択して新しいスクリプトを作成します。 #ref(create_psc.png); サンプルプラグインの名前は「Calculator」とします。また、Sum 関数は v1 と v2 の値を足した値を返すこととします。要はよくある計算機の例です。 以下、ソースの事例です。 Scriptname Calculator int Function Sum(int v1, int v2) global native ポイントは、 -''native'' と書いてあること。 -関数本体が無いこと。 です。 必要最小限ということで今回は未 extends/global の関数を事例に挙げますが、extends/global 以外の関数も定義可能です。 このソースを保存すると普通にコンパイルでき、pex ファイルが作成されるので「Skyrim\Data\Scripts」フォルダを確認してみて下さい。psc ファイルは「Skyrim\Data\Scripts\Source」フォルダにあります。 **プロジェクトの準備 ***dll ファイル名の変更 samplePlugin プロジェクトを活用しますが、そのままビルドするとできあがるプラグイン dll ファイルが samplePlugin.dll になってしまいます。 独自の名称の dll ファイルを作成するため「ソリューションエクスプローラ」で「samplePlugin」プロジェクトを選択し、F2 キーを押してプロジェクトの名称を変更してください。 ここでは「Calculator」とします。 #ref(rename_project_name.png); すると「Calculator.dll」が生成されるようになります。 また、dll作成時に「プロジェクトとライブラリの名前が違う」と警告が出るので、exports.defも編集します。 (編集前) LIBRARY "samplePlugin" EXPORTS SKSEPlugin_Query SKSEPlugin_Load (編集後) LIBRARY "Calculator" EXPORTS SKSEPlugin_Query SKSEPlugin_Load ※ プロジェクトファイル名自体は「samplePlugin.vcproj」のままですが気にしないことにします。 ***skse プロジェクトの機能を拝借 skse プロジェクトの機能を使うため依存関係を作って、機能を使えるようにします。 以下、手順です。 +「ソリューションエクスプローラ」で「skse」プロジェクトを右クリックし「プロパティ」を選択する。 +「構成プロパティ - 全般」タブの「構成の種類」を「スタティック ライブラリ(.lib)」に変更する。 +「ソリューションエクスプローラ」で「Calculator」プロジェクトを右クリックし「プロジェクト依存関係」を選択する。 +「skse」プロジェクトにチェックを入れる。 **追加関数の実装 以下に追加する Add 関数の例を示します。 // SInt32 や StaticFunctionTag などを使うために必要になる。 #include "skse/PapyrusNativeFunctions.h" // ... 省略 ... SInt32 Sum(StaticFunctionTag* self, SInt32 v1, SInt32 v2) { return v1 + v2; } Calculator.psc と比較してみてください。ポイントは以下の通りです。 -skse/PapyrusNativeFunctions.h をインクルードしている。 -int には SInt32 を使う。 -第一引数に self を追加する(global の場合は StaticFunctionTag*)。 -関数の中身をしっかりと実装する。 **Papyrus 関数として使えるよう登録する実装 SKSE プラグインには以下の2つの関数を必ず実装する必要があります。 |役割|シグネチャ| |SKSE プラグインの導入可否判断|bool SKSEPlugin_Query(const SKSEInterface * skse, PluginInfo * info)| |SKSE プラグインの初期化|bool SKSEPlugin_Load(const SKSEInterface * skse)| SKSEPlugin_Load 関数にて追加関数を Papyrus 関数として使えるよう登録します。 重要な部分のみ抜粋します。 bool RegisterScaleform(GFxMovieView * view, GFxValue * root) { VMClassRegistry* registry = (*g_skyrimVM)->GetClassRegistry(); // Calculator.Sum 関数を登録 registry->RegisterFunction( new NativeFunction2<StaticFunctionTag, SInt32, SInt32, SInt32>("Sum", "Calculator", Sum, registry)); return true; } extern "C" { // ... SKSEPlugin_Query 省略 ... bool SKSEPlugin_Load(const SKSEInterface * skse) { _MESSAGE("load"); // register scaleform callbacks // Scaleformコールバックを登録する。登録に成功するとtrueを返す。 // 登録名が既に使用済みの場合は登録失敗になるので、ユニークな名前で登録すること。 g_scaleform->Register("Calculator", RegisterScaleform); return true; } }; SKSEPlugin_Load は、SKSE によって呼び出されるSKSE プラグインの初期化関数です。ここで RegisterScaleform 関数を登録しています。 RegisterScaleform 関数が Sum 関数を Papyrus 関数として使えるよう登録する実装です。 NativeFunctionX の X は引数の数によって 0 ~ 9 まで使えます。<> の中および引数は以下の通りです。 |<> の1番目|親クラス。グローバル関数の場合は、親クラスにStaticFunctionTagを指定。| |<> の2番目|戻り値の型。| |<> の3番目以降|引数の型を順番に。| |引数の1番目|関数名| |引数の2番目|クラス名| |引数の3番目|関数ポインタ| |引数の4番目|VMCrassRegistry*| 本サンプルでは1つだけの追加ですが、いくつでも追加できます。 **ビルドとできた dll の配置 ビルドすると以下のフォルダに「Calculator.dll」ができあがります。 -skse_X_XX_XX/src/skse/Release 「Calculator.dll」を以下のフォルダにコピーすれば関数の追加は完成です。 -Skyrim/Data/SKSE/Plugins CK 内の Papyrus スクリプトで Calculator.Sum 関数が使えるようになっています。

表示オプション

横に並べて表示:
変化行の前後のみ表示:
目安箱バナー