SkyrimMOD作成wiki

Papyrus関数追加サンプル

最終更新:

towawot

- view
だれでも歓迎! 編集

目的

SKSE プラグインによって Papyrus で使える関数を追加する最小サンプルを提供することが目的です。

関数の追加方法を覚えることで、適宜、用途・要求速度などの状況に応じて Papyrus と C/C++ とを組み合わせてスクリプトが書けるようになります。

前提

SKSE64プラグイン開発環境構築手順にて、skse 本体のコンパイルができる状態にあることが前提となります。

プラグインのサンプルプロジェクトである samplePlugin を元に Papyrus 関数を追加するよう書き換えます。

手順概要

まずは作業手順についてですが、以下の手順を踏みます。

  1. CK を使って追加する関数を Papyrus スクリプトで定義し、psc/pex ファイルを用意する。
  2. プロジェクトを準備する。
  3. 追加関数を実装する。
  4. 追加関数を Papyrus 関数として使えるよう登録する実装を追加する。
  5. dll をビルドし、配置する。
  6. skse_loader.exe で Skyrim を起動する。

細かく1つ1つ順を追って説明していきます。

手順詳細

psc/pex ファイルの準備

CK を起動し、メニューから [Gameplay]→[Papyrus Script Manager]を開きます。

開いたら、Papyrus Managerのリスト上で右クリックし、[New...]を選択して新しいスクリプトを作成します。

サンプルプラグインの名前は「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」とします。

すると「Calculator.dll」が生成されるようになります。

また、dll作成時に「プロジェクトとライブラリの名前が違う」と警告が出るので、exports.defも編集します。

(編集前)

LIBRARY	"samplePlugin"
EXPORTS
SKSEPlugin_Query
SKSEPlugin_Load

(編集後)

LIBRARY	"Calculator"
EXPORTS
SKSEPlugin_Query
SKSEPlugin_Load

※ プロジェクトファイル名自体は「samplePlugin.vcproj」のままですが気にしないことにします。

skse プロジェクトの機能を拝借

skse プロジェクトの機能を使うため依存関係を作って、機能を使えるようにします。

以下、手順です。

  1. 「ソリューションエクスプローラ」で「skse」プロジェクトを右クリックし「プロパティ」を選択する。
  2. 「構成プロパティ - 全般」タブの「構成の種類」を「スタティック ライブラリ(.lib)」に変更する。
  3. 「ソリューションエクスプローラ」で「Calculator」プロジェクトを右クリックし「プロジェクト依存関係」を選択する。
  4. 「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 関数が使えるようになっています。

タグ:

+ タグ編集
  • タグ:

このサイトはreCAPTCHAによって保護されており、Googleの プライバシーポリシー利用規約 が適用されます。

目安箱バナー