using UnityEditor; using UnityEngine; using UniGLTF; using System.Linq; namespace VRM { [CustomEditor(typeof(VRMLookAtHead))] public class VRMLookAtHeadEditor : Editor { VRMLookAtHead m_target; PreviewRenderUtility m_previewRenderUtility; #if UNITY_2017_1_OR_NEWER struct Item { public Transform Transform; public SkinnedMeshRenderer SkinnedMeshRenderer; public Mesh Mesh; public Material[] Materials; public Mesh Baked() { if (SkinnedMeshRenderer != null) { if (Mesh == null) { Mesh = new Mesh(); } SkinnedMeshRenderer.BakeMesh(Mesh); } return Mesh; } } Item[] m_items; void SetupItems() { m_items = m_target.transform.Traverse().Select(x => { var meshFilter = x.GetComponent(); var meshRenderer = x.GetComponent(); var skinnedMeshRenderer = x.GetComponent(); if (meshFilter != null && meshRenderer != null) { return new Item { Mesh = meshFilter.sharedMesh, Transform = x.transform, Materials = meshRenderer.sharedMaterials, }; } else if (skinnedMeshRenderer != null) { return new Item { //Mesh = skinnedMeshRenderer.sharedMesh, SkinnedMeshRenderer = skinnedMeshRenderer, Transform = x.transform, Materials = skinnedMeshRenderer.sharedMaterials }; } else { return default(Item); } }) .Where(x => x.Transform != null) .ToArray(); } #endif void OnEnable() { m_target = (VRMLookAtHead)target; m_previewRenderUtility = new PreviewRenderUtility(true); #if UNITY_2017_1_OR_NEWER SetupItems(); #endif } private void OnDisable() { m_previewRenderUtility.Cleanup(); m_previewRenderUtility = null; } static void SetPreviewCamera(Camera camera, Vector3 target, Vector3 forward) { camera.fieldOfView = 30f; camera.farClipPlane = 100; camera.nearClipPlane = 0.1f; camera.transform.position = target + forward * 0.8f; camera.transform.LookAt(target); } public override bool HasPreviewGUI() { return true; } public override void OnPreviewGUI(Rect r, GUIStyle background) { m_previewRenderUtility.BeginPreview(r, background); var target = m_target.Head; if (target != null) { #if UNITY_2017_1_OR_NEWER SetPreviewCamera( m_previewRenderUtility.camera, target.position + new Vector3(0, 0.1f, 0), target.forward ); for(int j=0; j