diff --git a/Components/Editor/AvatarMenuCreatorBaseEditor.cs b/Components/Editor/AvatarMenuCreatorBaseEditor.cs index 3210ef8..758e815 100644 --- a/Components/Editor/AvatarMenuCreatorBaseEditor.cs +++ b/Components/Editor/AvatarMenuCreatorBaseEditor.cs @@ -150,7 +150,7 @@ void OnInspectorGUISingle() { EditorGUILayout.HelpBox(T.アセットからの復元機能は高度な設定に対応していません_n_生成後のアセットから設定を復元することは出来ません, MessageType.Warning); } - EditorGUI.BeginDisabledGroup(Creator.AvatarMenu.IncludeAssetType == IncludeAssetType.Component); + EditorGUI.BeginDisabledGroup(Creator.AvatarMenu.IncludeAssetType == IncludeAssetType.Component || baseObject == null); if (GUILayout.Button(hasAssets ? T.この設定でアセットを再生成 : T.この設定でアセットを生成)) { var prefabPath = AssetDatabase.GetAssetPath(Creator.gameObject); @@ -164,7 +164,7 @@ void OnInspectorGUISingle() return; } var (basePath, baseName) = Util.GetBasePathAndNameFromPrefabPath(prefabPath); - var createAvatarMenu = CreateAvatarMenuBase.GetCreateAvatarMenu(Creator.AvatarMenu); + var createAvatarMenu = CreateAvatarMenuBase.GetCreateAvatarMenu(baseObject.transform, Creator.AvatarMenu); createAvatarMenu.CreateAssets(baseName).SaveAssets(Creator.AvatarMenu.IncludeAssetType, basePath, (prefab) => CreateAvatarMenuBase.GetOrAddMenuCreatorComponent(prefab, Creator.AvatarMenu, true)); } EditorGUI.EndDisabledGroup(); diff --git a/Components/Editor/AvatarMenuCreatorPlugin.cs b/Components/Editor/AvatarMenuCreatorPlugin.cs index 0d152e1..b3e9b3d 100644 --- a/Components/Editor/AvatarMenuCreatorPlugin.cs +++ b/Components/Editor/AvatarMenuCreatorPlugin.cs @@ -20,7 +20,7 @@ protected override void Configure() foreach (var creator in creators) { if (!creator.IsEffective) continue; - CreateAvatarMenuBase.GetCreateAvatarMenu(creator.AvatarMenu).CreateAssets(creator.name).StoreAssets(creator.gameObject, false); + CreateAvatarMenuBase.GetCreateAvatarMenu(ctx.AvatarRootTransform, creator.AvatarMenu).CreateAssets(creator.name).StoreAssets(creator.gameObject, false); UnityEngine.Object.DestroyImmediate(creator); } }); diff --git a/Editor/AvatarMenuCreatorForMA.cs b/Editor/AvatarMenuCreatorForMA.cs index 8ecfd2c..be841a2 100644 --- a/Editor/AvatarMenuCreatorForMA.cs +++ b/Editor/AvatarMenuCreatorForMA.cs @@ -238,7 +238,7 @@ void OnGUI() var prefabPath = EditorUtility.SaveFilePanelInProject(T.保存場所, "New Menu", "prefab", T.保存場所, SaveFolder); if (string.IsNullOrEmpty(prefabPath)) return; var (basePath, baseName) = Util.GetBasePathAndNameFromPrefabPath(prefabPath); - var createAvatarMenu = CreateAvatarMenuBase.GetCreateAvatarMenu(avatarMenu); + var createAvatarMenu = CreateAvatarMenuBase.GetCreateAvatarMenu(VRCAvatarDescriptor.transform, avatarMenu); createAvatarMenu.CreateAssets(baseName, children).SaveAssets(IncludeAssetType, basePath, modifyPrefab); SaveFolder = System.IO.Path.GetDirectoryName(basePath); } diff --git a/Editor/CreateAvatarChooseMenu.cs b/Editor/CreateAvatarChooseMenu.cs index aea8a92..053f03c 100644 --- a/Editor/CreateAvatarChooseMenu.cs +++ b/Editor/CreateAvatarChooseMenu.cs @@ -15,7 +15,7 @@ namespace net.narazaka.avatarmenucreator.editor public class CreateAvatarChooseMenu : CreateAvatarMenuBase { AvatarChooseMenu AvatarMenu; - public CreateAvatarChooseMenu(AvatarChooseMenu avatarChooseMenu) => AvatarMenu = avatarChooseMenu; + public CreateAvatarChooseMenu(Transform avatarRoot, AvatarChooseMenu avatarChooseMenu) : base(avatarRoot) => AvatarMenu = avatarChooseMenu; public override CreatedAssets CreateAssets(string baseName, IEnumerable children = null) { @@ -40,7 +40,7 @@ public override CreatedAssets CreateAssets(string baseName, IEnumerable var curveName = $"m_Materials.Array.data[{index}]"; for (var i = 0; i < AvatarMenu.ChooseCount; ++i) { - AnimationUtility.SetObjectReferenceCurve(choices[i], EditorCurveBinding.PPtrCurve(curvePath, typeof(Renderer), curveName), new ObjectReferenceKeyframe[] { new ObjectReferenceKeyframe { time = 0, value = value.ContainsKey(i) ? value[i] : null } }); + AnimationUtility.SetObjectReferenceCurve(choices[i], EditorCurveBinding.PPtrCurve(curvePath, GetRendererTypeByPath(child), curveName), new ObjectReferenceKeyframe[] { new ObjectReferenceKeyframe { time = 0, value = value.ContainsKey(i) ? value[i] : null } }); } } foreach (var (child, name) in AvatarMenu.ChooseBlendShapes.Keys) @@ -62,14 +62,14 @@ public override CreatedAssets CreateAssets(string baseName, IEnumerable var curveName = $"material.{name}"; for (var i = 0; i < AvatarMenu.ChooseCount; ++i) { - choices[i].SetCurve(curvePath, typeof(Renderer), curveName, new AnimationCurve(new Keyframe(0, value.ContainsKey(i) ? value[i] : 0))); + choices[i].SetCurve(curvePath, GetRendererTypeByPath(child), curveName, new AnimationCurve(new Keyframe(0, value.ContainsKey(i) ? value[i] : 0))); } } foreach (var (child, name) in AvatarMenu.ChooseShaderVectorParameters.Keys) { if (!matchGameObjects.Contains(child)) continue; var value = AvatarMenu.ChooseShaderVectorParameters[(child, name)]; - SetVector4Curve(choices, typeof(Renderer), child, $"material.{name}", value); + SetVector4Curve(choices, GetRendererTypeByPath(child), child, $"material.{name}", value); } foreach (var (child, member) in AvatarMenu.ChooseValues.Keys) { diff --git a/Editor/CreateAvatarMenuBase.cs b/Editor/CreateAvatarMenuBase.cs index f67114b..96a0102 100644 --- a/Editor/CreateAvatarMenuBase.cs +++ b/Editor/CreateAvatarMenuBase.cs @@ -10,21 +10,25 @@ namespace net.narazaka.avatarmenucreator.editor { public abstract class CreateAvatarMenuBase { - public static CreateAvatarMenuBase GetCreateAvatarMenu(T avatarMenu) where T : AvatarMenuBase + public static CreateAvatarMenuBase GetCreateAvatarMenu(Transform avatarRoot, T avatarMenu) where T : AvatarMenuBase { switch (avatarMenu) { case AvatarChooseMenu avatarChooseMenu: - return new CreateAvatarChooseMenu(avatarChooseMenu); + return new CreateAvatarChooseMenu(avatarRoot, avatarChooseMenu); case AvatarToggleMenu avatarToggleMenu: - return new CreateAvatarToggleMenu(avatarToggleMenu); + return new CreateAvatarToggleMenu(avatarRoot, avatarToggleMenu); case AvatarRadialMenu avatarSliderMenu: - return new CreateAvatarRadialMenu(avatarSliderMenu); + return new CreateAvatarRadialMenu(avatarRoot, avatarSliderMenu); default: throw new System.ArgumentException($"unknown avatar menu type {avatarMenu.GetType()}"); } } + Transform AvatarRoot; + + protected CreateAvatarMenuBase(Transform avatarRoot) => AvatarRoot = avatarRoot; + public abstract CreatedAssets CreateAssets(string baseName, IEnumerable children = null); #if NET_NARAZAKA_VRCHAT_AvatarMenuCreator_HAS_NDMF && !NET_NARAZAKA_VRCHAT_AvatarMenuCreator_HAS_NO_MENU_MA @@ -61,6 +65,20 @@ public static AvatarMenuCreatorBase GetOrAddMenuCreatorComponentOnly(GameObject throw new System.ArgumentException($"unknown menu type"); } } + + Transform GetByPath(string path) + { + return AvatarRoot.Find(path); + } + + protected System.Type GetRendererTypeByPath(string path) + { + var obj = GetByPath(path); + if (obj == null) return typeof(Renderer); + var component = obj.GetComponent(); + if (component == null) return typeof(Renderer); + return component.GetType(); + } #endif } } \ No newline at end of file diff --git a/Editor/CreateAvatarRadialMenu.cs b/Editor/CreateAvatarRadialMenu.cs index 695ab33..ebba540 100644 --- a/Editor/CreateAvatarRadialMenu.cs +++ b/Editor/CreateAvatarRadialMenu.cs @@ -13,7 +13,7 @@ namespace net.narazaka.avatarmenucreator.editor public class CreateAvatarRadialMenu : CreateAvatarMenuBase { AvatarRadialMenu AvatarMenu; - public CreateAvatarRadialMenu(AvatarRadialMenu avatarRadialMenu) => AvatarMenu = avatarRadialMenu; + public CreateAvatarRadialMenu(Transform avatarRoot, AvatarRadialMenu avatarRadialMenu) : base(avatarRoot) => AvatarMenu = avatarRadialMenu; public override CreatedAssets CreateAssets(string baseName, IEnumerable children = null) { @@ -32,13 +32,13 @@ public override CreatedAssets CreateAssets(string baseName, IEnumerable { if (!matchGameObjects.Contains(child)) continue; var value = AvatarMenu.RadialShaderParameters[(child, name)]; - clip.SetCurve(child, typeof(Renderer), $"material.{name}", FullAnimationCurve(new Keyframe(value.StartOffsetPercent, value.Start), new Keyframe(value.EndOffsetPercent, value.End))); + clip.SetCurve(child, GetRendererTypeByPath(child), $"material.{name}", FullAnimationCurve(new Keyframe(value.StartOffsetPercent, value.Start), new Keyframe(value.EndOffsetPercent, value.End))); } foreach (var (child, name) in AvatarMenu.RadialShaderVectorParameters.Keys) { if (!matchGameObjects.Contains(child)) continue; var value = AvatarMenu.RadialShaderVectorParameters[(child, name)]; - SetVector4Curve(clip, typeof(Renderer), child, $"material.{name}", value); + SetVector4Curve(clip, GetRendererTypeByPath(child), child, $"material.{name}", value); } foreach (var (child, member) in AvatarMenu.RadialValues.Keys) { diff --git a/Editor/CreateAvatarToggleMenu.cs b/Editor/CreateAvatarToggleMenu.cs index 7f74bd6..13e9520 100644 --- a/Editor/CreateAvatarToggleMenu.cs +++ b/Editor/CreateAvatarToggleMenu.cs @@ -13,7 +13,7 @@ namespace net.narazaka.avatarmenucreator.editor public class CreateAvatarToggleMenu : CreateAvatarMenuBase { AvatarToggleMenu AvatarMenu; - public CreateAvatarToggleMenu(AvatarToggleMenu avatarToggleMenu) => AvatarMenu = avatarToggleMenu; + public CreateAvatarToggleMenu(Transform avatarRoot, AvatarToggleMenu avatarToggleMenu) : base(avatarRoot) => AvatarMenu = avatarToggleMenu; public override CreatedAssets CreateAssets(string baseName, IEnumerable children = null) { @@ -56,7 +56,7 @@ public override CreatedAssets CreateAssets(string baseName, IEnumerable var value = AvatarMenu.ToggleMaterials[(child, index)]; var curvePath = child; var curveName = $"m_Materials.Array.data[{index}]"; - var binding = EditorCurveBinding.PPtrCurve(curvePath, typeof(Renderer), curveName); + var binding = EditorCurveBinding.PPtrCurve(curvePath, GetRendererTypeByPath(child), curveName); if (value.UseActive) AnimationUtility.SetObjectReferenceCurve(active, binding, value.ActiveCurve()); if (value.UseInactive) AnimationUtility.SetObjectReferenceCurve(inactive, binding, value.InactiveCurve()); if (transitionSeconds > 0) @@ -73,12 +73,12 @@ public override CreatedAssets CreateAssets(string baseName, IEnumerable foreach (var (child, name) in AvatarMenu.ToggleShaderParameters.Keys) { if (!matchGameObjects.Contains(child)) continue; - clipSet.SetupAnimationToggleCurve(AvatarMenu.ToggleShaderParameters[(child, name)], path: child, type: typeof(Renderer), propertyName: $"material.{name}"); + clipSet.SetupAnimationToggleCurve(AvatarMenu.ToggleShaderParameters[(child, name)], path: child, type: GetRendererTypeByPath(child), propertyName: $"material.{name}"); } foreach (var (child, name) in AvatarMenu.ToggleShaderVectorParameters.Keys) { if (!matchGameObjects.Contains(child)) continue; - clipSet.SetupComplexAnimationToggleCurve(AvatarMenu.ToggleShaderVectorParameters[(child, name)], path: child, type: typeof(Renderer), prefix: $"material.{name}"); + clipSet.SetupComplexAnimationToggleCurve(AvatarMenu.ToggleShaderVectorParameters[(child, name)], path: child, type: GetRendererTypeByPath(child), prefix: $"material.{name}"); } foreach (var (child, member) in AvatarMenu.ToggleValues.Keys) {