「SkyUI MCM」の編集履歴(バックアップ)一覧はこちら
「SkyUI MCM」(2017/05/15 (月) 15:04:27) の最新版変更点
追加された行は緑色になります。
削除された行は赤色になります。
*SkyUI MCMのチュートリアル
&bold(){SkyUI wiki}
https://github.com/schlangster/skyui/wiki
&bold(){Quick Start(SkyUI公式チュートリアル)}
https://github.com/schlangster/skyui/wiki/MCM-Quickstart
&bold(){API Reference(SkyUI公式レファレンス)}
https://github.com/schlangster/skyui/wiki/MCM-API-Reference
#contents
**イントロダクション
Mod Configuration Menu (MCM)は名前の通りModの調整メニューを追加します。
これは自分自身でModのメニューをとりあえず作れるようになるためのチュートリアルです。
ある程度Papyrusに触ったことがある方向けです。最低限CK wikiのスクリプトチュートリアルは済ませましょう。
**準備
[[SkyUI wiki>https://github.com/schlangster/skyui/wiki]]からSkyUI SDKを入れます。
この解説はSkyUI SDK 3.1時のものです。基本的な流れは変わりません。
ダウンロードしたファイルを解凍してScriptフォルダをDataフォルダに入れます。
そしてSkyUI本体も入れておきます。
あなたのModのespをCKで開いてから、Object WindowからQuest項目を選びます。
右クリックしてNewを選択し新しくクエストを作ります。
Quest DataタブでIDを入力(例: aaaxxMCMQuest)。
Start Game Enabledはチェック、Run at onceはチェックを外す。
一旦OK押して閉じます。
再度作成したクエストを開いて、Quest Aliasタブを開きます。
右クリックしてNew Reference Aliasを選びます。
左上AliasにAliasの名前を入力(例:MCMPlayerAlias)
Fill TypeをSpecific Referenceを選んで、Select Forced Referenceボタンを押します。
cellは(any)、RefはPlayerRef('Player')です。
次に画面右側Scripts欄の&bold(){Addボタン}を押します。
Filterにskiとうって検索を絞りSKI_PlayerLoadGameAliasを選びます。
これでAliasは終了ですのでAliasのウィンドウをOKして閉じます。
Scriptsタブを開いてAddボタンを押します。
newscriptを選んで、新しく名前をつけ(例:aaaxxMCMScript)、&u(){Extendsを
ski_configbase}にしてOKを押します。
スクリプトのウィンドウを一旦閉じて、Propertiesボタンを押します。
ModNameを選択してEdit Value。
ここにMod名を記載します。(例:Test)
これで準備は整いました。
後は新しく作ったスクリプトに記述していきます。
**MCMの構造と流れ
構造と流れさえ分かればそこまで難しくないです。
#ref(mcmconst.png)
細かいことはさておき、手を動かしてみましょう。
Scriptname aaaxxMCMScript extends ski_configbase
;変数の定義
int ToggleTestID
bool bToggleTest = true
;ページの設定
Event OnPageReset(string page)
ToggleTestID = AddToggleOption("Test Toggle", bToggleTest)
endEvent
int function GetVersion()
return 1
endFunction
;選択時の設定
Event OnOptionSelect(int option)
if (option == ToggleTestID)
bToggleTest = !bToggleTest
SetToggleOptionValue(ToggleTestID, bToggleTest)
If(bToggleTest)
; bToggleTestがtrueなら グローバル変数.SetValue(1)
Else
; bToggleTestがそれ以外(false)なら グローバル変数.SetValue(0)
EndIf
endIf
endEvent
;デフォルトの設定(Fキー押した時に呼び出されるイベント)
Event OnOptionDefault(int option)
If(option == ToggleTestID)
if (!bToggleTest)
bToggleTest = true
SetToggleOptionValue(ToggleTestID, bToggleTest)
; グローバル変数.SetValue(1)
endif
EndIf
EndEvent
;カーソルが乗った時に下に出るテキストの設定
Event OnOptionHighlight(int option)
If(option == ToggleTestID)
if (!bToggleTest)
SetInfoText("Toggle this option on to activate the mod.")
else
SetInfoText("Toggle this option off to deactivate the mod.")
endif
EndIf
EndEvent
スクリプトを書いたらコンパイルしてからespを保存し、espをアクティブにして実際にゲーム内で確認してみましょう。
Escキーでメニューを開いて、システムタブのMod Configurationです。
例のとおりですとtestという項目があるのでそれを開いて確認してください。
ToggleTestを押しても実際には何にも効果がないのですが、とりあえずは表示できて動かせたと思います。
変数の定義(IDとMCM内の変数の2つ)
OnPageResetにID = Add~Option()を書く
Event OnOption~()内にif option == ID
Set~OptionValue(ID,変数)でMCM上の数値をセットし、グローバル変数か何かで変更した値を渡す。
というのが基本的な流れです。
**実際に動くメニューを作る
以下の機能を実装したいと思います。
・時間変更をするスライダー
・天候を晴れにする機能のキー設定変更
・キルムーブのOn/Off
・キルムーブの確率
まず、天候機能を作ります。
Miscellanneous->Globalで右クリックしてNew、aaaWeatherKeyを作ります。
Short, Valueは199。
先ほどのメニューのクエスト(aaaxxMCMQuest)をDepulicateしてaaaWeatherQuestにします。
クエストのスクリプトを削除して新しくスクリプト(aaaxxWeatherScript)を作ります。
Scriptname aaaxxWeatherScript extends Quest
int WeatherKey
GlobalVariable property aaaWeatherKey auto
Weather property SkyrimClear auto
int function GetVersion()
return 1
endFunction
Event OnInit()
RegisterKey()
EndEvent
Function RegisterKey()
UnregisterForKey(WeatherKey)
WeatherKey = aaaWeatherKey.GetValueInt()
RegisterForKey(WeatherKey)
EndFunction
Event OnKeyDown(Int KeyCode)
if (KeyCode == WeatherKey)
SkyrimClear.ForceActive()
endif
EndEvent
Property の設定を忘れないように。Auto-Fill Allで全部埋まります。
次にQuest Aliasタブを開いて、プレイヤーのAliasを開きます。
SKI_PlayerLoadGameAliasを削除して新しくスクリプトを作ります。
Scriptname aaaxxTestAliasScript extends ReferenceAlias
aaaxxWeatherScript Property QuestScript Auto
Event OnPlayerLoadGame()
QuestScript.RegisterKey()
EndEvent
ロード時に登録したキーが消えるバグがあるので、OnPlayerLoadGame()でロード度にキーを登録し直します。aaaxxWeatherScriptのプロパティの登録を忘れずに。
天気の機能はコレで終わりです。
あとはMCMのスクリプトを書くだけです。
コードが長いけどもめげないこと。
Scriptname aaaxxMCMScript extends ski_configbase
;プロパティ
aaaxxWeatherScript Property QuestScript Auto
GlobalVariable Property KillMove auto
GlobalVariable Property KillMoveRandom auto
GlobalVariable Property GameHour auto
GlobalVariable Property aaaWeatherKey auto
;変数の定義
int KillMoveActiveID
int KillMoveRandomID
int GameHourID
int WeatherKeyID
bool _KillMoveActive = true
float _KillMoveRandom = 50.0
float _GameHour = 8.0
int _WeatherKey = 199 ;home key
; 初期化
Event OnConfigInit()
EndEvent
;このMCMのバージョン
int function GetVersion()
return 1
endFunction
;ページの設定
Event OnPageReset(string page)
SetCursorFillMode(TOP_TO_BOTTOM)
AddHeaderOption("KillMove")
KillMoveActiveID = AddToggleOption("KillMove", _KillMoveActive)
KillMoveRandomID = AddSliderOption("KillMove Random", _KillMoveRandom, "Percent:{0}")
AddHeaderOption("Time")
GameHourID = AddSliderOption("GameHour", _GameHour, "Hour:{0}")
AddHeaderOption("KeyConfig")
WeatherKeyID = AddKeyMapOption("WeatherKey", _WeatherKey)
endEvent
;選択時の設定
Event OnOptionSelect(int option)
if (option == KillMoveActiveID)
_KillMoveActive = !_KillMoveActive
SetToggleOptionValue(KillMoveActiveID, _KillMoveActive)
If(_KillMoveActive)
KillMove.SetValue(1)
Else
KillMove.SetValue(0)
EndIf
endIf
endEvent
;スライダー開いた時のイベント・設定
Event OnOptionSliderOpen(int option)
if (option == KillMoveRandomID)
SetSliderDialogStartValue(_KillMoveRandom)
SetSliderDialogDefaultValue(50)
SetSliderDialogRange(0, 100)
SetSliderDialogInterval(1)
elseif (option == GameHourID)
SetSliderDialogStartValue(_GameHour)
SetSliderDialogDefaultValue(8)
SetSliderDialogRange(0, 24)
SetSliderDialogInterval(1)
endIf
EndEvent
Event OnOptionSliderAccept(int option, float value)
if (option == KillMoveRandomID)
_KillMoveRandom = value
SetSliderOptionValue(KillMoveRandomID, _KillMoveRandom, "Percent: {0}")
KillMoveRandom.SetValue(_KillMoveRandom)
elseif (option == GameHourID)
_GameHour = value
SetSliderOptionValue(GameHourID, _GameHour, "Hour: {0}")
GameHour.SetValue(_GameHour)
endIf
EndEvent
Event OnOptionKeyMapChange(int option, int keyCode, string conflictControl, string conflictName)
if (option == WeatherKeyID)
_WeatherKey = keyCode
SetKeyMapOptionValue(WeatherKeyID, _WeatherKey)
aaaWeatherKey.SetValue(_WeatherKey)
QuestScript.RegisterKey() ;キーの再登録が必要
endIf
EndEvent
;デフォルトの設定(Fキー押した時の挙動)
Event OnOptionDefault(int option)
If(option == KillMoveActiveID)
if (!_KillMoveActive)
_KillMoveActive = true
SetToggleOptionValue(KillMoveActiveID, _KillMoveActive)
KillMove.SetValue(1)
endif
ElseIf(option == KillMoveRandomID)
_KillMoveRandom = 50
SetSliderOptionValue(KillMoveRandomID, _KillMoveRandom, "Percent: {0}")
KillMoveRandom.SetValue(_KillMoveRandom)
ElseIf(option == GameHourID)
_GameHour = 8
SetSliderOptionValue(GameHourID, _GameHour, "Hour: {0}")
GameHour.SetValue(_GameHour)
ElseIf(option == WeatherKeyID)
_WeatherKey = 199
SetKeyMapOptionValue(WeatherKeyID, _WeatherKey)
aaaWeatherKey.SetValue(_WeatherKey)
EndIf
EndEvent
;カーソルが乗った時に下に出るテキストの設定
Event OnOptionHighlight(int option)
If(option == KillMoveActiveID)
if (!_KillMoveActive)
SetInfoText("Toggle this option on to activate killmove.")
else
SetInfoText("Toggle this option off to deactivate killmove.")
endif
Elseif(option == KillMoveRandomID)
SetInfoText("Killmove random percent.")
Elseif(option == GameHourID)
SetInfoText("Set game hour.")
Elseif(option == WeatherKeyID)
SetInfoText("Set Weather Key.")
EndIf
EndEvent
例のごとくプロパティ登録を忘れずに。
注意すべき点は1スクリプトにつき、同一のイベントは一つまでなので、 イベント内でif (option == ID)で振り分けます。
**作ったMCMを更新するとき
int function GetVersion()
return 2
endFunction
returnのところの数値を整数で一つ上げます。ここの数値が変わったタイミングでOnUpdateVersion()のイベントが動くので、ここに追加項目(初期設定だとOnInit()に書く内容)を記載します。
例はキーとリストの追加。
Event OnUpdateVersion()
DodgeKey = Input.GetMappedKey("Sprint")
SetKeyMapOptionValue(keyID, DodgeKey)
InputMethodList = new string[3]
InputMethodList[0] = "DodgeKey/2Tap"
InputMethodList[1] = "DodgeKey"
InputMethodList[2] = "GamePad/2Tap"
EndEvent
*SkyUI MCMのチュートリアル
&bold(){SkyUI wiki}
https://github.com/schlangster/skyui/wiki
&bold(){Quick Start(SkyUI公式チュートリアル)}
https://github.com/schlangster/skyui/wiki/MCM-Quickstart
&bold(){API Reference(SkyUI公式レファレンス)}
https://github.com/schlangster/skyui/wiki/MCM-API-Reference
#contents
**イントロダクション
Mod Configuration Menu (MCM)は名前の通りModの調整メニューを追加します。
これは自分自身でModのメニューをとりあえず作れるようになるためのチュートリアルです。
ある程度Papyrusに触ったことがある方向けです。最低限CK wikiのスクリプトチュートリアルは済ませましょう。
**準備
[[SkyUI wiki>https://github.com/schlangster/skyui/wiki]]からSkyUI SDKを入れます。
この解説はSkyUI SDK 3.1時のものです。基本的な流れは変わりません。
ダウンロードしたファイルを解凍してScriptフォルダをDataフォルダに入れます。
そしてSkyUI本体も入れておきます。
あなたのModのespをCKで開いてから、Object WindowからQuest項目を選びます。
右クリックしてNewを選択し新しくクエストを作ります。
Quest DataタブでIDを入力(例: aaaxxMCMQuest)。
Start Game Enabledはチェック、Run at onceはチェックを外す。
一旦OK押して閉じます。
再度作成したクエストを開いて、Quest Aliasタブを開きます。
右クリックしてNew Reference Aliasを選びます。
左上AliasにAliasの名前を入力(例:MCMPlayerAlias)
Fill TypeをSpecific Referenceを選んで、Select Forced Referenceボタンを押します。
cellは(any)、RefはPlayerRef('Player')です。
次に画面右側Scripts欄の&bold(){Addボタン}を押します。
Filterにskiとうって検索を絞りSKI_PlayerLoadGameAliasを選びます。
これでAliasは終了ですのでAliasのウィンドウをOKして閉じます。
Scriptsタブを開いてAddボタンを押します。
newscriptを選んで、新しく名前をつけ(例:aaaxxMCMScript)、&u(){Extendsを
ski_configbase}にしてOKを押します。
スクリプトのウィンドウを一旦閉じて、Propertiesボタンを押します。
ModNameを選択してEdit Value。
ここにMod名を記載します。(例:Test)
これで準備は整いました。
後は新しく作ったスクリプトに記述していきます。
**MCMの構造と流れ
構造と流れさえ分かればそこまで難しくないです。
#ref(mcmconst.png)
細かいことはさておき、手を動かしてみましょう。
Scriptname aaaxxMCMScript extends ski_configbase
;変数の定義
int ToggleTestID
bool bToggleTest = true
;ページの設定
Event OnPageReset(string page)
ToggleTestID = AddToggleOption("Test Toggle", bToggleTest)
endEvent
int function GetVersion()
return 1
endFunction
;選択時の設定
Event OnOptionSelect(int option)
if (option == ToggleTestID)
bToggleTest = !bToggleTest
SetToggleOptionValue(ToggleTestID, bToggleTest)
If(bToggleTest)
; bToggleTestがtrueなら グローバル変数.SetValue(1)
Else
; bToggleTestがそれ以外(false)なら グローバル変数.SetValue(0)
EndIf
endIf
endEvent
;デフォルトの設定(Fキー押した時に呼び出されるイベント)
Event OnOptionDefault(int option)
If(option == ToggleTestID)
if (!bToggleTest)
bToggleTest = true
SetToggleOptionValue(ToggleTestID, bToggleTest)
; グローバル変数.SetValue(1)
endif
EndIf
EndEvent
;カーソルが乗った時に下に出るテキストの設定
Event OnOptionHighlight(int option)
If(option == ToggleTestID)
if (!bToggleTest)
SetInfoText("Toggle this option on to activate the mod.")
else
SetInfoText("Toggle this option off to deactivate the mod.")
endif
EndIf
EndEvent
スクリプトを書いたらコンパイルしてからespを保存し、espをアクティブにして実際にゲーム内で確認してみましょう。
Escキーでメニューを開いて、システムタブのMod Configurationです。
例のとおりですとtestという項目があるのでそれを開いて確認してください。
ToggleTestを押しても実際には何にも効果がないのですが、とりあえずは表示できて動かせたと思います。
変数の定義(IDとMCM内の変数の2つ)
OnPageResetにID = Add~Option()を書く
Event OnOption~()内にif option == ID
Set~OptionValue(ID,変数)でMCM上の数値をセットし、グローバル変数か何かで変更した値を渡す。
というのが基本的な流れです。
**実際に動くメニューを作る
以下の機能を実装したいと思います。
・時間変更をするスライダー
・天候を晴れにする機能のキー設定変更
・キルムーブのOn/Off
・キルムーブの確率
まず、天候機能を作ります。
Miscellanneous->Globalで右クリックしてNew、aaaWeatherKeyを作ります。
Short, Valueは199。
先ほどのメニューのクエスト(aaaxxMCMQuest)をDepulicateしてaaaWeatherQuestにします。
クエストのスクリプトを削除して新しくスクリプト(aaaxxWeatherScript)を作ります。
Scriptname aaaxxWeatherScript extends Quest
int WeatherKey
GlobalVariable property aaaWeatherKey auto
Weather property SkyrimClear auto
int function GetVersion()
return 1
endFunction
Event OnInit()
RegisterKey()
EndEvent
Function RegisterKey()
UnregisterForKey(WeatherKey)
WeatherKey = aaaWeatherKey.GetValueInt()
RegisterForKey(WeatherKey)
EndFunction
Event OnKeyDown(Int KeyCode)
if (KeyCode == WeatherKey)
SkyrimClear.ForceActive()
endif
EndEvent
Property の設定を忘れないように。Auto-Fill Allで全部埋まります。
次にQuest Aliasタブを開いて、プレイヤーのAliasを開きます。
SKI_PlayerLoadGameAliasを削除して新しくスクリプトを作ります。
Scriptname aaaxxTestAliasScript extends ReferenceAlias
aaaxxWeatherScript Property QuestScript Auto
Event OnPlayerLoadGame()
QuestScript.RegisterKey()
EndEvent
ロード時に登録したキーが消えるバグがあるので、OnPlayerLoadGame()でロード度にキーを登録し直します。aaaxxWeatherScriptのプロパティの登録を忘れずに。
天気の機能はコレで終わりです。
あとはMCMのスクリプトを書くだけです。
コードが長いけどもめげないこと。
Scriptname aaaxxMCMScript extends ski_configbase
;プロパティ
aaaxxWeatherScript Property QuestScript Auto
GlobalVariable Property KillMove auto
GlobalVariable Property KillMoveRandom auto
GlobalVariable Property GameHour auto
GlobalVariable Property aaaWeatherKey auto
;変数の定義
int KillMoveActiveID
int KillMoveRandomID
int GameHourID
int WeatherKeyID
bool _KillMoveActive = true
float _KillMoveRandom = 50.0
float _GameHour = 8.0
int _WeatherKey = 199 ;home key
; 初期化
Event OnConfigInit()
EndEvent
;このMCMのバージョン
int function GetVersion()
return 1
endFunction
;ページの設定
Event OnPageReset(string page)
SetCursorFillMode(TOP_TO_BOTTOM)
AddHeaderOption("KillMove")
KillMoveActiveID = AddToggleOption("KillMove", _KillMoveActive)
KillMoveRandomID = AddSliderOption("KillMove Random", _KillMoveRandom, "Percent:{0}")
AddHeaderOption("Time")
GameHourID = AddSliderOption("GameHour", _GameHour, "Hour:{0}")
AddHeaderOption("KeyConfig")
WeatherKeyID = AddKeyMapOption("WeatherKey", _WeatherKey)
endEvent
;選択時の設定
Event OnOptionSelect(int option)
if (option == KillMoveActiveID)
_KillMoveActive = !_KillMoveActive
SetToggleOptionValue(KillMoveActiveID, _KillMoveActive)
If(_KillMoveActive)
KillMove.SetValue(1)
Else
KillMove.SetValue(0)
EndIf
endIf
endEvent
;スライダー開いた時のイベント・設定
Event OnOptionSliderOpen(int option)
if (option == KillMoveRandomID)
SetSliderDialogStartValue(_KillMoveRandom)
SetSliderDialogDefaultValue(50)
SetSliderDialogRange(0, 100)
SetSliderDialogInterval(1)
elseif (option == GameHourID)
SetSliderDialogStartValue(_GameHour)
SetSliderDialogDefaultValue(8)
SetSliderDialogRange(0, 24)
SetSliderDialogInterval(1)
endIf
EndEvent
Event OnOptionSliderAccept(int option, float value)
if (option == KillMoveRandomID)
_KillMoveRandom = value
SetSliderOptionValue(KillMoveRandomID, _KillMoveRandom, "Percent: {0}")
KillMoveRandom.SetValue(_KillMoveRandom)
elseif (option == GameHourID)
_GameHour = value
SetSliderOptionValue(GameHourID, _GameHour, "Hour: {0}")
GameHour.SetValue(_GameHour)
endIf
EndEvent
Event OnOptionKeyMapChange(int option, int keyCode, string conflictControl, string conflictName)
if (option == WeatherKeyID)
_WeatherKey = keyCode
SetKeyMapOptionValue(WeatherKeyID, _WeatherKey)
aaaWeatherKey.SetValue(_WeatherKey)
QuestScript.RegisterKey() ;キーの再登録が必要
endIf
EndEvent
;デフォルトの設定(Fキー押した時の挙動)
Event OnOptionDefault(int option)
If(option == KillMoveActiveID)
if (!_KillMoveActive)
_KillMoveActive = true
SetToggleOptionValue(KillMoveActiveID, _KillMoveActive)
KillMove.SetValue(1)
endif
ElseIf(option == KillMoveRandomID)
_KillMoveRandom = 50
SetSliderOptionValue(KillMoveRandomID, _KillMoveRandom, "Percent: {0}")
KillMoveRandom.SetValue(_KillMoveRandom)
ElseIf(option == GameHourID)
_GameHour = 8
SetSliderOptionValue(GameHourID, _GameHour, "Hour: {0}")
GameHour.SetValue(_GameHour)
ElseIf(option == WeatherKeyID)
_WeatherKey = 199
SetKeyMapOptionValue(WeatherKeyID, _WeatherKey)
aaaWeatherKey.SetValue(_WeatherKey)
EndIf
EndEvent
;カーソルが乗った時に下に出るテキストの設定
Event OnOptionHighlight(int option)
If(option == KillMoveActiveID)
if (!_KillMoveActive)
SetInfoText("Toggle this option on to activate killmove.")
else
SetInfoText("Toggle this option off to deactivate killmove.")
endif
Elseif(option == KillMoveRandomID)
SetInfoText("Killmove random percent.")
Elseif(option == GameHourID)
SetInfoText("Set game hour.")
Elseif(option == WeatherKeyID)
SetInfoText("Set Weather Key.")
EndIf
EndEvent
例のごとくプロパティ登録を忘れずに。
注意すべき点は1スクリプトにつき、同一のイベントは一つまでなので、 イベント内でif (option == ID)で振り分けます。
**作ったMCMを更新するとき
int function GetVersion()
return 2
endFunction
returnのところの数値を整数で一つ上げます。ここの数値が変わったタイミングでOnUpdateVersion()のイベントが動くので、ここに追加項目(初期設定だとOnInit()に書く内容)を記載します。
例はキーとリストの追加。
Event OnUpdateVersion()
DodgeKey = Input.GetMappedKey("Sprint")
SetKeyMapOptionValue(keyID, DodgeKey)
InputMethodList = new string[3]
InputMethodList[0] = "DodgeKey/2Tap"
InputMethodList[1] = "DodgeKey"
InputMethodList[2] = "GamePad/2Tap"
EndEvent
表示オプション
横に並べて表示:
変化行の前後のみ表示: