mirror of
https://github.com/vrm-c/UniVRM.git
synced 2026-08-24 19:45:37 -05:00
Merge pull request #1109 from Santarh/fixDestroyNulLAccess
Add properties & Fix the bug in `RuntimeGltfInstance`
This commit is contained in:
@@ -1,4 +1,5 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using UnityEngine;
|
||||
using VRMShaders;
|
||||
|
||||
@@ -6,7 +7,7 @@ namespace UniGLTF
|
||||
{
|
||||
/// <summary>
|
||||
/// ImporterContext の Load 結果の GltfModel
|
||||
///
|
||||
///
|
||||
/// Runtime でモデルを Destory したときに関連リソース(Texture, Material...などの UnityEngine.Object)を自動的に Destroy する。
|
||||
/// </summary>
|
||||
public class RuntimeGltfInstance : MonoBehaviour, IResponsibilityForDestroyObjects
|
||||
@@ -14,25 +15,120 @@ namespace UniGLTF
|
||||
/// <summary>
|
||||
/// this is UniGLTF root gameObject
|
||||
/// </summary>
|
||||
public GameObject Root => this.gameObject;
|
||||
public GameObject Root => (this != null) ? this.gameObject : null;
|
||||
|
||||
List<(SubAssetKey, UnityEngine.Object)> m_resources = new List<(SubAssetKey, UnityEngine.Object)>();
|
||||
/// <summary>
|
||||
/// Transforms with gltf node index.
|
||||
/// </summary>
|
||||
public IReadOnlyList<Transform> Nodes => _nodes;
|
||||
|
||||
public IReadOnlyList<(SubAssetKey, UnityEngine.Object)> RuntimeResources => m_resources;
|
||||
/// <summary>
|
||||
/// Runtime resources.
|
||||
/// ex. Material, Texture, AnimationClip, Mesh.
|
||||
/// </summary>
|
||||
public IReadOnlyList<(SubAssetKey, UnityEngine.Object)> RuntimeResources => _resources;
|
||||
|
||||
/// <summary>
|
||||
/// Materials.
|
||||
/// </summary>
|
||||
public IReadOnlyList<Material> Materials => _materials;
|
||||
|
||||
/// <summary>
|
||||
/// Textures.
|
||||
/// </summary>
|
||||
public IReadOnlyList<Texture> Textures => _textures;
|
||||
|
||||
/// <summary>
|
||||
/// Animation Clips.
|
||||
/// </summary>
|
||||
public IReadOnlyList<AnimationClip> AnimationClips => _animationClips;
|
||||
|
||||
/// <summary>
|
||||
/// Meshes.
|
||||
/// </summary>
|
||||
public IReadOnlyList<Mesh> Meshes => _meshes;
|
||||
|
||||
/// <summary>
|
||||
/// Renderers.
|
||||
/// ex. MeshRenderer, SkinnedMeshRenderer.
|
||||
/// </summary>
|
||||
public IReadOnlyList<Renderer> Renderers => _renderers;
|
||||
|
||||
/// <summary>
|
||||
/// Mesh Renderers.
|
||||
/// </summary>
|
||||
public IReadOnlyList<MeshRenderer> MeshRenderers => _meshRenderers;
|
||||
|
||||
/// <summary>
|
||||
/// Skinned Mesh Renderers.
|
||||
/// </summary>
|
||||
public IReadOnlyList<SkinnedMeshRenderer> SkinnedMeshRenderers => _skinnedMeshRenderers;
|
||||
|
||||
private readonly List<Transform> _nodes = new List<Transform>();
|
||||
private readonly List<(SubAssetKey, UnityEngine.Object)> _resources = new List<(SubAssetKey, UnityEngine.Object)>();
|
||||
private readonly List<Material> _materials = new List<Material>();
|
||||
private readonly List<Texture> _textures = new List<Texture>();
|
||||
private readonly List<AnimationClip> _animationClips = new List<AnimationClip>();
|
||||
private readonly List<Mesh> _meshes = new List<Mesh>();
|
||||
private readonly List<Renderer> _renderers = new List<Renderer>();
|
||||
private readonly List<MeshRenderer> _meshRenderers = new List<MeshRenderer>();
|
||||
private readonly List<SkinnedMeshRenderer> _skinnedMeshRenderers = new List<SkinnedMeshRenderer>();
|
||||
|
||||
public static RuntimeGltfInstance AttachTo(GameObject go, ImporterContext context)
|
||||
{
|
||||
var loaded = go.AddComponent<RuntimeGltfInstance>();
|
||||
|
||||
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<Renderer>())
|
||||
{
|
||||
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<Renderer>())
|
||||
foreach (var r in Renderers)
|
||||
{
|
||||
r.enabled = true;
|
||||
}
|
||||
@@ -40,27 +136,27 @@ namespace UniGLTF
|
||||
|
||||
public void EnableUpdateWhenOffscreen()
|
||||
{
|
||||
foreach (var smr in GetComponentsInChildren<SkinnedMeshRenderer>())
|
||||
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));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user