diff --git a/Assets/UniGLTF/Runtime/UniGLTF/RuntimeGltfInstance.cs b/Assets/UniGLTF/Runtime/UniGLTF/RuntimeGltfInstance.cs index 89c6560aa..5ec350bdb 100644 --- a/Assets/UniGLTF/Runtime/UniGLTF/RuntimeGltfInstance.cs +++ b/Assets/UniGLTF/Runtime/UniGLTF/RuntimeGltfInstance.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.Linq; using UnityEngine; using VRMShaders; @@ -6,7 +7,7 @@ namespace UniGLTF { /// /// ImporterContext の Load 結果の GltfModel - /// + /// /// Runtime でモデルを Destory したときに関連リソース(Texture, Material...などの UnityEngine.Object)を自動的に Destroy する。 /// public class RuntimeGltfInstance : MonoBehaviour, IResponsibilityForDestroyObjects @@ -14,25 +15,120 @@ namespace UniGLTF /// /// this is UniGLTF root gameObject /// - public GameObject Root => this.gameObject; + public GameObject Root => (this != null) ? this.gameObject : null; - List<(SubAssetKey, UnityEngine.Object)> m_resources = new List<(SubAssetKey, UnityEngine.Object)>(); + /// + /// Transforms with gltf node index. + /// + public IReadOnlyList Nodes => _nodes; - public IReadOnlyList<(SubAssetKey, UnityEngine.Object)> RuntimeResources => m_resources; + /// + /// Runtime resources. + /// ex. Material, Texture, AnimationClip, Mesh. + /// + public IReadOnlyList<(SubAssetKey, UnityEngine.Object)> RuntimeResources => _resources; + + /// + /// Materials. + /// + public IReadOnlyList Materials => _materials; + + /// + /// Textures. + /// + public IReadOnlyList Textures => _textures; + + /// + /// Animation Clips. + /// + public IReadOnlyList AnimationClips => _animationClips; + + /// + /// Meshes. + /// + public IReadOnlyList Meshes => _meshes; + + /// + /// Renderers. + /// ex. MeshRenderer, SkinnedMeshRenderer. + /// + public IReadOnlyList Renderers => _renderers; + + /// + /// Mesh Renderers. + /// + public IReadOnlyList MeshRenderers => _meshRenderers; + + /// + /// Skinned Mesh Renderers. + /// + public IReadOnlyList SkinnedMeshRenderers => _skinnedMeshRenderers; + + private readonly List _nodes = new List(); + private readonly List<(SubAssetKey, UnityEngine.Object)> _resources = new List<(SubAssetKey, UnityEngine.Object)>(); + private readonly List _materials = new List(); + private readonly List _textures = new List(); + private readonly List _animationClips = new List(); + private readonly List _meshes = new List(); + private readonly List _renderers = new List(); + private readonly List _meshRenderers = new List(); + private readonly List _skinnedMeshRenderers = new List(); public static RuntimeGltfInstance AttachTo(GameObject go, ImporterContext context) { var loaded = go.AddComponent(); + + foreach (var node in context.Nodes) + { + // Maintain index order. + loaded._nodes.Add(node); + } + context.TransferOwnership((k, o) => { - loaded.m_resources.Add((k, o)); + if (o == null) return; + + loaded._resources.Add((k, o)); + + + switch (o) + { + case Material material: + loaded._materials.Add(material); + break; + case Texture texture: + loaded._textures.Add(texture); + break; + case AnimationClip animationClip: + loaded._animationClips.Add(animationClip); + break; + case Mesh mesh: + loaded._meshes.Add(mesh); + break; + } }); + + foreach (var renderer in go.GetComponentsInChildren()) + { + loaded._renderers.Add(renderer); + + switch (renderer) + { + case MeshRenderer meshRenderer: + loaded._meshRenderers.Add(meshRenderer); + break; + case SkinnedMeshRenderer skinnedMeshRenderer: + loaded._skinnedMeshRenderers.Add(skinnedMeshRenderer); + break; + } + } + return loaded; } public void ShowMeshes() { - foreach (var r in GetComponentsInChildren()) + foreach (var r in Renderers) { r.enabled = true; } @@ -40,27 +136,27 @@ namespace UniGLTF public void EnableUpdateWhenOffscreen() { - foreach (var smr in GetComponentsInChildren()) + foreach (var skinnedMeshRenderer in SkinnedMeshRenderers) { - smr.updateWhenOffscreen = true; + skinnedMeshRenderer.updateWhenOffscreen = true; } } void OnDestroy() { Debug.Log("UnityResourceDestroyer.OnDestroy"); - foreach (var (key, x) in m_resources) + foreach (var (_, obj) in _resources) { - UnityObjectDestoyer.DestroyRuntimeOrEditor(x); + UnityObjectDestoyer.DestroyRuntimeOrEditor(obj); } } public void TransferOwnership(TakeResponsibilityForDestroyObjectFunc take) { - foreach (var (key, x) in m_resources.ToArray()) + foreach (var (key, x) in _resources.ToArray()) { take(key, x); - m_resources.Remove((key, x)); + _resources.Remove((key, x)); } }