UniVRM/Assets/UniGLTF/Runtime/MeshUtility/MeshAttachInfo.cs
ousttrue be20563059 GetComponent を置き換え。
TryGetComponent
GetComponentOrThrow(拡張関数)
GetComponentOrNull(拡張関数)

sample と test は据え置き
2024-07-24 22:09:30 +09:00

70 lines
2.1 KiB
C#

using System;
using System.Linq;
using UnityEngine;
namespace UniGLTF.MeshUtility
{
public class MeshAttachInfo
{
public Mesh Mesh;
public Material[] Materials;
public Transform[] Bones;
public Transform RootBone;
public void ReplaceMesh(GameObject dst)
{
if (dst == null)
{
throw new ArgumentNullException();
}
if (Bones != null)
{
// recalc bindposes
Mesh.bindposes = Bones.Select(x =>
{
if (x != null)
{
return x.worldToLocalMatrix * dst.transform.localToWorldMatrix;
}
else
{
// ボーンが削除された
return dst.transform.localToWorldMatrix;
}
}
).ToArray();
if (dst.TryGetComponent<SkinnedMeshRenderer>(out var dstRenderer))
{
dstRenderer.sharedMesh = Mesh;
dstRenderer.sharedMaterials = Materials;
dstRenderer.bones = Bones;
dstRenderer.rootBone = RootBone;
}
else
{
Debug.LogError($"SkinnedMeshRenderer not found", dst);
}
}
else
{
if (dst.TryGetComponent<MeshFilter>(out var dstFilter))
{
dstFilter.sharedMesh = Mesh;
if (dst.gameObject.TryGetComponent<MeshRenderer>(out var dstRenderer))
{
dstRenderer.sharedMaterials = Materials;
}
else
{
Debug.LogError($"MeshRenderer not found", dst);
}
}
else
{
Debug.LogError($"MeshFilter not found", dst);
}
}
}
}
}