スカイリムでは、モーションの壁についてはFNISという偉大なModが早々に制約をぶち破り、発売から7年が経過した今では、プロの犯行かと思われるような秀逸なアニメーションが溢れかえっていますが(でも釣りモーションは探せども無いです。誰か作って!)、残念ながらUIの方面については、二、三年前から進化が止まっているように思います。
いい加減、SkyUIのMCMと覇権を競うくらいの新たなUIのフレームワークが出てきても良さそうなものだと思うのですが……いまだにMCM一択というのが残念でなりません。
また、メニュー追加系のUIでは、RaceMenuやEFFの作者さまがお作りになったUIExtensionsがよく使われているなあという印象です。こちらは特にリストメニューがよくできているので、Modderに好まれるのもさもあらん、という感じ。
これはスカイリムのデフォルトのリストメニュー(Message Box)

横並びだとスペースの都合上、選択肢の個数が限られてしまうし、選択肢の内容も長いテキストは使えません(日本語のような全角文字だとますますつらい)。
デフォルトのメニューの利点ですが、唯一上げるとするなら、本体がMessageというオブジェクトなので選択肢のテキストがローカライズしやすい、という点でしょうか。
しかしそのせいでスクリプトだけでは完結しない(選択肢をCK上で追加しなくてはならない)ので、そこが不便といえば不便です。
ちなみにリストメニューを追加するUI Modとしては、SkyUIの作者さま作の「SkyUILib」についても、私としてはお勧めしたいところです。
字幕ModもDirectorもかな入力メニューも、私はこのModのソースを見ることができたから、Flashファイルの中身まで全部公開してくださっていたから作ることができました。
そんなわけで私にとっては師匠ともいうべき存在なので、ついでに紹介させていただきます。
SkyUILibのリストメニューはデフォルトのメニューの横並び状態を
縦並びにしただけのシンプルな作りです。
縦並びにしただけのシンプルな作りです。

UIExtentionsのリストメニューだと選択肢オンリーなんで、「○○○について選んでください」というような補足説明が表示できないんですよね。
スクリプトもSkyUILibはバニラのMessageの「show()」と同じ感覚で使えます。
ところでスカイリムでは、こういったUI追加Modの実装方法を解説したドキュメントやチュートリアルのようなものって、全くといって良いほど見かけないですね。
汎用のMCMの実装方法については、作者様が自らGitHubのWikiにまとめてくださってますけど、SkyUILibもUIExtentionsも「ソースを見て察しろ」という状態です。
Modderの皆さんはどうやって使い方を会得してるんでしょうか。
皆さん、このくらいは説明なんかなくったって楽勝だろ、というレベルなのでしょうか。
少なくとも私は全然わかりませんでした……特にUIExtentionsは。さっぱり。
そんなわけで手探りで解読したUIExtentionsのリストメニューの実装方法を書いておきます。
■UIExtentionsのリストメニューの実装方法
UIExtentionsのリストメニューの最大の特長は、選択肢にさらに子の選択肢を簡単に追加していけるところです。この子選択肢の機能があるからこそ、多くのModで採用されているのではないかと思います。
UIListMenu listMenu = UIExtensions.GetMenu("UIListMenu") as UIListMenu
というてもリストを用意するには「AddEntryItem」という関数さえ知っていればOKです。
たとえばこんな感じの構造のリストメニューを作りたいとします。

「メインメニュー3」のサブメニューの2からは、さらに子の選択肢が3つ派生する。
このような構造のリストの作りたい時はこういう記述になります。

でも「AddEntryItem」という関数だけで指定できてしまっているのが分かりますでしょうか。
「AddEntryItem」という関数で選択肢を追加すると、追加した選択肢は追加した順に0から通し番号が振られます。
(「AddEntryItem」関数の戻り値として取得することができます)
その番号を「entryParent」や「entryCallback」といった引数の値に使うことで、選択肢の分岐を指定するのです。
「entryParent」は自分の親の選択肢の番号、「entryCallback」はおそらく最初の分岐の根元の選択肢の番号です。また子の選択肢を持つ選択肢については「entryHasChildren」の値を「true」にしてあげます。
上記のサンプルではわかりやすいように選択肢のテキストを直接ぶちこんで個別に記述していますが、もちろんstringの配列でwhileなどを使ってまとめて記述してOKです。
選択肢の準備ができたら、あとは「OpenMenu()」関数でメニューを開き、選ばれた選択肢の情報を取得します。

また「GetResultString」で選んだ選択肢のテキスト自体も取得できます。
こうして書くと、結構単純な作りなのですが……何も説明がないので、どういうしくみなのか解読するのにえらい時間がかかりました。
せめてソースにコメントくらい書いておいて欲しいです。
私も3年ぶりに復帰してSEをやっているんですが、MOD文化はやっぱり素晴らしいですね。
返信削除TES6が楽しみです。
I would say, your post was so amazing. Thank you so much for sharing this... Top mobile casinos online in India
返信削除This is best article in your website.. Really impressive. Keep going.Indoor cricket stadium in India
返信削除
返信削除This is very informative and interesting for those who are interested in playing online. But nowadays Google claimed a bug in its indexing is the main issue. So here is the more information you can check:https://my-blogging-channel-15.webself.net/blog/2021/03/11/t20-format-and-factors-to-place-bets