Git Product home page Git Product logo

lilycalinventory's Introduction

lilycalinventory's People

Contributors

lilxyzw avatar nekobako avatar lonelyicer avatar

Stargazers

 avatar  avatar Miharup avatar nukora avatar n.kanno avatar colloid avatar KakeyamaY avatar つきみ avatar こけっち avatar mimos avatar sora_shi avatar  avatar Azukimochi avatar Gizmo avatar  avatar koke / ni rila avatar kobi32768 avatar miwpayou avatar Reina_Sakiria avatar Kisaragi avatar  avatar Aqraf.7z avatar 堕電 avatar kabia avatar  avatar 水音 凪 avatar  avatar hogashi avatar

Watchers

 avatar Kisaragi avatar  avatar

lilycalinventory's Issues

親子でLI PropやAutoDresser等が付いている場合に、親にLI MenuFolderを付けられるようにして欲しい

状況

衣装や小物を切り替えたいが、その中にも切り替えられるパーツがあるような場合は、親子で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の場合を主に考慮すれば良いのかもしれません?)

メニュー管理ウィンドウが欲しい

LI AutoDresserやLI Propといった、"コンポーネントを付けるだけ"で概ね設定が完了する方式はとても興味深く、良いシステムだと思います。
反面、設定箇所が散らばってしまって管理しづらいケースも想定され、設定内容を一覧するためのウィンドウがあっても良いなという考えに行き当たります。

或いは、コンポーネントに馴染みのないユーザーは、メニューを組み上げるイメージで設定を行いたい可能性があります。(NDMF以前のツールはこの形式が多いと認識しています)
prefabを活用した非破壊改変においては、こちらのケースでも設定内容をコンポーネントに保存する必要がありますが、コンポーネント式管理とは少し方向性の異なる内容だと思います。

これら2つについて考えてみます。

1. 設定したコンポーネントを一覧するためのウィンドウ

このウィンドウでは、各コンポーネントで設定した内容を一覧することになります。
表示するだけが目的であれば、Menu Folderのプレビューのように表示すれば良いですし、並べ替えなどの設定変更も可能にする場合は2のケースに話が近付いてきます。
内容例:

  • メニュー(アイコン/名前)
  • メニューの階層構造表示 (メニュー自体の有効/無効を示すチェックボックスをそれぞれに出す。なお、MA Menu Itemを親にすることが出来るため、MAのメニュー項目ごと表示するか、または各Menu Itemを親として表示するだけで留めるかが想定されます)
  • 項目の動作(切り替え対象の表示やローカル限定、保存有無などを示すチェックボックス等)
  • 各項目のプレビュー機能? (GestureManagerやAv3Emulatorで十分という見方が出来ます)
  • 当該設定コンポーネントへの誘導

2. メニューを組み上げるイメージで設定するためのウィンドウ

  • Related?: #27

1のような自由な階層構造と異なり、各メニューの親となるフォルダを作ってその中のメニュー項目を作成/設定という2段構造を想定したRISライクなUIです。
設定保存用のコンポーネントにはCostumeChangerやItemTogglerを用いることを想定しています。
また、親メニューとメニュー項目の表示は、それぞれReorderableListを想定します。

今私が考えているイメージは2つあります。

  1. 親メニューは名前だけ並べ、メニューのアイコン等はメニュー項目一覧の上部で設定する方法
親メニュー メニュー項目 メニュー設定
≡親メニュー名A 選択中の親メニューの設定(アイコン等と、排他orトグル) 選択中のメニュー項目の設定
≡親メニュー名B ≡メニュー項目名1 メニュー名やアイコン等の設定等
≡親メニュー名C ≡メニュー項目名2 オブジェクトのオンオフは
初めから展開しておいて欲しいです
  1. メニュー名やアイコン等も一緒にリストの中で表示/設定する方法
親メニュー メニュー項目 メニュー設定
≡親メニューA(名前やアイコン等と、排他orトグル) 選択中の親メニュー名 選択中のメニュー項目の設定
≡親メニューB(名前やアイコン等と、排他orトグル) ≡メニュー項目1(名前やアイコン) 切り替え対象の設定等
≡親メニューC(名前やアイコン等と、排他orトグル) ≡メニュー項目2(名前やアイコン) オブジェクトのオンオフは
初めから展開しておいて欲しいです

1は現在のLIのコンポーネントに近い設定UIになると思います。
2は現在の設定UIとは少し離れたものになりますが、私はかなりこちら推しです(設定しやすさがこちらの方が良いかな?と…)

切り替え対象のオブジェクトを纏めて追加出来るように等、UI改善案

