SKSE64で動作するDLLプラグインを作ってみた

Modを作ろう

SKSE64で動作するDLLプラグインを作ってみたときのおぼえがき。

必要なもの

  • Visual Studio
  • git
  • vcpkg
  • 何かしらの開発テンプレート
  • AI

AI以外はすべて無料です。AIも無料分だけでなんとかなります。

前提環境

  • Windows 11
  • Skyrim Special Edition 1.6.1170(いわゆるAE)

参考までに、私のスキルを書いておきます。

  • Papyrusは14年の経験があり、多くのModを作ってきたので自信あり。
  • C言語の基礎は理解しているが、C++言語はよくわからず。
  • Windowsプログラミングは素人レベル。大昔にVisual Basicで遊んでみた程度。

AIについて

今回の開発にGeminiとClaudeを利用しました。以降の解説の大半はAIに教えてもらったことであり、私自身は環境構築の内容をほとんど理解できていません。コーディングに関しては理解しながら作業を進めました。

環境構築だけならそうでもないのですが、コーディングに入るとあっという間にAIの利用制限に到達してしまいますので注意が必要です。結果的にClaudeのプロプランに加入して制限を上げて開発を継続しました。無料分だけで開発するのであれば、定期的に制限解除まで待つ必要がでてきます。

Visual Studio

Windows用のアプリを開発するためのアプリです。

Visual Studio のドキュメント

執筆時点ではVisual Studio 2026になります。エディションが複数あり、条件付きですが無料で使えるCommunityエディションで大丈夫です。

まずはインストーラーである VisualStudioSetup.exe をダウンロードします。

インストーラーを起動するとVisual Studioのダウンロードとインストールが始まります。インストーラーは後から必要になるので残しておきます。

左側のC++によるデスクトップ開発にチェックをいれます。

右側の下の方にあるWindows 11 SDKMSVC v143 VS 2022 C++にチェックを入れます。上の方にあるWindows用 C++ CMakeツールにもチェックが入っていることを確認します。

インストール直後はWindows Updateが裏で実行されてPCがかなり重くなるので覚悟しておきます。

開発手法がいくつかあるようなのですが、今回はCMakeになります。覚えておきます。

git

gitはパッケージ管理ツールです。

Git

簡単に言うと、githubで公開されているオープンソースのアプリを全自動でダウンロードしたりアップデートしたりできるツールです。手動で管理などやっていられないので、これが必要になります。

右側にあるInstall for Windowsをクリックして、次の画面でClick here to downloadをクリックしてダウンロード、インストールします。

ターミナルを開いて git --version を実行して、バージョンが表示されたら成功です。

vcpkg

Visual Studioで利用できるモジュールを管理するツールです。

vcpkg の概要

下の方に Visual Studio の CMake でパッケージをインストールして使用する があるのでクリックします。

早速、gitを用いた導入手順が解説されているので、手順に従ってインストールを行います。

これ以降は、以下のフォルダで作業することを前提に解説します。各自の環境に合わせて置き換えてください。

E:\GAMES\Modding

上記フォルダを作成したらエクスプローラーで開き、右クリックしてターミナルで開くが簡単だと思います。

あとは手順に従いコマンドを実行します。

git clone https://github.com/microsoft/vcpkg.git
cd vcpkg; .\bootstrap-vcpkg.bat

環境変数を設定する必要があるのですが、これは慣れていないと難しいかもしれません。

スタートメニューを開き、検索のところに環境変数と入力すれば、自動的に環境変数を編集が出てくるので、開きます。

頑張って VCPKG_ROOT という変数を追加します。値は環境に合わせてください。

この後も手順がありますが、とりあえずここまでです。

開発テンプレート

ここからはVisual Stduioを起動してプロジェクトを新規作成し、開発を行っていきます。

とはいえ、まったくのゼロから作るのは大変なので、有志が公開してくれているテンプレートを用いて楽をします。

この段階ではGeminiに聞きながら作業を進めていたのですが、Geminiは微妙に古いURLばかり提示してくるので、自分で探す必要がありました。

今回使用したテンプレートは以下になります。

