コンテンツにスキップ

Editor

開発に興味がありますか?

Project EAUploaderでは開発メンバーを常に募集しています!! 話を聞くだけでもOK! 是非当プロジェクトのDiscordサーバーへお越しください。 参加はこちら



本ページでは、EAUploaderの本体であるEAUploader.Editorアセンブリの処理の流れを解説します。

本ドキュメントは、EAUploader v1.4.6 の内容に準拠しています。

起動処理


EAUploaderの起動処理はEAUploaderCore(Editor/Scripts/EAUploaderCore.cs)が担当します。

1. 静的コンストラクタ

EAUploaderCoreには[InitializeOnLoad]属性が付与されており、Unityの起動時やスクリプトの再コンパイル(ドメインリロード)のたびに静的コンストラクタが実行されます。

  1. Application.logMessageReceivedにログ出力処理を登録する。
  2. 出力するログファイル名を決定する。
  3. 環境情報(日付、ログファイルGUID、EAUploaderのバージョン、Unityのバージョン、プラットフォーム、VPMパッケージの一覧)をログに出力する。
  4. EditorApplication.updateに初期化処理の待機を登録する。

2. 初期化処理

Unityがコンパイル中でもプレイモードでもない状態になると、PerformInitializationが一度だけ実行されます。

  1. InitializeEAUploader ― Assets/EAUploaderフォルダとPrefabManager.jsonが無ければ作成する。
  2. EAUploaderEditorManager.OnEditorManagerLoad ― 拡張機能の登録情報(EditorsManage.json)を初期化する。
  3. ShaderChecker.CheckShaders ― Assets内のすべてのプレハブについて、シェーダーが不足していないか確認する。
  4. PrefabManager.Initialize ― プレハブの一覧を更新し、プレビュー画像が無いプレハブのプレビュー画像を生成する。
  5. CheckAvailablePackages ― Packages/packages-lock.jsonを読み込み、VRM Converter(HasVRM)とAvatarOptimizer(HasAAO)が導入されているか判定する。
  6. [EAUPlugin]属性が付与されたstaticメソッドをすべてのアセンブリから探し、呼び出す。(拡張機能の登録)
  7. 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最終更新日時
TypeVRChat(VRC_AvatarDescriptorあり)、VRM(VRMMetaあり)、Other
StatusPinned(ピン留め)、Show、Hidden(非表示)、Other

プレハブの管理


インポート時の処理

AssetImportProcessor(AssetPostprocessor)が、.prefabのインポートを検知して次の処理を行います。

  1. ShaderChecker.CheckShadersInPrefabs ― シェーダーが不足している場合、ダイアログを表示する。ダイアログの「なぜこれを見ているのですか?」ボタンは、本ドキュメントの「シェーダーが見つからないエラー」(https://eauploader-docs.uslog.tech/faq/missing_shader)を開く。
  2. 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)

  1. VRChat SDKのコントロールパネルを開く。
  2. AvatarValidation.FindIllegalComponentsで、VRChatで使用できないコンポーネントを削除する。
  3. builder.BuildAndTestでビルドする。

アップロード(UploadAvatarAsync)

  1. VRChatで使用できないコンポーネントを削除する。
  2. GetVRCAvatarで、PipelineManagerのblueprintIdをもとにVRChat上のアバター情報を取得する。
  3. VRChat上にアバターが無い場合(新規):
    1. builder.Buildでビルドする。
    2. アセットバンドルのサイズが上限を超えていないか確認する。
    3. blueprintIdが無ければ割り当てる。
    4. VRCApi.CreateNewAvatarでアップロードする。
  4. VRChat上にアバターがある場合(更新):
    1. builder.Buildでビルドし、VRCApi.UpdateAvatarBundleでアセットバンドルを更新する。
    2. サムネイルが指定されていればVRCApi.UpdateAvatarImageで更新する。
    3. 名前、説明、公開設定、タグに変更があれば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で実行します。

拡張機能の作り方は「クイックスタートガイダンス」をご覧ください。

ログ出力


ログ出力とエラーレポートについては「ログ出力機能仕様書」をご覧ください。