kurotu / VRCQuestTools

Unity editor extension to support uploading VRChat avatars for Oculus Quest
https://kurotu.github.io/VRCQuestTools/
MIT License
208 stars 15 forks source link

ArgumentNullException in VRCQuestToolsActualPerformanceCallback with newly created PipelineManager component #36

Open anatawa12 opened 2 days ago

anatawa12 commented 2 days ago

Describe the bug / バグの説明

PipelineManager.blueprintIdのデフォルト値がnullなためエラーになるようです。

シーンを開き直すとUnityのSerializationの仕様により null が 空文字列 に変化するため問題がなくなります

ArgumentNullException: Value cannot be null.
Parameter name: key
System.Collections.Generic.Dictionary`2[TKey,TValue].TryInsert (TKey key, TValue value, System.Collections.Generic.InsertionBehavior behavior) (at <b904252b6b4e4277834bcca7e51f318d>:0)
System.Collections.Generic.Dictionary`2[TKey,TValue].set_Item (TKey key, TValue value) (at <b904252b6b4e4277834bcca7e51f318d>:0)
KRT.VRCQuestTools.Ndmf.VRCQuestToolsActualPerformanceCallback.OnPreprocessAvatar (UnityEngine.GameObject avatarGameObject) (at ./Packages/com.github.kurotu.vrc-quest-tools/Editor/NDMF/VRCQuestToolsActualPerformanceCallback.cs:32)
VRC.SDKBase.Editor.BuildPipeline.VRCBuildPipelineCallbacks.OnPreprocessAvatar (UnityEngine.GameObject avatarGameObject) (at <f06a43e46d164508b5f908707738d69a>:0)
UnityEngine.Debug:LogException(Exception)
VRC.SDKBase.Editor.BuildPipeline.VRCBuildPipelineCallbacks:OnPreprocessAvatar(GameObject)
nadena.dev.ndmf.ApplyOnPlay:MaybeProcessAvatar(OnDemandSource, MonoBehaviour) (at ./Packages/nadena.dev.ndmf/Editor/ApplyOnPlay.cs:98)
nadena.dev.ndmf.runtime.AvatarActivator:Awake() (at ./Packages/nadena.dev.ndmf/Runtime/ApplyOnPlayGlobalActivator.cs:187)
UnityEngine.GameObject:AddComponent()
nadena.dev.ndmf.runtime.RuntimeUtil:GetOrAddComponent(GameObject) (at ./Packages/nadena.dev.ndmf/Runtime/RuntimeUtil.cs:33)
nadena.dev.ndmf.runtime.ApplyOnPlayGlobalActivator:Awake() (at ./Packages/nadena.dev.ndmf/Runtime/ApplyOnPlayGlobalActivator.cs:125)

To Reproduce / 再現手順

  1. (必須か不明) Enter Play Mode SettingsのReload Domain / Reload Sceneを無効にする
  2. (必須か不明) Pipeline Managerのinspectorを閉じておく(Pipeline Manager (Script) の左の▼を▶にしておく) 不要
  3. 新規シーンを作成
  4. 新規GameObjectを作成し、AnimatorとVRC Avatar Descriptor (とPipeline Manager)を作成する
  5. Playモードに入る

Expected behavior / 期待する動作

エラーにならない

Screenshots / スクリーンショット

No response

Used assets / 使用したアセット

特になし

VRCQuestTools version / VRCQuestToolsのバージョン

2.5.4

Unity version / Unityのバージョン

2022.3.22f1

Additional context / その他の情報

一度Playモードから抜けると発生しなくなるため重大な問題ではありません

kurotu commented 2 days ago

起きている現象としては理解できたので修正します

ところで IVRCSDKPreprocessAvatarCallback ってPlayモードでも呼ばれるのでしたっけ?どうだったかすぐ思い出せず。 コールスタックを見た感じNDMFから呼ばれているので、通常と異なる挙動であればどこかに記載してあると良さそうです。

anatawa12 commented 2 days ago

NDMFがVRCFury互換性等々のためにIVRCSDKPreprocessAvatarCallbackを呼び出すようになってますね。 NDMFに限らず、多くの非破壊ツールの環境でIVRCSDKPreprocessAvatarCallbackがPlayモードのタイミングで呼ばれるようになってます