https://github.com/Monitor221hz/CommonLibSSE-NG-Template-Plugin

まずは E:\GAMES\Modding でターミナルを開きます。

以下のコマンドでテンプレートを取得します。

git clone --recursive https://github.com/Monitor221hz/CommonLibSSE-NG-Template-Plugin MyFirstSKSEPlugin

このコマンドでは MyFirstSKSEPlugin というフォルダにダウンロードするようにしています。

フルパスだと以下になります。

E:\GAMES\Modding\MyFirstSKSEPlugin

ターミナルで MyFirstSKSEPlugin に移動したら、次のコマンドを実行します。

git submodule update --init --recursive

Visual Stduioでビルドする

Visual Studioを起動します。フォルダを開くを選び、E:\GAMES\Modding\MyFirstSKSEPlugin を開きます。

作業は大きくわけて2つに分かれます。1つ目はCMake、2つ目はビルドです。

ここからが非常に大変です。最初からすんなりとはいかず、ひたすらエラーをGeminiに伝えては解決策を教えてもらうというやりとりを何度も続けて、何とかビルドに成功しました。そもそもVisual Studioでフォルダを開くと勝手にCMakeを始めるらしく、エラーが出まくって最初は何が起こっているのか意味不明でした。私はまったく理解できていません。頑張ってください。

覚えたことは以下の通りです。

CMakeの段階でvcpkg(gitも?)を用いた自動セットアップが行われます。ハッシュ値が合わないというエラーでダウンロードに失敗することがあるので、手動でなんとかします。

ログが以下の場所にできるので、Geminiに渡して見てもらいます。(以下はDebug構成の場合)

E:\GAMES\Modding\MyFirstSKSEPlugin\build\debug-msvc\vcpkg-manifest-install.log

文字化けしているのですが、直し方がわかりませんでした。コントロールパネルの地域を開き、管理タブでUTF-8がなんたらかんたら(ベータ)にチェックを入れてPC再起動でなおりました。

Visual Studioはビルトの構成を選べます。最初はDebug構成になっているはずなので、これをRelease構成にすると成功率があがります。

ビルドすると E:\GAMES\Modding\MyFirstSKSEPlugin\build にファイルができます。これを削除すればビルドを最初からやりなおせます。

CommonLibSSE-NGはVisual Studio 2022用なので、Visual Studio 2026とは互換性がないためエラーが出るようです。そこでVisual Studio 2022互換モード的なものを強制する必要があるようです。Visual Studioのインストール時にMSVC v143 VS 2022 C++を選んだのはこのためです。CMakePresets.json に記述する必要があります。

CMakeLists.txt にて、生成されるDLLファイル名を指定している箇所があるので、自分の好きなファイル名に変更します。

MyFirstSKSEPlugin

メインとなるコードを記述するのは以下のファイルです。

E:\GAMES\Modding\MyFirstSKSEPlugin\src\plugin.cpp

今回作ったもの

ここからは開発日記のようなものになります。

カメラの制御を行うSKSEプラグイン(DLL)を作成しました。拙作のCamera Tweaksに機能を追加する目的です。カメラをプレイヤーの頭に追従させて、3人称視点のまま疑似的に1人称視点を実現します。

これを行うModは以前から存在し、現在はImproved Camera SEが主流だと思いますが、内部的に1人称視点にしたうえで3人称視点のモデルを強引に表示させているようです。なので3人称視点のアニメーションが正常に再生されません。具体的には以下のような問題があります。

  • MCOがまったく動作しません。
  • Eating Animations and Sounds SEが、アニメーションはするのですが、食べ物が表示されません。
  • HDT-SMPが高負荷になり、ゲームになりません。おそらくウィッグ等の頭部のあたりにコリジョンがある装備をしていると顕著になります。
  • Skyrim’s Paragliderがまったく動作しません。

3人称視点のままカメラを頭のあたりに持ってくると、上記の問題がすべて解決することはわかっています。ですが、Papyrusの場合、バニラに存在するカメラの設定を変更するのが関の山であり、プレイヤーの頭にカメラを追従させるといった高度なことはできません。そこでDLLの出番という訳です。

