82 lines
3.3 KiB
C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
// ver 1.2
// (c) 2019 gatosyocora
namespace VRCDeveloperTool
{
public static class HumanoidPoseResetter
{
private static HumanBodyBones[] boneList
= {
HumanBodyBones.Hips,
HumanBodyBones.LeftUpperArm, HumanBodyBones.LeftLowerArm,
HumanBodyBones.RightUpperArm, HumanBodyBones.RightLowerArm,
HumanBodyBones.LeftUpperLeg, HumanBodyBones.LeftLowerLeg,
HumanBodyBones.RightUpperLeg,HumanBodyBones.RightLowerLeg,
/*HumanBodyBones.LeftThumbDistal, */HumanBodyBones.LeftThumbIntermediate, HumanBodyBones.LeftThumbProximal,
HumanBodyBones.LeftIndexDistal, HumanBodyBones.LeftIndexIntermediate, HumanBodyBones.LeftIndexProximal,
HumanBodyBones.LeftMiddleDistal, HumanBodyBones.LeftMiddleIntermediate, HumanBodyBones.LeftMiddleProximal,
HumanBodyBones.LeftRingDistal, HumanBodyBones.LeftRingIntermediate, HumanBodyBones.LeftRingProximal,
HumanBodyBones.LeftLittleDistal, HumanBodyBones.LeftLittleIntermediate, HumanBodyBones.LeftLittleProximal,
/*HumanBodyBones.RightThumbDistal, */HumanBodyBones.RightThumbIntermediate, HumanBodyBones.RightThumbProximal,
HumanBodyBones.RightIndexDistal, HumanBodyBones.RightIndexIntermediate, HumanBodyBones.RightIndexProximal,
HumanBodyBones.RightMiddleDistal, HumanBodyBones.RightMiddleIntermediate, HumanBodyBones.RightMiddleProximal,
HumanBodyBones.RightRingDistal, HumanBodyBones.RightRingIntermediate, HumanBodyBones.RightRingProximal,
HumanBodyBones.RightLittleDistal, HumanBodyBones.RightLittleIntermediate, HumanBodyBones.RightLittleProximal
};
public static void ResetPose(GameObject obj)
{
/* 対象オブジェクトのポーズを取得 */
Animator animator = obj.GetComponent<Animator>();
if (animator == null) return;
var sourcePath = AssetDatabase.GetAssetPath(animator.avatar);
var sourceObj = AssetDatabase.LoadAssetAtPath(sourcePath, typeof(GameObject)) as GameObject;
var boneTrans = new Transform[boneList.Length];
for (int i = 0; i < boneList.Length; i++)
{
boneTrans[i] = animator.GetBoneTransform(boneList[i]);
}
/* 対象オブジェクトの親Prefabのポーズを取得 */
Animator sourceAnim = sourceObj.GetComponent<Animator>();
if (sourceAnim == null) return;
var boneTrans_p = new Transform[boneList.Length];
for (int i = 0; i < boneList.Length; i++)
boneTrans_p[i] = sourceAnim.GetBoneTransform(boneList[i]);
for (int j = 0; j < boneList.Length; j++)
{
var trans = boneTrans[j];
var prefabTrans = boneTrans_p[j];
if (trans == null)
{
Debug.Log("[Transform not found]:" + j + ":" + boneList[j]);
continue;
}
Undo.RecordObject(trans, "Change Transform " + trans.name);
trans.localPosition = prefabTrans.localPosition;
trans.localRotation = prefabTrans.localRotation;
}
}
}
}