Editor
開発に興味がありますか?
Project EAUploaderでは開発メンバーを常に募集しています!! 話を聞くだけでもOK! 是非当プロジェクトのDiscordサーバーへお越しください。 参加はこちら
本ページでは、EAUploaderの本体であるEAUploader.Editorアセンブリの処理の流れを解説します。
本ドキュメントは、EAUploader v1.4.6 の内容に準拠しています。
起動処理
EAUploaderの起動処理はEAUploaderCore(Editor/Scripts/EAUploaderCore.cs)が担当します。
1. 静的コンストラクタ
EAUploaderCoreには[InitializeOnLoad]属性が付与されており、Unityの起動時やスクリプトの再コンパイル(ドメインリロード)のたびに静的コンストラクタが実行されます。
Application.logMessageReceivedにログ出力処理を登録する。- 出力するログファイル名を決定する。
- 環境情報(日付、ログファイルGUID、EAUploaderのバージョン、Unityのバージョン、プラットフォーム、VPMパッケージの一覧)をログに出力する。
EditorApplication.updateに初期化処理の待機を登録する。
2. 初期化処理
Unityがコンパイル中でもプレイモードでもない状態になると、PerformInitializationが一度だけ実行されます。
InitializeEAUploader―Assets/EAUploaderフォルダとPrefabManager.jsonが無ければ作成する。EAUploaderEditorManager.OnEditorManagerLoad― 拡張機能の登録情報(EditorsManage.json)を初期化する。ShaderChecker.CheckShaders―Assets内のすべてのプレハブについて、シェーダーが不足していないか確認する。PrefabManager.Initialize― プレハブの一覧を更新し、プレビュー画像が無いプレハブのプレビュー画像を生成する。CheckAvailablePackages―Packages/packages-lock.jsonを読み込み、VRM Converter(HasVRM)とAvatarOptimizer(HasAAO)が導入されているか判定する。[EAUPlugin]属性が付与されたstaticメソッドをすべてのアセンブリから探し、呼び出す。(拡張機能の登録)EditorApplication.delayCallでEAUploaderのウィンドウを開く。既に開いている場合はフォーカスする。
初期化中に例外が発生した場合は、EAUploaderの再起動を促すダイアログを表示します。「再起動」を押すと、Packages/tech.uslog.eauploaderを再インポートします。
再読み込み(Reload)
メニューの「EAUploader」→「Reload」(EAUploaderCore.ReloadSDK)では、選択中のプレハブの解除、拡張機能の登録情報の初期化、プレハブ一覧の更新、連携パッケージの判定を再度行います。
データの保存
EAUploaderは、プロジェクト内の次の場所にデータを保存します。
| パス | 内容 | 担当クラス |
|---|---|---|
Assets/EAUploader/settings.json | 表示言語(language)、EA Libraryの開閉状態(isLibraryOpen) | Config, LanguageUtility |
Assets/EAUploader/PrefabManager.json | プレハブの一覧(PrefabInfoのリスト) | PrefabManager |
Assets/EAUploader/EditorsManage.json | 登録されている拡張機能の情報 | EAUploaderEditorManager |
Assets/EAUploader/PrefabPreviews/{プレハブ名}.png | プレビュー画像(1080×1080) | PrefabPreview |
EAUploaderLog/ | ログファイル | UI.Windows.Logger |
EditorPrefs EAUploader.Theme | テーマ(white / dark) | ThemeUtility |
PrefabInfoは次の情報を保持します。
| フィールド | 内容 |
|---|---|
Path | プレハブのパス |
Name | プレハブの名前(拡張子を除くファイル名) |
LastModified | 最終更新日時 |
Type | VRChat(VRC_AvatarDescriptorあり)、VRM(VRMMetaあり)、Other |
Status | Pinned(ピン留め)、Show、Hidden(非表示)、Other |
プレハブの管理
インポート時の処理
AssetImportProcessor(AssetPostprocessor)が、.prefabのインポートを検知して次の処理を行います。
ShaderChecker.CheckShadersInPrefabs― シェーダーが不足している場合、ダイアログを表示する。ダイアログの「なぜこれを見ているのですか?」ボタンは、本ドキュメントの「シェーダーが見つからないエラー」(https://eauploader-docs.uslog.tech/faq/missing_shader)を開く。PrefabManager.ImportPrefab― プレハブにEAUploaderMetaコンポーネントが無ければ追加し、プレビュー画像を生成して、モデルの管理の一覧を更新する。
シェーダーの確認
ShaderCheckerは、プレハブ内のすべてのRendererのマテリアルについて、シェーダーがHidden/InternalErrorShaderである場合、又はShader.Findでシェーダーが見つからない場合に、シェーダーが不足していると判定します。
「導入済みのシェーダーを確認」で表示するシェーダーの一覧は、シェーダー名の最初の/より前の部分(グループ名)をまとめたものです。ShaderChecker.UNSUPPORTED_SHADERSに含まれるグループは除外されます。
アップロード可否の判定
各画面では、次の3つの条件でアバターをアップロードできるか判定しています。
| 判定 | メソッド |
|---|---|
| VRC_AvatarDescriptorを持っているか | Utility.CheckAvatarHasVRCAvatarDescriptor |
| シェーダーが不足していないか | ShaderChecker.CheckAvatarHasShader |
| VRMアバターでないか | Utility.CheckAvatarIsVRM |
UI
EAUploaderのUIは、UI Toolkit(UXML / USS)で作成されています。
- メインウィンドウは
UI.EAUploader(メニュー「EAUploader」→「Open EAUploader」)です。MainWindow.uxmlを読み込み、タブのボタン(settings/setup/upload)に応じて各タブのMain.ShowContentを呼び出します。 - スタイルは
styles.uss(EAUploader独自のスタイル)とtailwind.uss(Tailwind CSS風のユーティリティクラス。flex-row、p-4、text-xl、font-boldなど)を使用しています。 - UXMLは
Resources.Loadで読み込むため、Editor/Resources配下に配置します。 - 独自のUIコンポーネントは
Editor/Resources/UI/Componentsにあります。UXMLではxmlns:eau="EAUploader.UI.Components"を宣言して使用します。詳しくは「UIコンポーネント」をご覧ください。
多言語対応
メインウィンドウは100msごとにLanguageUtility.Localizationを実行し、ウィンドウ内のすべてのTextElementの文字列を翻訳します。そのため、UXMLには英語の文字列をそのまま記述し、翻訳ファイルに対応する翻訳を追加してください。
C#から文字列を設定する場合はT7e.Get("English text")を使用します。詳しくは「多言語対応とリソース」をご覧ください。
アップロード処理
ビルドとアップロードはAvatarUploader(Editor/Scripts/AvatarUploader.cs)が担当します。VRChat SDKのコントロールパネルからIVRCSdkAvatarBuilderApiを取得して使用します。
テストとしてビルド(BuildAndTestAsync)
- VRChat SDKのコントロールパネルを開く。
AvatarValidation.FindIllegalComponentsで、VRChatで使用できないコンポーネントを削除する。builder.BuildAndTestでビルドする。
アップロード(UploadAvatarAsync)
- VRChatで使用できないコンポーネントを削除する。
GetVRCAvatarで、PipelineManagerのblueprintIdをもとにVRChat上のアバター情報を取得する。- VRChat上にアバターが無い場合(新規):
builder.Buildでビルドする。- アセットバンドルのサイズが上限を超えていないか確認する。
blueprintIdが無ければ割り当てる。VRCApi.CreateNewAvatarでアップロードする。
- VRChat上にアバターがある場合(更新):
builder.Buildでビルドし、VRCApi.UpdateAvatarBundleでアセットバンドルを更新する。- サムネイルが指定されていれば
VRCApi.UpdateAvatarImageで更新する。 - 名前、説明、公開設定、タグに変更があれば
VRCApi.UpdateAvatarInfoで更新する。
アップロードの進捗はProgressChangedイベント、完了はOnCompleteイベントで通知されます。
アバター情報だけを更新する場合はUpdateVRCAvatarを使用します。
アバターパフォーマンス
アップロードタブのアバターパフォーマンスは、PerformanceInfoComputer(Editor/Scripts/VRCSDK/PerformanceInfo.cs)がVRChat SDKのAvatarPerformanceを使用して計算しています。現在はPC(Windows)用の基準で計算しています。
自動最適化
AvatarOptimizerが導入されている場合(HAS_AAO)、アップロードタブの「自動最適化」をオンにすると、アバターのルートにTraceAndOptimizeコンポーネントを追加します。オフにすると削除します。
拡張機能(編集ツール)の管理
EAUploaderEditorManagerは、拡張機能からRegisterEditorで登録されたEditorRegistrationを保持します。
セットアップタブの「編集ツール」は、GetRegisteredEditorsで取得した一覧をもとに表示しています。ボタンを押すと、EditorRegistration.MenuNameのメニューをEditorApplication.ExecuteMenuItemで実行します。
拡張機能の作り方は「クイックスタートガイダンス」をご覧ください。
ログ出力
ログ出力とエラーレポートについては「ログ出力機能仕様書」をご覧ください。