幾つか思いついた改善案を投げてみます。参考画像はAutoDresserですが、恐らく他のコンポーネントでも同様です。

  1. "オブジェクトのオンオフ"に物を追加したい場合、現在は1つずつ+ボタンで枠を追加してからセットする必要があります。
    これを、複数オブジェクトが纏めてドラッグすることで、(0個の状態からでも)纏めて増やせるようになっていると便利です。
    現状の並び替え可能なUIとは微妙に共存が難しいかもしれません。(UI Elementsでの実装例を見た記憶が無いため)
    ("マテリアルの置き換え"等のRendererを入れる場所でも、つまりHierarchyから纏めて入れられるものであれば全て同様かも…?)

  2. "BlendShapeの切り替え"について、"メッシュ"の中には"切り替えるBlendShapeと値"しかなく、"メッシュ"自体にもfoldoutが付いているため、"切り替えるBlendShapeと値"の方にはfoldoutが不要なように思います。
    現状でBlendShapeの切り替え対象を増やす場合、メッシュをセットし、foldoutを開き、"切り替えるBlendShapeと値"のfoldoutを更に開いてから編集する必要があり、恐らく少し不便です。

  3. "マテリアルの置き換え"の中の、各メッシュごとにfoldoutがありますが、これは不要なように思います。
    メッシュとマテリアル1つずつしか幅を取らないため、増える手間の方が大きそうな気がします。

現在(0.3.5)のUI

image

CostumeChangerのマテリアルの置き換えを指定して実行するとエラーになる

lilAvatarModifier 0.2.2
Unity 2022.3.6f1

アバター内に新しいオブジェクトを作成、そのオブジェクトにCostumeChangerコンポーネントを追加しました。
コスチュームの+ボタン、マテリアルの置き換えの+ボタンを押し、Rendererを適当に指定しました。

この状況でプレイするとエラーが発生しました。

