装備中の武器、弾薬、キャラクター名、レベルをHUDに表示します。
AmmoUIの有料版ということのようです。
toounさんの作品です。
導入メモ
AmmoUIを導入済みの場合はアンインストールしてセーブデータのクリーニングをした方が無難と思います。
HUDFrameworkへの登録を解除する方法が不明。
マルチバイトに対応させる
標準ではマルチバイトに対応していませんが、対応させる解説が配布サイトにあります。
- フォントを用意しておきます。私の場合はAlternative Japanese Fontの源真ゴシックPを使っているのでここからダウンロードしました。
- Flashの編集ツールであるJPEXS Free Flash Decompilerをインストールしておきます。
- AmmoUIの配布サイトからLanguage.not.English.new!(how to Solve square characters. please see my post).Data.zipをダウンロードしておきます。
- ammoUItooun_en.swfをJPEXS Free Flash Decompilerで開きます。
- 左側のfontsのDefineFont3(6:Roboto Condensed)をクリックします。
- 右側のEmbedをクリックします。
- フォントを選ぶウィンドウが出ます。ここでTTF fileをクリックしてフォントのファイルを指定します。GenShinGothic-P-Bold.ttfを選びました。
- Japanese (All)にチェックを入れてOKを押すとすべての文字が置き換わります。
- アルファベットと数字はそのままにしておきたい場合はJapanese KanaとJapanese Kanjiにチェックを入れるといいようです。
- その後はYes to all、Yesを選びます。
- Saveをクリックして保存します。
ソートModに対応させる
ソートタグを除去する処理が含まれているようです。残念ながらアイコンにする処理はないようです。
AmmoUIの本体であるammoUItoounEXPANDED.swfをJPEXS Free Flash Decompilerで覗くとわかります。
原因は不明ですが、コードを書き換えて保存すると動作がおかしくなります。それどころか、何も書き換えずに上書き保存しただけでも壊れます。おそらくswfがJPEXS Free Flash Decompilerの対応できないバージョンか、言語に関係した問題のようです。フォントの差し替えはammoUItooun_en.swfというわざわざ別のswfが用意されていてそちらで行うように指示のあることからも、言語が関係しているのかと思われます。
除去してくれるソートタグは (文字列)
の場合に限られます。DEF_UIやHorizonはこの形式です。
FallUIやFIS – The NEW FallUI Item Sorterは [文字列]
なので除去されません。
AMMO UI HUD and my hud configにも書きましたが、Baka FrameworkのStringUtil関数を使い、swfに弾薬名を渡す前にタグを除去することでHUDからソートタグを消せます。
最適化
簡単にできること
Game.GetPlayer関数でPlayerのリファレンスを取得しておきながら使っていないところが複数箇所にあります。
sightedStateEnterというアニメーションイベントを登録していますが何もしていません。
これらは無駄なので省くだけで高速化できます。
弾薬の取得
弾薬の取得にアタッチメントを総当りで調べているので、これはInstanceDataを使うようにすると速くなります。詳細は武器の情報を取得するで解説しています。
弾薬の切り替えはOnEquip、OnUnequipで判定しているので、状況に応じて止めたほうがいいです。
例えば、Horizonの弾薬変更は武器のアタッチメントをその場で付け替えることで実現しています。その際にOnEquip/OnUnequipが連発するので、処理が終わるまでAmmoUIを停止させた方が無難です。
拙作のTactical Action Extension Package Extendedには必要に応じてAmmoUIを停止させる処理が入っています。
WeaponFireイベントにかかわる処理
WeaponFireイベントは発砲ですが、1回ごとにHUDを書き換えているので、ミニガンをずっと発射していると目に見えて遅延します。
まず、内部で0.1秒のwaitを入れていますが、waitのかわりにtimerを使うようにします。timerは0.1秒後に予約してそこでHUDを更新、その間のWeaponFireイベントは無視することで、無駄な処理を間引くことができます。
HUDを更新する際にammoUIのメニューを開いているか、銃器を装備中かという確認を毎回行っています。この手の毎回確認する処理はステートをうまく使うことで確認自体をなくせます。ammoUIのメニューを開く際に銃を装備しているか確認していますので、そこでステート移行させるといいです。
ステートは「メニューを閉じている」「メニューを開いて銃を装備している」「メニューを開いて銃を装備していない」の3つを用意します。メニューの開閉と装備の切り替えでステートを移行させます。これで「メニューを開いて銃を装備している」の時だけWeaponFireイベントを処理するようにします。このステートにいるときはメニューが開かれていて銃を装備していることが確定するのでわざわざ確認する必要がない、ということです。
ただし、スクリプト1つで複数のステートとtimerを管理すると構造が複雑になってしまうので、WeaponFireイベントを処理するためだけのスクリプトを別途用意することで、構造がシンプルになります。