diff --git a/Assets/VRM/UniVRM/Editor/Format/VRMExportMeshes.cs b/Assets/VRM/UniVRM/Editor/Format/VRMExportMeshes.cs
new file mode 100644
index 000000000..ddbf038d4
--- /dev/null
+++ b/Assets/VRM/UniVRM/Editor/Format/VRMExportMeshes.cs
@@ -0,0 +1,47 @@
+using System;
+using UnityEngine;
+
+namespace VRM
+{
+ ///
+ /// Export時にMeshを一覧する
+ ///
+ [Serializable]
+ public class VRMExportMeshes : ScriptableObject
+ {
+ [Serializable]
+ public struct MeshInfo
+ {
+ public Mesh Mesh;
+ public bool Skinned;
+ public bool HasVertexColor;
+
+ public MeshInfo(Renderer renderer)
+ {
+ Mesh = null;
+ Skinned = false;
+ HasVertexColor = false;
+ if (renderer is SkinnedMeshRenderer smr)
+ {
+ Skinned = true;
+ Mesh = smr.sharedMesh;
+ }
+ else if (renderer is MeshRenderer mr)
+ {
+ var filter = mr.GetComponent();
+ if (filter != null)
+ {
+ Mesh = filter.sharedMesh;
+ }
+ }
+ if (Mesh == null)
+ {
+ return;
+ }
+ HasVertexColor = Mesh.colors != null && Mesh.colors.Length == Mesh.vertexCount;
+ }
+ }
+
+ public MeshInfo[] Meshes;
+ }
+}
diff --git a/Assets/VRM/UniVRM/Editor/Format/VRMExportMeshes.cs.meta b/Assets/VRM/UniVRM/Editor/Format/VRMExportMeshes.cs.meta
new file mode 100644
index 000000000..d045660f1
--- /dev/null
+++ b/Assets/VRM/UniVRM/Editor/Format/VRMExportMeshes.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 7961eaa3060a80d43b2bcd80961bbd29
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/VRM/UniVRM/Editor/Format/VRMExporterVaildator.cs b/Assets/VRM/UniVRM/Editor/Format/VRMExporterVaildator.cs
index 351c4abf9..7d016ac52 100644
--- a/Assets/VRM/UniVRM/Editor/Format/VRMExporterVaildator.cs
+++ b/Assets/VRM/UniVRM/Editor/Format/VRMExporterVaildator.cs
@@ -213,7 +213,7 @@ namespace VRM
}
ExpectedByteSize = 0;
- foreach (var renderer in ExportRoot.GetComponentsInChildren())
+ foreach (var renderer in ExportRoot.GetComponentsInChildren(true))
{
var relativePath = UniGLTF.UnityExtensions.RelativePathFrom(renderer.transform, ExportRoot.transform);
var mesh = GetMesh(renderer);
@@ -330,11 +330,11 @@ namespace VRM
var renderers = ExportRoot.GetComponentsInChildren();
foreach (var r in renderers)
{
- for(int i=0; i x.sharedMaterials).Where(x => x != null).Distinct();
diff --git a/Assets/VRM/UniVRM/Editor/Format/VRMExporterWizard.cs b/Assets/VRM/UniVRM/Editor/Format/VRMExporterWizard.cs
index eaa9cf1db..861b28872 100644
--- a/Assets/VRM/UniVRM/Editor/Format/VRMExporterWizard.cs
+++ b/Assets/VRM/UniVRM/Editor/Format/VRMExporterWizard.cs
@@ -1,10 +1,8 @@
-using System;
-using System.IO;
+using System.IO;
using System.Linq;
using System.Reflection;
using UnityEditor;
using UnityEngine;
-using uei = UnityEngine.Internal;
namespace VRM
{
@@ -41,6 +39,7 @@ namespace VRM
GameObject ExportRoot;
VRMExportSettings m_settings;
+ VRMExportMeshes m_meshes;
VRMMetaObject m_meta;
VRMMetaObject Meta
@@ -98,6 +97,7 @@ namespace VRM
Editor m_metaEditor;
Editor m_settingsInspector;
+ Editor m_meshesInspector;
VRMExporterValidator m_validator = new VRMExporterValidator();
bool m_requireValidation = true;
@@ -112,14 +112,11 @@ namespace VRM
m_tmpMeta = ScriptableObject.CreateInstance();
- if (m_settings == null)
- {
- m_settings = ScriptableObject.CreateInstance();
- }
- if (m_settingsInspector == null)
- {
- m_settingsInspector = Editor.CreateEditor(m_settings);
- }
+ m_settings = ScriptableObject.CreateInstance();
+ m_settingsInspector = Editor.CreateEditor(m_settings);
+
+ m_meshes = ScriptableObject.CreateInstance();
+ m_meshesInspector = Editor.CreateEditor(m_meshes);
}
void OnDisable()
@@ -136,6 +133,9 @@ namespace VRM
// m_settingsInspector
UnityEditor.Editor.DestroyImmediate(m_settingsInspector);
m_settingsInspector = null;
+ // m_meshesInspector
+ UnityEditor.Editor.DestroyImmediate(m_meshesInspector);
+ m_meshesInspector = null;
// Meta
Meta = null;
ScriptableObject.DestroyImmediate(m_tmpMeta);
@@ -143,6 +143,9 @@ namespace VRM
// m_settings
ScriptableObject.DestroyImmediate(m_settings);
m_settings = null;
+ // m_meshes
+ ScriptableObject.DestroyImmediate(m_meshes);
+ m_meshes = null;
}
private void InvokeWizardUpdate()
@@ -194,18 +197,28 @@ namespace VRM
UpdateRoot(root);
}
+ // ArgumentException: Getting control 1's position in a group with only 1 controls when doing repaint Aborting
+ // Validation により GUI の表示項目が変わる場合があるので、
+ // EventType.Layout と EventType.Repaint 間で内容が変わらないようしている。
if (Event.current.type == EventType.Layout)
{
- // ArgumentException: Getting control 1's position in a group with only 1 controls when doing repaint Aborting
- // Validation により GUI の表示項目が変わる場合があるので、
- // EventType.Layout と EventType.Repaint 間で内容が変わらないようしている。
if (m_requireValidation)
{
m_validator.Validate(ExportRoot, m_settings, Meta != null ? Meta : m_tmpMeta);
m_requireValidation = false;
+
+ if (ExportRoot != null)
+ {
+ m_meshes.Meshes = ExportRoot.GetComponentsInChildren(true).Select(r => new VRMExportMeshes.MeshInfo(r)).ToArray();
+ }
+ else
+ {
+ m_meshes.Meshes = new VRMExportMeshes.MeshInfo[] { };
+ }
}
}
+
//
// Humanoid として適正か? ここで失敗する場合は Export UI を表示しない
//
@@ -297,6 +310,7 @@ namespace VRM
break;
case Tabs.Mesh:
+ m_meshesInspector.OnInspectorGUI();
break;
}