MCMで使えるテクニック

Modを作ろう

MCMで使えるテクニックをまとめてみました。

MCMはSkyUIに搭載されているMod管理用メニューの仕組みです。あまりにも有名なので知らない人はいないと思います。メニューを作る時には色々とノウハウがあります。簡単なチュートリアルがこちらにあります。

時間のかかる処理を裏で実行する

メニューの画面を作るのはOnPageResetイベントです。この関数の内部で配置するオプション等を並べて作ります。

なかには時間のかかる処理もあります。このOnPageReset関数を抜けることで画面が描画されるようです。つまり、この関数の中で時間がかかっていると、なかなか画面が描画されないので、ユーザーからするとストレスになります。そこで、バックグラウンドで処理させてみます。

時間のかかる処理を実行するイベントを用意します。OnPageReset関数の中ではイベントを投げて関数をすぐに抜けることで、画面がすぐに描画されます。

MCM用クエストの名前 emQuestMCM
MCM用スクリプトの名前 emQuestMCMScript
バックグラウンド処理用スクリプトの名前 emQuestMCMAliasPlayerScript

MCM用スクリプトの中身です。

1027 (papyrus)

Scriptname emQuestMCMScript Extends SKI_ConfigBase

Bool IsSpellListRefreshed


Event OnConfigOpen()
    IsSpellListRefreshed = false
EndEvent


Event OnPageReset(String sPage)
    if !IsSpellListRefreshed
        SendModEvent("emRefreshSpell")
    endif

    ; ここでオプション等を配置
EndEvent


Function RefreshSpellList()
    ; ここで時間のかかる処理

    IsSpellListRefreshed = true
EndFunction

このメニュー画面では、プレイヤーが習得しているスペルをメニューから選択させて設定を行います。この時に必要なのがプレイヤーが習得しているスペルの一覧です。これを取得するのに時間がかかるわけです。

そこで、SendModEvent関数を使ってバックグラウンド処理用スクリプトに処理を依頼し、すぐにメニュー画面を作り終えてOnPageReset関数を抜けます。スペル取得の処理が終わるとIsSpellListRefreshed変数がtrueになるという仕組みです。

バックグラウンド処理用スクリプトの中身です。

1024 (papyrus)

Scriptname emQuestMCMAliasPlayerScript Extends ReferenceAlias

emQuestMCMScript Property emQuestMCM Auto


Event OnInit()
    Setup()
EndEvent


Event OnPlayerLoadGame()
    Setup()
EndEvent


Event OnRefreshSpell(string eventName, string strArg, float numArg, Form sender)
    emQuestMCM.RefreshSpellList()
EndEvent


Function Setup()
    RegisterForModEvent("emRefreshSpell", "OnRefreshSpell")
EndFunction

MCM側からの処理を受け付けられるよう、RegisterForModEvent関数を使ってイベントを設定しておきます。スペル取得の処理自体はMCM用スクリプトに置いてあるので、間接的に呼び出します。

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