Streamingle_URP/Assets/Scripts/Vrmtool/ColliderMoveTool.cs

48 lines
2.1 KiB
C#

// ColliderMoveTool.cs
using System.Linq;
using UnityEngine;
using VRM;
namespace Efitor
{
public class ColliderMoveTool : MonoBehaviour
{
public static void MoveColliders(GameObject originalPrefab, GameObject copyPrefab)
{
VRMSpringBoneColliderGroup[] originalColliderGroups = originalPrefab.GetComponentsInChildren<VRMSpringBoneColliderGroup>();
Transform[] copyBones = copyPrefab.GetComponentsInChildren<Transform>();
foreach (VRMSpringBoneColliderGroup originalColliderGroup in originalColliderGroups)
{
Transform correspondingCopyBone = FindCorrespondingBone(originalColliderGroup.transform.parent, copyBones);
if (correspondingCopyBone != null)
{
// 원본 콜라이더 게임오브젝트를 복제
GameObject copiedCollider = GameObject.Instantiate(originalColliderGroup.gameObject);
copiedCollider.name = originalColliderGroup.gameObject.name;
// 복제된 콜라이더를 대상 본의 자식으로 설정
copiedCollider.transform.SetParent(correspondingCopyBone);
// 원본의 로컬 Transform 값을 그대로 적용
copiedCollider.transform.localPosition = originalColliderGroup.transform.localPosition;
copiedCollider.transform.localRotation = originalColliderGroup.transform.localRotation;
copiedCollider.transform.localScale = originalColliderGroup.transform.localScale;
Debug.Log($"Collider Group copied for: {correspondingCopyBone.name}");
}
else
{
Debug.LogWarning("No corresponding bone found for: " + originalColliderGroup.transform.parent.name);
}
}
}
private static Transform FindCorrespondingBone(Transform originalBone, Transform[] copyBones)
{
return System.Array.Find(copyBones, bone => bone.name == originalBone.name);
}
}
}