lilxyzw / lilycalinventory Goto Github PK
View Code? Open in Web Editor NEWModify avatar at build time.
License: MIT License
Modify avatar at build time.
License: MIT License
衣装や小物を切り替えたいが、その中にも切り替えられるパーツがあるような場合は、親子でLI PropやAutoDresserが付くことになります。
この際、子の切り替えをメニューに分離するために、親にMenuFolderを付けようとすると
Can't add 'MenuFolder' to ** because a 'Prop' is already added to the game object! A GameObject can only contain one 'MenuBaseComponent' component.
と言われてしまいます。
別のGameObjectにLI MenuFolderを付け、オーバーライドで指定することにより回避は可能ですが、直接付けられる方が直感的かもしれません。
(親が衣装(AutoDresser)の場合は、実用上はメニューの階層が別になることが予想されるため、必ずオーバーライドすることになる気はします。そのため、親がPropの場合を主に考慮すれば良いのかもしれません?)
MenuBaseComponentにpriorityみたいなプロパティを追加すればいいかも
LI AutoDresserやLI Propといった、"コンポーネントを付けるだけ"で概ね設定が完了する方式はとても興味深く、良いシステムだと思います。
反面、設定箇所が散らばってしまって管理しづらいケースも想定され、設定内容を一覧するためのウィンドウがあっても良いなという考えに行き当たります。
或いは、コンポーネントに馴染みのないユーザーは、メニューを組み上げるイメージで設定を行いたい可能性があります。(NDMF以前のツールはこの形式が多いと認識しています)
prefabを活用した非破壊改変においては、こちらのケースでも設定内容をコンポーネントに保存する必要がありますが、コンポーネント式管理とは少し方向性の異なる内容だと思います。
これら2つについて考えてみます。
このウィンドウでは、各コンポーネントで設定した内容を一覧することになります。
表示するだけが目的であれば、Menu Folderのプレビューのように表示すれば良いですし、並べ替えなどの設定変更も可能にする場合は2のケースに話が近付いてきます。
内容例:
1のような自由な階層構造と異なり、各メニューの親となるフォルダを作ってその中のメニュー項目を作成/設定という2段構造を想定したRISライクなUIです。
設定保存用のコンポーネントにはCostumeChangerやItemTogglerを用いることを想定しています。
また、親メニューとメニュー項目の表示は、それぞれReorderableListを想定します。
今私が考えているイメージは2つあります。
親メニュー | メニュー項目 | メニュー設定 |
---|---|---|
≡親メニュー名A | 選択中の親メニューの設定(アイコン等と、排他orトグル) | 選択中のメニュー項目の設定 |
≡親メニュー名B | ≡メニュー項目名1 | メニュー名やアイコン等の設定等 |
≡親メニュー名C | ≡メニュー項目名2 | オブジェクトのオンオフは |
… | … | 初めから展開しておいて欲しいです |
親メニュー | メニュー項目 | メニュー設定 |
---|---|---|
≡親メニューA(名前やアイコン等と、排他orトグル) | 選択中の親メニュー名 | 選択中のメニュー項目の設定 |
≡親メニューB(名前やアイコン等と、排他orトグル) | ≡メニュー項目1(名前やアイコン) | 切り替え対象の設定等 |
≡親メニューC(名前やアイコン等と、排他orトグル) | ≡メニュー項目2(名前やアイコン) | オブジェクトのオンオフは |
… | … | 初めから展開しておいて欲しいです |
1は現在のLIのコンポーネントに近い設定UIになると思います。
2は現在の設定UIとは少し離れたものになりますが、私はかなりこちら推しです(設定しやすさがこちらの方が良いかな?と…)
初期状態がオフ状態になっているGameObjectにLI Propが付いている場合、それをオンにするメニューとアニメーションが生成されることが予想されますが、実際には何も生成されません。
Unity: 2019.4.31f1
LI: 0.3.4
幾つか思いついた改善案を投げてみます。参考画像はAutoDresserですが、恐らく他のコンポーネントでも同様です。
"オブジェクトのオンオフ"に物を追加したい場合、現在は1つずつ+ボタンで枠を追加してからセットする必要があります。
これを、複数オブジェクトが纏めてドラッグすることで、(0個の状態からでも)纏めて増やせるようになっていると便利です。
現状の並び替え可能なUIとは微妙に共存が難しいかもしれません。(UI Elementsでの実装例を見た記憶が無いため)
("マテリアルの置き換え"等のRendererを入れる場所でも、つまりHierarchyから纏めて入れられるものであれば全て同様かも…?)
"BlendShapeの切り替え"について、"メッシュ"の中には"切り替えるBlendShapeと値"しかなく、"メッシュ"自体にもfoldoutが付いているため、"切り替えるBlendShapeと値"の方にはfoldoutが不要なように思います。
現状でBlendShapeの切り替え対象を増やす場合、メッシュをセットし、foldoutを開き、"切り替えるBlendShapeと値"のfoldoutを更に開いてから編集する必要があり、恐らく少し不便です。
"マテリアルの置き換え"の中の、各メッシュごとにfoldoutがありますが、これは不要なように思います。
メッシュとマテリアル1つずつしか幅を取らないため、増える手間の方が大きそうな気がします。
lilAvatarModifier 0.2.2
Unity 2022.3.6f1
アバター内に新しいオブジェクトを作成、そのオブジェクトにCostumeChangerコンポーネントを追加しました。
コスチュームの+ボタン、マテリアルの置き換えの+ボタンを押し、Rendererを適当に指定しました。
この状況でプレイするとエラーが発生しました。
InvalidOperationException: Sequence contains no matching element
System.Linq.Enumerable.First[TSource] (System.Collections.Generic.IEnumerable`1[T] source, System.Func`2[T,TResult] predicate) (at <de4a1a1490a74771a34fee0d1d586658>:0)
jp.lilxyzw.avatarmodifier.ObjHelper.GetMenuName (jp.lilxyzw.avatarmodifier.runtime.Costume costume) (at ./Packages/jp.lilxyzw.avatarmodifier/Editor/Helper/ObjHelper.Component.cs:18)
jp.lilxyzw.avatarmodifier.ObjHelper.ResolveMenuName (jp.lilxyzw.avatarmodifier.runtime.CostumeChanger[] changers) (at ./Packages/jp.lilxyzw.avatarmodifier/Editor/Helper/ObjHelper.Component.cs:32)
jp.lilxyzw.avatarmodifier.Processor.FindComponent (nadena.dev.ndmf.BuildContext ctx) (at ./Packages/jp.lilxyzw.avatarmodifier/Editor/Processor/Processor.cs:39)
jp.lilxyzw.avatarmodifier.AvatarModifierPlugin+<>c.<Configure>b__4_0 (nadena.dev.ndmf.BuildContext ctx) (at ./Packages/jp.lilxyzw.avatarmodifier/Editor/NDMF/AvatarModifierPlugin.cs:18)
nadena.dev.ndmf.AnonymousPass.Execute (nadena.dev.ndmf.BuildContext context) (at ./Packages/nadena.dev.ndmf/Editor/API/Fluent/Pass.cs:42)
nadena.dev.ndmf.ConcretePass.Execute (nadena.dev.ndmf.BuildContext context) (at ./Packages/nadena.dev.ndmf/Editor/API/Solver/PluginResolver.cs:36)
nadena.dev.ndmf.BuildContext.RunPass (nadena.dev.ndmf.ConcretePass pass) (at ./Packages/nadena.dev.ndmf/Editor/API/BuildContext.cs:337)
UnityEngine.Debug:LogException(Exception)
nadena.dev.ndmf.Plugin`1:OnUnhandledException(Exception) (at ./Packages/nadena.dev.ndmf/Editor/API/Fluent/Plugin.cs:81)
nadena.dev.ndmf.Plugin`1:nadena.dev.ndmf.IPluginInternal.OnUnhandledException(Exception) (at ./Packages/nadena.dev.ndmf/Editor/API/Fluent/Plugin.cs:86)
nadena.dev.ndmf.BuildContext:RunPass(ConcretePass) (at ./Packages/nadena.dev.ndmf/Editor/API/BuildContext.cs:341)
nadena.dev.ndmf.AvatarProcessor:ProcessAvatar(BuildContext, BuildPhase, BuildPhase) (at ./Packages/nadena.dev.ndmf/Editor/AvatarProcessor.cs:198)
nadena.dev.ndmf.VRChat.BuildFrameworkPreprocessHook:OnPreprocessAvatar(GameObject) (at ./Packages/nadena.dev.ndmf/Editor/VRChat/BuildFrameworkPreprocessHook.cs:43)
VRC.SDKBase.Editor.BuildPipeline.VRCBuildPipelineCallbacks:OnPreprocessAvatar(GameObject)
nadena.dev.ndmf.ApplyOnPlay:MaybeProcessAvatar(OnDemandSource, MonoBehaviour) (at ./Packages/nadena.dev.ndmf/Editor/ApplyOnPlay.cs:95)
nadena.dev.ndmf.runtime.AvatarActivator:Awake() (at ./Packages/nadena.dev.ndmf/Runtime/ApplyOnPlayGlobalActivator.cs:179)
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:118)
I```
nvalidOperationException: Sequence contains no matching element
System.Linq.Enumerable.First[TSource] (System.Collections.Generic.IEnumerable1[T] source, System.Func
2[T,TResult] predicate) (at :0)
jp.lilxyzw.avatarmodifier.ObjHelper.GetMenuName (jp.lilxyzw.avatarmodifier.runtime.Costume costume) (at ./Packages/jp.lilxyzw.avatarmodifier/Editor/Helper/ObjHelper.Component.cs:18)
jp.lilxyzw.avatarmodifier.ObjHelper.ResolveMenuName (jp.lilxyzw.avatarmodifier.runtime.CostumeChanger[] changers) (at ./Packages/jp.lilxyzw.avatarmodifier/Editor/Helper/ObjHelper.Component.cs:32)
jp.lilxyzw.avatarmodifier.Processor.FindComponent (nadena.dev.ndmf.BuildContext ctx) (at ./Packages/jp.lilxyzw.avatarmodifier/Editor/Processor/Processor.cs:39)
jp.lilxyzw.avatarmodifier.AvatarModifierPlugin+<>c.b__4_0 (nadena.dev.ndmf.BuildContext ctx) (at ./Packages/jp.lilxyzw.avatarmodifier/Editor/NDMF/AvatarModifierPlugin.cs:18)
nadena.dev.ndmf.AnonymousPass.Execute (nadena.dev.ndmf.BuildContext context) (at ./Packages/nadena.dev.ndmf/Editor/API/Fluent/Pass.cs:42)
nadena.dev.ndmf.ConcretePass.Execute (nadena.dev.ndmf.BuildContext context) (at ./Packages/nadena.dev.ndmf/Editor/API/Solver/PluginResolver.cs:36)
nadena.dev.ndmf.BuildContext.RunPass (nadena.dev.ndmf.ConcretePass pass) (at ./Packages/nadena.dev.ndmf/Editor/API/BuildContext.cs:337)
UnityEngine.Debug:LogException(Exception)
nadena.dev.ndmf.ErrorReport:ReportError(IError) (at ./Packages/nadena.dev.ndmf/Editor/ErrorReporting/ErrorReport.cs:161)
nadena.dev.ndmf.ErrorReport:ReportException(Exception, String) (at ./Packages/nadena.dev.ndmf/Editor/ErrorReporting/ErrorReport.cs:207)
nadena.dev.ndmf.BuildContext:RunPass(ConcretePass) (at ./Packages/nadena.dev.ndmf/Editor/API/BuildContext.cs:342)
nadena.dev.ndmf.AvatarProcessor:ProcessAvatar(BuildContext, BuildPhase, BuildPhase) (at ./Packages/nadena.dev.ndmf/Editor/AvatarProcessor.cs:198)
nadena.dev.ndmf.VRChat.BuildFrameworkPreprocessHook:OnPreprocessAvatar(GameObject) (at ./Packages/nadena.dev.ndmf/Editor/VRChat/BuildFrameworkPreprocessHook.cs:43)
VRC.SDKBase.Editor.BuildPipeline.VRCBuildPipelineCallbacks:OnPreprocessAvatar(GameObject)
nadena.dev.ndmf.ApplyOnPlay:MaybeProcessAvatar(OnDemandSource, MonoBehaviour) (at ./Packages/nadena.dev.ndmf/Editor/ApplyOnPlay.cs:95)
nadena.dev.ndmf.runtime.AvatarActivator:Awake() (at ./Packages/nadena.dev.ndmf/Runtime/ApplyOnPlayGlobalActivator.cs:179)
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:118)
The VRCSDK build was aborted because the VRCSDKPreprocessAvatarCallback 'BuildFrameworkOptimizeHook' reported a failure.
UnityEngine.Debug:LogError (object)
VRC.SDKBase.Editor.BuildPipeline.VRCBuildPipelineCallbacks:OnPreprocessAvatar (UnityEngine.GameObject)
nadena.dev.ndmf.ApplyOnPlay:MaybeProcessAvatar (nadena.dev.ndmf.runtime.ApplyOnPlayGlobalActivator/OnDemandSource,UnityEngine.MonoBehaviour) (at ./Packages/nadena.dev.ndmf/Editor/ApplyOnPlay.cs:95)
nadena.dev.ndmf.runtime.AvatarActivator:Awake () (at ./Packages/nadena.dev.ndmf/Runtime/ApplyOnPlayGlobalActivator.cs:179)
UnityEngine.GameObject:AddComponent<nadena.dev.ndmf.runtime.AvatarActivator> ()
nadena.dev.ndmf.runtime.RuntimeUtil:GetOrAddComponent<nadena.dev.ndmf.runtime.AvatarActivator> (UnityEngine.GameObject) (at ./Packages/nadena.dev.ndmf/Runtime/RuntimeUtil.cs:33)
nadena.dev.ndmf.runtime.ApplyOnPlayGlobalActivator:Awake () (at ./Packages/nadena.dev.ndmf/Runtime/ApplyOnPlayGlobalActivator.cs:118)
設定にミスがあった場合に表示してくれるやつ
ビルド前に気づけるミスはInspector上に出したほうがいい
0.3.7 の Releases ページの unitypackage と zip へのリンクが
github.com/lilxyzw/lilToon/releases/download/0.3.7/...
になってるようです。
System.InvalidOperationException: Sequence contains no elements
at System.Linq.Enumerable.Aggregate[TSource] (System.Collections.Generic.IEnumerable`1[T] source, System.Func`3[T1,T2,TResult] func) [0x00030] in <351e49e2a5bf4fd6beabb458ce2255f3>:0
at jp.lilxyzw.lilycalinventory.AnimationHelper.AddConditions (UnityEditor.Animations.AnimatorState stateDefault, UnityEditor.Animations.AnimatorState stateChanged, System.String[] bools, System.ValueTuple`3[System.String,System.Int32,System.ValueTuple`2[System.Int32,System.Boolean][]][] ints, System.Boolean isActive) [0x00001] in E:\VRC_Data\VCC_Projects\FreeForTest-Avatar\Library\PackageCache\jp.lilxyzw.lilycalinventory@3d53c2b6ab\Editor\Helper\AnimationHelper.Layer.cs:161
at jp.lilxyzw.lilycalinventory.AnimationHelper.AddMultiConditionLayer (UnityEditor.Animations.AnimatorController controller, System.Boolean hasWriteDefaultsState, UnityEngine.AnimationClip clipDefault, UnityEngine.AnimationClip clipChanged, System.String name, System.String[] bools, System.ValueTuple`3[System.String,System.Int32,System.ValueTuple`2[System.Int32,System.Boolean][]][] ints, System.Boolean isActive) [0x000d2] in E:\VRC_Data\VCC_Projects\FreeForTest-Avatar\Library\PackageCache\jp.lilxyzw.lilycalinventory@3d53c2b6ab\Editor\Helper\AnimationHelper.Layer.cs:145
at jp.lilxyzw.lilycalinventory.Modifier.ResolveMultiConditions (nadena.dev.ndmf.BuildContext ctx, UnityEditor.Animations.AnimatorController controller, System.Boolean hasWriteDefaultsState, jp.lilxyzw.lilycalinventory.runtime.ItemToggler[] togglers, jp.lilxyzw.lilycalinventory.runtime.CostumeChanger[] costumeChangers, UnityEditor.Animations.BlendTree root) [0x0049c] in E:\VRC_Data\VCC_Projects\FreeForTest-Avatar\Library\PackageCache\jp.lilxyzw.lilycalinventory@3d53c2b6ab\Editor\Processor\Modifier.ResolveMultiConditions.cs:87
at jp.lilxyzw.lilycalinventory.Processor.ModifyPreProcess (nadena.dev.ndmf.BuildContext ctx) [0x00184] in E:\VRC_Data\VCC_Projects\FreeForTest-Avatar\Library\PackageCache\jp.lilxyzw.lilycalinventory@3d53c2b6ab\Editor\Processor\Processor.cs:94
at jp.lilxyzw.lilycalinventory.LilycalInventoryPlugin+<>c.<Configure>b__4_2 (nadena.dev.ndmf.BuildContext ctx) [0x00000] in E:\VRC_Data\VCC_Projects\FreeForTest-Avatar\Library\PackageCache\jp.lilxyzw.lilycalinventory@3d53c2b6ab\Editor\NDMF\LilycalInventoryPlugin.cs:22
at nadena.dev.ndmf.AnonymousPass.Execute (nadena.dev.ndmf.BuildContext context) [0x00001] in E:\VRC_Data\VCC_Projects\FreeForTest-Avatar\Packages\nadena.dev.ndmf\Editor\API\Fluent\Pass.cs:42
at nadena.dev.ndmf.ConcretePass.Execute (nadena.dev.ndmf.BuildContext context) [0x00001] in E:\VRC_Data\VCC_Projects\FreeForTest-Avatar\Packages\nadena.dev.ndmf\Editor\API\Solver\PluginResolver.cs:36
at nadena.dev.ndmf.BuildContext.RunPass (nadena.dev.ndmf.ConcretePass pass) [0x00135] in E:\VRC_Data\VCC_Projects\FreeForTest-Avatar\Packages\nadena.dev.ndmf\Editor\API\BuildContext.cs:337
at System.Linq.Enumerable.Aggregate[TSource] (System.Collections.Generic.IEnumerable`1[T] source, System.Func`3[T1,T2,TResult] func) [0x00030] in <351e49e2a5bf4fd6beabb458ce2255f3>:0
at jp.lilxyzw.lilycalinventory.AnimationHelper.AddConditions (UnityEditor.Animations.AnimatorState stateDefault, UnityEditor.Animations.AnimatorState stateChanged, System.String[] bools, System.ValueTuple`3[System.String,System.Int32,System.ValueTuple`2[System.Int32,System.Boolean][]][] ints, System.Boolean isActive) [0x00001] in E:\VRC_Data\VCC_Projects\FreeForTest-Avatar\Library\PackageCache\jp.lilxyzw.lilycalinventory@3d53c2b6ab\Editor\Helper\AnimationHelper.Layer.cs:161
at jp.lilxyzw.lilycalinventory.AnimationHelper.AddMultiConditionLayer (UnityEditor.Animations.AnimatorController controller, System.Boolean hasWriteDefaultsState, UnityEngine.AnimationClip clipDefault, UnityEngine.AnimationClip clipChanged, System.String name, System.String[] bools, System.ValueTuple`3[System.String,System.Int32,System.ValueTuple`2[System.Int32,System.Boolean][]][] ints, System.Boolean isActive) [0x000d2] in E:\VRC_Data\VCC_Projects\FreeForTest-Avatar\Library\PackageCache\jp.lilxyzw.lilycalinventory@3d53c2b6ab\Editor\Helper\AnimationHelper.Layer.cs:145
at jp.lilxyzw.lilycalinventory.Modifier.ResolveMultiConditions (nadena.dev.ndmf.BuildContext ctx, UnityEditor.Animations.AnimatorController controller, System.Boolean hasWriteDefaultsState, jp.lilxyzw.lilycalinventory.runtime.ItemToggler[] togglers, jp.lilxyzw.lilycalinventory.runtime.CostumeChanger[] costumeChangers, UnityEditor.Animations.BlendTree root) [0x0049c] in E:\VRC_Data\VCC_Projects\FreeForTest-Avatar\Library\PackageCache\jp.lilxyzw.lilycalinventory@3d53c2b6ab\Editor\Processor\Modifier.ResolveMultiConditions.cs:87
at jp.lilxyzw.lilycalinventory.Processor.ModifyPreProcess (nadena.dev.ndmf.BuildContext ctx) [0x00184] in E:\VRC_Data\VCC_Projects\FreeForTest-Avatar\Library\PackageCache\jp.lilxyzw.lilycalinventory@3d53c2b6ab\Editor\Processor\Processor.cs:94
at jp.lilxyzw.lilycalinventory.LilycalInventoryPlugin+<>c.<Configure>b__4_2 (nadena.dev.ndmf.BuildContext ctx) [0x00000] in E:\VRC_Data\VCC_Projects\FreeForTest-Avatar\Library\PackageCache\jp.lilxyzw.lilycalinventory@3d53c2b6ab\Editor\NDMF\LilycalInventoryPlugin.cs:22
at nadena.dev.ndmf.AnonymousPass.Execute (nadena.dev.ndmf.BuildContext context) [0x00001] in E:\VRC_Data\VCC_Projects\FreeForTest-Avatar\Packages\nadena.dev.ndmf\Editor\API\Fluent\Pass.cs:42
at nadena.dev.ndmf.ConcretePass.Execute (nadena.dev.ndmf.BuildContext context) [0x00001] in E:\VRC_Data\VCC_Projects\FreeForTest-Avatar\Packages\nadena.dev.ndmf\Editor\API\Solver\PluginResolver.cs:36
at nadena.dev.ndmf.BuildContext.RunPass (nadena.dev.ndmf.ConcretePass pass) [0x00135] in E:\VRC_Data\VCC_Projects\FreeForTest-Avatar\Packages\nadena.dev.ndmf\Editor\API\BuildContext.cs:337
LI: 0.3.4
Unity: 2019.4.31f1
lilAM MaterialModifierの除外するマテリアルが機能していません
理解できる範囲で調べましたが除外を行っていると思われるEditor\Processor\Modifier.MaterialModifier.csの17行目はCloneされたマテリアルにExceptを実行しているようです
Unity 2022.3.6f1
Non-Destructive Modular Framework 1.3.4
lilAvatarModifier 0.2.0
Unity: 2022.3.6f1
LI: 0.3.4
ビルドしたところ失敗となり、以下のスタックトレースがログとして出力されました。
System.NullReferenceException: Object reference not set to an instance of an object
at jp.lilxyzw.lilycalinventory.AnimationHelper.ToClipDefault (jp.lilxyzw.lilycalinventory.runtime.MaterialPropertyModifier modifier, jp.lilxyzw.lilycalinventory.InternalClip clip) [0x00159] in .\Library\PackageCache\jp.lilxyzw.lilycalinventory@3d53c2b6ab\Editor\Helper\AnimationHelper.ParametersPerMenu.cs:155
at jp.lilxyzw.lilycalinventory.AnimationHelper.CreateClip (jp.lilxyzw.lilycalinventory.runtime.ParametersPerMenu parameter, UnityEngine.GameObject gameObject, System.String name) [0x00245] in .\Library\PackageCache\jp.lilxyzw.lilycalinventory@3d53c2b6ab\Editor\Helper\AnimationHelper.ParametersPerMenu.cs:68
at jp.lilxyzw.lilycalinventory.AnimationHelper.CreateClip (jp.lilxyzw.lilycalinventory.runtime.ParametersPerMenu parameter, nadena.dev.ndmf.BuildContext ctx, System.String name) [0x00001] in .\Library\PackageCache\jp.lilxyzw.lilycalinventory@3d53c2b6ab\Editor\Helper\AnimationHelper.ParametersPerMenu.cs:76
at jp.lilxyzw.lilycalinventory.Modifier.ApplySmoothChanger (nadena.dev.ndmf.BuildContext ctx, UnityEditor.Animations.AnimatorController controller, System.Boolean hasWriteDefaultsState, jp.lilxyzw.lilycalinventory.runtime.SmoothChanger[] changers, UnityEditor.Animations.BlendTree root, VRC.SDK3.Avatars.ScriptableObjects.VRCExpressionParameters parameters) [0x00078] in .\Library\PackageCache\jp.lilxyzw.lilycalinventory@3d53c2b6ab\Editor\Processor\Modifier.SmoothChanger.cs:37
at jp.lilxyzw.lilycalinventory.Processor.ModifyPreProcess (nadena.dev.ndmf.BuildContext ctx) [0x001bd] in .\Library\PackageCache\jp.lilxyzw.lilycalinventory@3d53c2b6ab\Editor\Processor\Processor.cs:97
at jp.lilxyzw.lilycalinventory.LilycalInventoryPlugin+<>c.<Configure>b__4_2 (nadena.dev.ndmf.BuildContext ctx) [0x00000] in .\Library\PackageCache\jp.lilxyzw.lilycalinventory@3d53c2b6ab\Editor\NDMF\LilycalInventoryPlugin.cs:22
at nadena.dev.ndmf.AnonymousPass.Execute (nadena.dev.ndmf.BuildContext context) [0x00001] in .\Packages\nadena.dev.ndmf\Editor\API\Fluent\Pass.cs:42
at nadena.dev.ndmf.ConcretePass.Execute (nadena.dev.ndmf.BuildContext context) [0x00001] in .\Packages\nadena.dev.ndmf\Editor\API\Solver\PluginResolver.cs:36
at nadena.dev.ndmf.BuildContext.RunPass (nadena.dev.ndmf.ConcretePass pass) [0x00135] in .\Packages\nadena.dev.ndmf\Editor\API\BuildContext.cs:337
at jp.lilxyzw.lilycalinventory.AnimationHelper.ToClipDefault (jp.lilxyzw.lilycalinventory.runtime.MaterialPropertyModifier modifier, jp.lilxyzw.lilycalinventory.InternalClip clip) [0x00159] in .\Library\PackageCache\jp.lilxyzw.lilycalinventory@3d53c2b6ab\Editor\Helper\AnimationHelper.ParametersPerMenu.cs:155
at jp.lilxyzw.lilycalinventory.AnimationHelper.CreateClip (jp.lilxyzw.lilycalinventory.runtime.ParametersPerMenu parameter, UnityEngine.GameObject gameObject, System.String name) [0x00245] in .\Library\PackageCache\jp.lilxyzw.lilycalinventory@3d53c2b6ab\Editor\Helper\AnimationHelper.ParametersPerMenu.cs:68
at jp.lilxyzw.lilycalinventory.AnimationHelper.CreateClip (jp.lilxyzw.lilycalinventory.runtime.ParametersPerMenu parameter, nadena.dev.ndmf.BuildContext ctx, System.String name) [0x00001] in .\Library\PackageCache\jp.lilxyzw.lilycalinventory@3d53c2b6ab\Editor\Helper\AnimationHelper.ParametersPerMenu.cs:76
at jp.lilxyzw.lilycalinventory.Modifier.ApplySmoothChanger (nadena.dev.ndmf.BuildContext ctx, UnityEditor.Animations.AnimatorController controller, System.Boolean hasWriteDefaultsState, jp.lilxyzw.lilycalinventory.runtime.SmoothChanger[] changers, UnityEditor.Animations.BlendTree root, VRC.SDK3.Avatars.ScriptableObjects.VRCExpressionParameters parameters) [0x00078] in .\Library\PackageCache\jp.lilxyzw.lilycalinventory@3d53c2b6ab\Editor\Processor\Modifier.SmoothChanger.cs:37
at jp.lilxyzw.lilycalinventory.Processor.ModifyPreProcess (nadena.dev.ndmf.BuildContext ctx) [0x001bd] in .\Library\PackageCache\jp.lilxyzw.lilycalinventory@3d53c2b6ab\Editor\Processor\Processor.cs:97
at jp.lilxyzw.lilycalinventory.LilycalInventoryPlugin+<>c.<Configure>b__4_2 (nadena.dev.ndmf.BuildContext ctx) [0x00000] in .\Library\PackageCache\jp.lilxyzw.lilycalinventory@3d53c2b6ab\Editor\NDMF\LilycalInventoryPlugin.cs:22
at nadena.dev.ndmf.AnonymousPass.Execute (nadena.dev.ndmf.BuildContext context) [0x00001] in .\Packages\nadena.dev.ndmf\Editor\API\Fluent\Pass.cs:42
at nadena.dev.ndmf.ConcretePass.Execute (nadena.dev.ndmf.BuildContext context) [0x00001] in .\Packages\nadena.dev.ndmf\Editor\API\Solver\PluginResolver.cs:36
at nadena.dev.ndmf.BuildContext.RunPass (nadena.dev.ndmf.ConcretePass pass) [0x00135] in .\Packages\nadena.dev.ndmf\Editor\API\BuildContext.cs:337
確認できていること
・メッシュ・レンダラーに項目を追加してのビルドは成功できているのを確認できています。
・再現しないアバターもありそうです。
メニュー生成処理を分けてあげれば簡単に実装できそう
"フレーム"と"コスチューム"はこれらのコンポーネントの主要な設定ですが、初期状態で畳まれているため、そこが主要な設定であると認識し辛い可能性があると思いました。
現状はコンポーネントのオフで切り替え
ビルド時にPropがItemTogglerに変換されるため問題が発生して差し戻したけど、MenuBaseComponentに[NonSerialized] internal bool forceActive = false;
みたいなプロパティを持たせて対処すればいいかも
Unity 2022.3.6f1
lilAvatarModifier 0.2.1 (UPM, zip展開両方)
本ツールをUPMからインストールし、以下の SmoothChangerのコンポーネントを設定して
SDKからBuild & Testを実行すると、以下のダイアログでUnityがクラッシュしました。
(このダイアログテキストコピーできませんでした...)
一方、README.mdに記載頂いている代替手順(zipをダウンロードし、プロジェクトのPackagesフォルダ配下に配置する)でインストールした場合、
Build&Testが通り、設定内容に対応するExpressionが組み込まれたアバターを利用できることを確認済みです。
AnimationHelper.csのAddSimpleLayer()
やAddMultiConditionLayer()
がレイヤー追加処理なのでこれを置き換える
挙動が理解できたら実装するかもだけど……ウーン
https://justsleightly.notion.site/Combining-Layers-Using-Direct-Blend-Trees-0aeabfcec3b74d348187dac2396321ab
ウッ……
合わせて各コンポーネントにHelpURLも設定したほうがいい
以下が案
AnimatorController・AnimationClip・ExpressionsMenu・ExpressionParametersの生成
アバターのFXレイヤーのAnimatorController・ExpressionsMenu・ExpressionParametersをクローン
生成したアセットをクローンしたアセットにマージ
AnimatorController内のAnimationClipとMaterial、RendererのMaterialをクローンして編集
問題点
Transforming PostProcessをいろんなプラグインの後処理にしたいけど、他ツールでマテリアルのクローンが行われるとMaterialModifierの除外機能が動作しなくなるのでつらみ……
ドキュメントを読めば分かるはずなのであまり重要ではないかもですが、
の対応が初見だと気付きづらいため、
などの方が分かりやすい気がしています。
プレビュー対象のスライダーを右に動かすと-1になり、IndexOutOfRangeExceptionになります。
発生するコンポーネントは
LI: 0.3.6
Unity: 2022.3.6f1
lilAvatarModifierは機能をそのまま表せているものの、Modifierという単語があまり一般的ではないので変えたい
補間される動作も含めて、0-1(或いは0-100%)の間の値を指定して、直接プレビューしたい可能性が高いと思いました。
タイトル通りです。
設定したいユースケースがあり得るのかもしれないと思い、起票しました。
まだベータ版なのでまあ無くても…という感じもありますが、やはり気になるのであると嬉しいかもしれません。
雰囲気な感じで良ければ、リリース時のノートから文章を持ってきてPRします!
CHANGELOG.md
CHANGELOG_JP.md
の年数表記が全て2023年になっています
一部に需要があるみたいなので投稿しておきます。(私個人としては、任意のアニメーションが利用出来る方の嬉しさは分かっていません)
オブジェクト切り替えの出現/消失アニメーションについては、AutoDresserとPorpが切り替えを担当する都合上、出現/消失パターンをツール側に組み込む形でないと適用が難しそうだと思っています。
いずれにしろ、priorityはlowだと考えています。
Unity: 2019.4.31f1
LI: 0.3.4
タイトル通りです。
AutoDresserの想定としては、どれか1つがenableで、他が全てdisableだと思いますが、ヒエラルキー上では全てenabled、または全てdisableが可能です。
この時、NDMF Error Reportにエラーが出るようになっていますが、どうやら全てがdisabledの場合はNullReferenceExceptionも一緒に出してしまうようです。
こちらは可能であれば抑制しても良い気がしました。(内部エラー扱いになってしまっているので)
ちょっと関連: #41
System.NullReferenceException: Object reference not set to an instance of an object
at jp.lilxyzw.lilycalinventory.ObjHelper.GetMenuName (jp.lilxyzw.lilycalinventory.runtime.Costume costume, jp.lilxyzw.lilycalinventory.runtime.CostumeChanger changer) [0x00001] in .\Library\PackageCache\jp.lilxyzw.lilycalinventory@5b6316fc38\Editor\Helper\ObjHelper.Component.cs:20
at jp.lilxyzw.lilycalinventory.ObjHelper.ResolveMenuName (jp.lilxyzw.lilycalinventory.runtime.CostumeChanger[] changers) [0x00021] in .\Library\PackageCache\jp.lilxyzw.lilycalinventory@5b6316fc38\Editor\Helper\ObjHelper.Component.cs:46
at jp.lilxyzw.lilycalinventory.Processor.FindComponent (nadena.dev.ndmf.BuildContext ctx) [0x00175] in .\Library\PackageCache\jp.lilxyzw.lilycalinventory@5b6316fc38\Editor\Processor\Processor.cs:63
at jp.lilxyzw.lilycalinventory.LilycalInventoryPlugin+<>c.<Configure>b__4_0 (nadena.dev.ndmf.BuildContext ctx) [0x00000] in .\Library\PackageCache\jp.lilxyzw.lilycalinventory@5b6316fc38\Editor\NDMF\LilycalInventoryPlugin.cs:18
at nadena.dev.ndmf.AnonymousPass.Execute (nadena.dev.ndmf.BuildContext context) [0x00001] in .\Packages\nadena.dev.ndmf\Editor\API\Fluent\Pass.cs:42
at nadena.dev.ndmf.ConcretePass.Execute (nadena.dev.ndmf.BuildContext context) [0x00001] in .\Packages\nadena.dev.ndmf\Editor\API\Solver\PluginResolver.cs:36
at nadena.dev.ndmf.BuildContext.RunPass (nadena.dev.ndmf.ConcretePass pass) [0x00135] in .\Packages\nadena.dev.ndmf\Editor\API\BuildContext.cs:337
at jp.lilxyzw.lilycalinventory.ObjHelper.GetMenuName (jp.lilxyzw.lilycalinventory.runtime.Costume costume, jp.lilxyzw.lilycalinventory.runtime.CostumeChanger changer) [0x00001] in .\Library\PackageCache\jp.lilxyzw.lilycalinventory@5b6316fc38\Editor\Helper\ObjHelper.Component.cs:20
at jp.lilxyzw.lilycalinventory.ObjHelper.ResolveMenuName (jp.lilxyzw.lilycalinventory.runtime.CostumeChanger[] changers) [0x00021] in .\Library\PackageCache\jp.lilxyzw.lilycalinventory@5b6316fc38\Editor\Helper\ObjHelper.Component.cs:46
at jp.lilxyzw.lilycalinventory.Processor.FindComponent (nadena.dev.ndmf.BuildContext ctx) [0x00175] in .\Library\PackageCache\jp.lilxyzw.lilycalinventory@5b6316fc38\Editor\Processor\Processor.cs:63
at jp.lilxyzw.lilycalinventory.LilycalInventoryPlugin+<>c.<Configure>b__4_0 (nadena.dev.ndmf.BuildContext ctx) [0x00000] in .\Library\PackageCache\jp.lilxyzw.lilycalinventory@5b6316fc38\Editor\NDMF\LilycalInventoryPlugin.cs:18
at nadena.dev.ndmf.AnonymousPass.Execute (nadena.dev.ndmf.BuildContext context) [0x00001] in .\Packages\nadena.dev.ndmf\Editor\API\Fluent\Pass.cs:42
at nadena.dev.ndmf.ConcretePass.Execute (nadena.dev.ndmf.BuildContext context) [0x00001] in .\Packages\nadena.dev.ndmf\Editor\API\Solver\PluginResolver.cs:36
at nadena.dev.ndmf.BuildContext.RunPass (nadena.dev.ndmf.ConcretePass pass) [0x00135] in .\Packages\nadena.dev.ndmf\Editor\API\BuildContext.cs:337
System.NullReferenceException: Object reference not set to an instance of an object
at jp.lilxyzw.lilycalinventory.AnimationHelper.GatherConditions (jp.lilxyzw.lilycalinventory.runtime.CostumeChanger[] costumeChangers, System.Collections.Generic.Dictionary`2[TKey,TValue] dic) [0x00015] in .\Library\PackageCache\jp.lilxyzw.lilycalinventory@5b6316fc38\Editor\Helper\AnimationHelper.ParametersPerMenu.cs:276
at jp.lilxyzw.lilycalinventory.Modifier.ResolveMultiConditions (nadena.dev.ndmf.BuildContext ctx, UnityEditor.Animations.AnimatorController controller, System.Boolean hasWriteDefaultsState, jp.lilxyzw.lilycalinventory.runtime.ItemToggler[] togglers, jp.lilxyzw.lilycalinventory.runtime.CostumeChanger[] costumeChangers, UnityEditor.Animations.BlendTree root) [0x0001b] in .\Library\PackageCache\jp.lilxyzw.lilycalinventory@5b6316fc38\Editor\Processor\Modifier.ResolveMultiConditions.cs:23
at jp.lilxyzw.lilycalinventory.Processor.ModifyPreProcess (nadena.dev.ndmf.BuildContext ctx) [0x001a8] in .\Library\PackageCache\jp.lilxyzw.lilycalinventory@5b6316fc38\Editor\Processor\Processor.cs:100
at jp.lilxyzw.lilycalinventory.LilycalInventoryPlugin+<>c.<Configure>b__4_2 (nadena.dev.ndmf.BuildContext ctx) [0x00000] in .\Library\PackageCache\jp.lilxyzw.lilycalinventory@5b6316fc38\Editor\NDMF\LilycalInventoryPlugin.cs:22
at nadena.dev.ndmf.AnonymousPass.Execute (nadena.dev.ndmf.BuildContext context) [0x00001] in .\Packages\nadena.dev.ndmf\Editor\API\Fluent\Pass.cs:42
at nadena.dev.ndmf.ConcretePass.Execute (nadena.dev.ndmf.BuildContext context) [0x00001] in .\Packages\nadena.dev.ndmf\Editor\API\Solver\PluginResolver.cs:36
at nadena.dev.ndmf.BuildContext.RunPass (nadena.dev.ndmf.ConcretePass pass) [0x00135] in .\Packages\nadena.dev.ndmf\Editor\API\BuildContext.cs:337
at jp.lilxyzw.lilycalinventory.AnimationHelper.GatherConditions (jp.lilxyzw.lilycalinventory.runtime.CostumeChanger[] costumeChangers, System.Collections.Generic.Dictionary`2[TKey,TValue] dic) [0x00015] in .\Library\PackageCache\jp.lilxyzw.lilycalinventory@5b6316fc38\Editor\Helper\AnimationHelper.ParametersPerMenu.cs:276
at jp.lilxyzw.lilycalinventory.Modifier.ResolveMultiConditions (nadena.dev.ndmf.BuildContext ctx, UnityEditor.Animations.AnimatorController controller, System.Boolean hasWriteDefaultsState, jp.lilxyzw.lilycalinventory.runtime.ItemToggler[] togglers, jp.lilxyzw.lilycalinventory.runtime.CostumeChanger[] costumeChangers, UnityEditor.Animations.BlendTree root) [0x0001b] in .\Library\PackageCache\jp.lilxyzw.lilycalinventory@5b6316fc38\Editor\Processor\Modifier.ResolveMultiConditions.cs:23
at jp.lilxyzw.lilycalinventory.Processor.ModifyPreProcess (nadena.dev.ndmf.BuildContext ctx) [0x001a8] in .\Library\PackageCache\jp.lilxyzw.lilycalinventory@5b6316fc38\Editor\Processor\Processor.cs:100
at jp.lilxyzw.lilycalinventory.LilycalInventoryPlugin+<>c.<Configure>b__4_2 (nadena.dev.ndmf.BuildContext ctx) [0x00000] in .\Library\PackageCache\jp.lilxyzw.lilycalinventory@5b6316fc38\Editor\NDMF\LilycalInventoryPlugin.cs:22
at nadena.dev.ndmf.AnonymousPass.Execute (nadena.dev.ndmf.BuildContext context) [0x00001] in .\Packages\nadena.dev.ndmf\Editor\API\Fluent\Pass.cs:42
at nadena.dev.ndmf.ConcretePass.Execute (nadena.dev.ndmf.BuildContext context) [0x00001] in .\Packages\nadena.dev.ndmf\Editor\API\Solver\PluginResolver.cs:36
at nadena.dev.ndmf.BuildContext.RunPass (nadena.dev.ndmf.ConcretePass pass) [0x00135] in .\Packages\nadena.dev.ndmf\Editor\API\BuildContext.cs:337
現在はビルド時のNDMF Error Reportでしか確認することが出来ませんが、ビルドする前にコンポーネント上で表示されていれば分かりやすくて良さそうだと思いました。(AutoDresser)
lilycalInventory 0.3.0
Unity 2022.3.6f1
任意のオブジェクトにLI Propを追加して、オブジェクトのオンオフを展開させました。
+ボタン、-ボタン、チェックボックス入力等のUIが正常に動作していないように見えます。
・+ボタンを押すと、空の入力欄に加えてもう一つ入力欄が追加された
・入力欄にオブジェクトをドロップすると入力欄が追加された
・チェックボックスOFFで入力欄が追加された
・-ボタンで入力欄が削除されない
ユーザーは、VCC等でパッケージ管理画面を見ない限り、更新されたことに気付かない可能性があります。
そのため、lilToonのようにコンポーネント上にバージョン情報を表示するか、AAOのようにNDMF Error Reportにinfoとしてバージョンが古い旨を知らせる(より新しいバージョンがあることを知らせる)機能があると良さそうです。
(あっても見ない人は居るかもしれませんが…無いよりは良いかと思います)
AnimationClipをマージしようとすると重いため
1フレームしかないので型を自作したほうがよさそう
アニメーション生成プロセスを変えた方がいいかも
Dictionary<操作対象, List<(パラメーター名, List<遷移条件>)>>
みたいな)Dictionary<条件, List<操作対象>>
)LI: 0.3.6
Unity: 2022.3.6f1
非破壊ツールなのでコンポーネントにもロゴを適用したい
となると視認性がかなり必要
ロゴは #7 が解決してから
CostumeChanger において、各コスチュームで操作する対象 (GameObject や Renderer など) が同じで値 (オンオフやマテリアルなど) だけ異なる場合に、コスチュームごとに同じ対象を設定するのが少し煩雑に感じたので、先に対象だけ設定してコスチュームごとには値だけ設定できるようなモードあるいは別コンポーネントがあると便利そうだと思いました。
Inspector のイメージとしては、今の CostumeChanger でこうなるところを、
- コスチューム_A
- Renderer_X のマテリアル ← Material_0
- Renderer_Y のマテリアル ← Material_1
- Renderer_Z のマテリアル ← Material_2
- コスチューム_B
- Renderer_X のマテリアル ← Material_3
- Renderer_Y のマテリアル ← Material_4
- Renderer_Z のマテリアル ← Material_5
- コスチューム_C
- Renderer_X のマテリアル ← Material_6
- Renderer_Y のマテリアル ← Material_7
- Renderer_Z のマテリアル ← Material_8
こうできたらなという感じです。
- 操作対象
- Renderer_X のマテリアル
- Renderer_Y のマテリアル
- Renderer_Z のマテリアル
- コスチューム_A
- (ここでは表示だけ: Renderer_X のマテリアル) ← Material_0
- (ここでは表示だけ: Renderer_Y のマテリアル) ← Material_1
- (ここでは表示だけ: Renderer_Z のマテリアル) ← Material_2
- コスチューム_B
- (ここでは表示だけ: Renderer_X のマテリアル) ← Material_3
- (ここでは表示だけ: Renderer_Y のマテリアル) ← Material_4
- (ここでは表示だけ: Renderer_Z のマテリアル) ← Material_5
- コスチューム_C
- (ここでは表示だけ: Renderer_X のマテリアル) ← Material_6
- (ここでは表示だけ: Renderer_Y のマテリアル) ← Material_7
- (ここでは表示だけ: Renderer_Z のマテリアル) ← Material_8
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.