あああい

おさらい

さて、使う画像を更新したらunityの方にも自動で反映したいってなった

しかし、外部ファイル読み込みだとロードが遅い、Resourcesは中身が増えると起動が遅くなる、
AssetBundleは旧式化しているのかどうかわからんけどなんかよくわからんので、
ResourcesとAddressablesを使うこととなった
(中身が増えないならResourcesは爆速なので)
たぶんSEやアイコン程度ならResourcesでいいと思う、検証してないけど

けいかく

現状、作成物をAddressablesに入れてプログラム内で使うには次の手順がいる
1. 作成物をunityに入れる
2. 作成物のAddressableを有効にする
3. 作成物のグループ・ラベルを設定する

それ以外にもたくさん設定項目あるんだけど知らんがなって感じでいく

ちょっと調べたら2.3.の自動化は既にある
【Unity】【Addressable】Unity Addressable Importerでアドレスの設定を自動化する - LIGHT11

で、1.だけど
アセットのインポート - Unity マニュアル
アセットデータベースの更新 - Unity マニュアル
この辺りを読む限り直接unityのプロジェクト内のフォルダに入れれば自動的に認識してくれそう
───してくれた

ということで、
画像とかの出力フォルダで更新があったら、更新があったファイルをunity内のフォルダにコピー上書きする
機能を作ればあとはどうにでもなるはず

・・・えっunityフォルダに直接出力すればいいって?
ぐぅの音もでねぇな、でもなんかやだからそうしない
基本的に、絵や音のソフトのファイル出力先がプロジェクトファイルと同じ場所か、前回に指定した場所だったりで、
他のソフトのプロジェクトファイルをunityフォルダ内に入れるのはどうかと思うし、
趣味での出力先とゲームでの出力先が違うし、出力先を選ぶとしても一々フォルダ移動するのが面倒
となると、ゲーム用の出力先フォルダを作ってそこにプロジェクトファイルを入れて、
そのフォルダ内で画像の更新があったらunityに画像だけを持ってくるっていう流れになる
ただ、3Dモデルのようなファイルが複数あって1つの物になってる奴は要考慮
他にいい方法があったら教えてほしい、趣味との併用をやめろは禁止

ぷろぐらむけいかく

1. ファイルパスと最終更新日時のタイムスタンプを一対とする
2. 一対群はcsvかなんかのファイルに保存してあるとする
3. 更新確認のためにファイルから一対群を読み取りメモリに入れる
4. 確認するルートフォルダは1つ、その内部にあるフォルダを全て網羅し、特定拡張子のファイルの更新を監視する
5. 更新があった場合は、UnityのプロジェクトフォルダのAssets下の同じ位置にそのファイルを置く、既にあるなら上書き
6. 該当一対のタイムスタンプを更新しておく
7. 保存ファイルにはあるが該当の場所にない場合は消失フラグを立て、unity内の同じ場所から消す(ないならそのまま)
8. 全部見終わったら消失フラグが立っている以外の一対群をファイルに保存する
9. Unityのソフト起動中に一定間隔で勝手にやってくれるといいなぁ


9.は[InitializeOnLoad]っていう奴があって便利そうだけど
常時起動されてもな・・・っていう思いがあるのでEditorWindowとトグルかなんかで
機能を無効・有効できるようにする
2.はjsonにしようかと思ったけど、逆にめんどそうなのでcsv
って思ったけど1回の探査で終わらせるには木構造じゃないとダメな気がするのでやはりjson

って思ってたらFileSystemWatcherとかいうクッソ便利なものがあったのでこれを使ってみる
FileSystemWatcher クラス (System.IO) | Microsoft Learn

これ使えばそもそも保存ファイルすら要らないし、unity起動時に
監視先とunity側であるなし食い違いを解消した後
このクラスのイベントを受け取ればええやんってなる、つよい

ただどうやら、サブディレクトリ内の変更がルートで起きた物として解釈されてるようで、
OnCreatedとかでもらえるFullPathにサブディレクトリのパスが含まれてない、なんでやねん

色々調べたらどうもこれ動作が不安定らしいということが見受けられた(ついったーで)
仕方ないので元の方法に戻る
ついでに、そもそも保存ファイル必要ないよねってなったのでまとめる

監視先のファイルが
・unity側にない || 監視先の方が新しい ->監視先のをunityにコピーする
unity側のファイルが
・監視先にない -> unity側のを破棄する

ということをすればいい

できました

コピーや消去時のファイルのハンドル操作が見当たらなかったので若干怖い
まぁ今んとこ動いたのでヨシ!
自動Addressableとの併用確認してないけどまぁいいか!!
併用して動いたのでヨシ!!

github.com