88 lines
1.7 KiB
C#
88 lines
1.7 KiB
C#
using System;
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using UnityEditor;
|
|
using UnityEngine;
|
|
|
|
namespace VRCDeveloperTool
|
|
{
|
|
public class PoseConstraint : MonoBehaviour
|
|
{
|
|
[Serializable]
|
|
public class BoneInfo
|
|
{
|
|
public Transform Transform { get; set; }
|
|
public Vector3 Position { get; set; }
|
|
public Quaternion Rotation { get; set; }
|
|
}
|
|
|
|
private List<BoneInfo> boneList;
|
|
|
|
public Animator animator;
|
|
public bool Active = true;
|
|
|
|
public void Start()
|
|
{
|
|
boneList = GetBoneInfo(animator);
|
|
Active = true;
|
|
}
|
|
|
|
private void LateUpdate()
|
|
{
|
|
if (Active && boneList != null) SetBoneInfo(boneList);
|
|
}
|
|
|
|
public void UpdateBoneInfo(Animator animator)
|
|
{
|
|
this.animator = animator;
|
|
#if UNITY_EDITOR
|
|
EditorUtility.SetDirty(this);
|
|
#endif
|
|
boneList = GetBoneInfo(animator);
|
|
}
|
|
|
|
private List<BoneInfo> GetBoneInfo(Animator animator)
|
|
{
|
|
return Enum.GetNames(typeof(HumanBodyBones))
|
|
.Select(boneName =>
|
|
{
|
|
if (Enum.TryParse(boneName, out HumanBodyBones bone))
|
|
{
|
|
Transform trans;
|
|
try
|
|
{
|
|
trans = animator.GetBoneTransform(bone);
|
|
}
|
|
catch (IndexOutOfRangeException)
|
|
{
|
|
return null;
|
|
}
|
|
|
|
if (trans is null) return null;
|
|
return new BoneInfo
|
|
{
|
|
Transform = trans,
|
|
Position = trans.position,
|
|
Rotation = trans.rotation
|
|
};
|
|
}
|
|
else
|
|
{
|
|
return null;
|
|
}
|
|
})
|
|
.Where(x => x != null)
|
|
.ToList();
|
|
}
|
|
|
|
private void SetBoneInfo(List<BoneInfo> boneList)
|
|
{
|
|
foreach (var bone in boneList)
|
|
{
|
|
bone.Transform.position = bone.Position;
|
|
bone.Transform.rotation = bone.Rotation;
|
|
}
|
|
}
|
|
}
|
|
} |