3.mp4
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.Func2[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上に出したほうがいい

メニューが重複した際にInvalidOperationException?

  1. LI Propを付けた同名のGameObjectを用意する。
  2. テストビルド
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の除外するマテリアルが機能していません

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


以下のLL SmoothChangerを定義し、
image

ビルドしたところ失敗となり、以下のスタックトレースがログとして出力されました。

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 

確認できていること
・メッシュ・レンダラーに項目を追加してのビルドは成功できているのを確認できています。
・再現しないアバターもありそうです。

UPMでインストールしたパッケージでlilAM SmoothChanger1個のアバターをビルドするとクラッシュする

Unity 2022.3.6f1
lilAvatarModifier 0.2.1 (UPM, zip展開両方)


本ツールをUPMからインストールし、以下の SmoothChangerのコンポーネントを設定して

image

SDKからBuild & Testを実行すると、以下のダイアログでUnityがクラッシュしました。

image

(このダイアログテキストコピーできませんでした...)

一方、README.mdに記載頂いている代替手順(zipをダウンロードし、プロジェクトのPackagesフォルダ配下に配置する)でインストールした場合、
Build&Testが通り、設定内容に対応するExpressionが組み込まれたアバターを利用できることを確認済みです。

アニメーション生成・既存アセットへのマージを別プロセスに分離して競合しにくくする

以下が案

Generating

AnimatorController・AnimationClip・ExpressionsMenu・ExpressionParametersの生成

Transforming PreProcess

アバターのFXレイヤーのAnimatorController・ExpressionsMenu・ExpressionParametersをクローン
生成したアセットをクローンしたアセットにマージ

Transforming PostProcess

AnimatorController内のAnimationClipとMaterial、RendererのMaterialをクローンして編集

問題点
Transforming PostProcessをいろんなプラグインの後処理にしたいけど、他ツールでマテリアルのクローンが行われるとMaterialModifierの除外機能が動作しなくなるのでつらみ……

対応関係にあるコンポーネントの名前について

ドキュメントを読めば分かるはずなのであまり重要ではないかもですが、

  • LI ItemToggler と LI Prop
  • LI CostumeChanger と LI AutoDresser

の対応が初見だと気付きづらいため、

  • LI Props と LI AutoProp
  • LI Dresses と LI AutoDress

などの方が分かりやすい気がしています。

プレビュー機能等でIndexOutOfRangeExceptionが発生する場合がある

プレビュー対象のスライダーを右に動かすと-1になり、IndexOutOfRangeExceptionになります。

発生するコンポーネントは

  • CostumeChanger
    スライダーを動かせるため、発生します。CostumeChangerが複数あっても変わらず0~-1しか変えられません。
  • Prop
    初めの1つを追加すると発生します。スライダー等はありません。
  • SmoothChanger
    開いた時点では「プレビューするフレーム」の行が無く、フレームを加えずにフレームの初期値を右にスライド(最大1まで動きますが、0以外ならOK)すると、プレビューするフレームの行が出現し、スライダーを右に動かすと-1になるため同現象が発生します。

LI: 0.3.6
Unity: 2022.3.6f1

ツールの名前をもっといい感じに

lilAvatarModifierは機能をそのまま表せているものの、Modifierという単語があまり一般的ではないので変えたい

候補

  • lilMagicalInventory
  • lilMagicalPocket
  • lilMagicalToybox

changelogが欲しい

まだベータ版なのでまあ無くても…という感じもありますが、やはり気になるのであると嬉しいかもしれません。
雰囲気な感じで良ければ、リリース時のノートから文章を持ってきてPRします!

各メニューの有効化時/無効化時に任意のアニメーションを再生する機能、またはオブジェクトの出現/消失アニメーションの生成

一部に需要があるみたいなので投稿しておきます。(私個人としては、任意のアニメーションが利用出来る方の嬉しさは分かっていません)

オブジェクト切り替えの出現/消失アニメーションについては、AutoDresserとPorpが切り替えを担当する都合上、出現/消失パターンをツール側に組み込む形でないと適用が難しそうだと思っています。

いずれにしろ、priorityはlowだと考えています。

LI Comment上でEditor Languageを変更すると、"メッセージの種類"の選択欄が表示されなくなる

現象

  • LI CommentのInspector表示中に、LI Comment上のプルダウンからEditor Languageを変更すると、メッセージ編集時の「メッセージの種類」の選択欄が出なくなる
  • LI Comment以外のLIコンポーネントで言語を変更しても本現象は発生しない
  • 言語の変更を行うタイミングが編集中であるかどうかに関わらず、本現象は発生する
  • 別のObjectを選択するなどしてInspectorを再表示すると再び「メッセージの種類」の欄が表示されるようになる

環境

Unity: 2019.4.31f1
LI: 0.3.4

AutoDresser対象Objが全部disabledの時、NullReferenceException

タイトル通りです。
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 

マテリアルのプロパティ操作を設定し、且つメッシュレンダラーを指定している場合、プレビュー開始時に操作するプロパティ値が変更される。

Unity: 2022.3.6f1
LI: 0.3.4


1枚目:ストップ状態で下記の様に設定
image
2枚目:プレビューボタン押下後、 _Color の値が変更される。
image

・プレビュー中に再設定をしようと値を変更しても、フォーカスを外した瞬間に再変更されていました。
・ストップ状態にすれば再設定可能
・ストップ状態で設定した上でビルドすれば、設定内容通りのプロパティ調整ができていました。

オブジェクトのオンオフ機能のリストビューが正常に動作していないように見える

lilycalInventory 0.3.0
Unity 2022.3.6f1

任意のオブジェクトにLI Propを追加して、オブジェクトのオンオフを展開させました。
+ボタン、-ボタン、チェックボックス入力等のUIが正常に動作していないように見えます。

・+ボタンを押すと、空の入力欄に加えてもう一つ入力欄が追加された
・入力欄にオブジェクトをドロップすると入力欄が追加された
・チェックボックスOFFで入力欄が追加された
・-ボタンで入力欄が削除されない

5.mp4

バージョンチェック/お知らせ機能の追加

ユーザーは、VCC等でパッケージ管理画面を見ない限り、更新されたことに気付かない可能性があります。
そのため、lilToonのようにコンポーネント上にバージョン情報を表示するか、AAOのようにNDMF Error Reportにinfoとしてバージョンが古い旨を知らせる(より新しいバージョンがあることを知らせる)機能があると良さそうです。
(あっても見ない人は居るかもしれませんが…無いよりは良いかと思います)

複数コンポーネントから同一オブジェクトが操作される場合の対処

アニメーション生成プロセスを変えた方がいいかも

  1. 各コンポーネントから対象オブジェクトと条件を収集(Dictionary<操作対象, List<(パラメーター名, List<遷移条件>)>>みたいな)
  2. 作ったDictionaryを整理(Dictionary<条件, List<操作対象>>
  3. 2で作ったDictionaryからAnimationClipとLayerを作成

BlendShapeの切り替えを追加する際、メッシュを入れたタイミングではBlendShapeがサジェストされない

  1. 何らかの切り替え対象を用意する
  2. AutoDresserを付ける(例として)
  3. BlendShapeの切り替え対象を1つ増やし、メッシュをセット
  4. 追加を押すと名前が空で値が0(赤字)の項目が追加されてしまう
  5. Inspectorを別Objectに変えてから戻ってきて、再度追加を押すとBlnedShapeが正常にサジェストされる

LI: 0.3.6
Unity: 2022.3.6f1

ロゴの作成

非破壊ツールなのでコンポーネントにもロゴを適用したい
となると視認性がかなり必要
ロゴは #7 が解決してから

CostumeChanger の操作対象の指定方法について

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

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.