Geminiに聞いた結果

Geminiは広くそこそこ深い物知りおじさんという印象で、割と人間的な反応をしてくれます。環境のセットアップと簡単なDLLの作成までは何とかたどり着けましたが、結局のところ完成しませんでした。

Geminiに聞くときは、AEであることを強調した方がいいかもしれません。そうしないとSE前提のコードコードを提示してくるのでうまく動きません。

それから、Geminiは結構簡単にわかる嘘がまざります。無料プランだとあまり深く思考してくれないのかもしれません。

コードの設計は以下の通りです。

  • SKSE64のイベントを受け取り、イベントにフックする。
  • プレイヤーの頭のノードを検知し、カメラを移動させる。これを毎フレーム行う。
  • カメラに近すぎるShapeは透明化して消えてしまうので、透明化する距離の設定(fNearDistance)をカメラの角度に応じて動的に変更する。
  • PapyrusのAPIを用意して、Papyrusから制御できるようにする。主に機能のオン・オフを実現する。

重要なのは自前の処理をどのように実行するかです。いくつか候補があるようです。

SKSE64にはタスク管理の機能があるらしく、おそらくPapyrusでいうところのRegisterForSingleUpdateでクルクル回す処理に近いものだと思います。これを使うと簡単にフリーズするので、今回のような毎フレーム何かをしたいケースでは使わない方がいいようです。

ゲームエンジンが内部で処理しているところにフックして、自前の処理を割り込ませるのがいいようです。

  • PlayerCharacter::Update
  • Camera::Update
  • ThirdPersonState::Update

Geminiとやりとりをしている内に、既存のModを参考にすることを思いついたので、Geminiに提案したところ、Improved Cameraのフック周りのコードから、ようやくフックの対象が決まりました。

その後も試行錯誤を続けた結果、コンソールを開いている時だけカメラを制御できているときもある、という状況から抜け出せまでんした。

どうやら実装がループしているらしく、

  • Aでどうでしょう
  • ダメですか、ならBにしましょう
  • まだダメですか、最後の手段でCにします
  • ダメですか、ならAにしましょう
  • (以下無限ループ)

最初はループしていることにすら気が付けず、かなり時間を無駄にしました。埒が明かないので、ここでClaudeに切り替えることにしました。

Claudeに聞いた結果

Claudeは専門家という印象で、論理的に回答してくれます。その分感情が薄く、こちらがお礼を言ってもスルーします。

まずは概要を伝えた上で、Geminiに書かせたコードの最終系を渡し、問題を修正するよう依頼してみました。

Geminiにも言えることですが、AIはいきなりゴールにたどり着けるのではなく、人間と一緒にゴールに向かって少しずつ進んでいくという感じです。

Claudeはコードから何がしたいのかを理解し、問題点を洗い出して、解決策を自分で調べ、改善したコードを渡してきました。

Claudeが言うには、Geminiの方向性は正しいが、肝心のフックの手法やカメラの制御に問題があると指摘してきました。個々の手法の何が問題なのかも説明してくれて、Claudeがネットを検索する際はロボットなので限界があることも教えてくれました。手元のコードの一部を渡すことでClaudeの理解が深まり、そのうちにGeminiがSE前提でコードを書いていたことを見抜き、SE/AE両対応のコードを出してくれて、ようやく前に進めました。

それでも途中で利用量の上限に達したので、プロプランに加入しました。

若干問題が残っているものの、概ねやりたかったことを実装したDLLが完成しました。

結局のところ、AIってどうなのか

開発効率が段違いです。AIはどんなに初歩的なことでも嫌な顔一つせずに、すぐさまその場で回答してくれるので、自分でネットを探し回ったり、質問に答えてくれる場所や人を探す必要もありません。開発工程が次々に進んでいくのでモチベーションも維持しやすいと思います。

ですが、AIにも限界があり、何でもできるわけではありません。実装に関しては先人達のコードを参照するのが早道です。特にフックの手法はリバースエンジニアリング等で解析した結果が使われており、自力で見つけ出すのはAIの助けを借りても困難です。

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