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用スクリプトに置いてあるので、間接的に呼び出します。