129 lines
4.8 KiB
C#
129 lines
4.8 KiB
C#
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
using System.Linq;
|
|
using UnityEditor;
|
|
|
|
// ver 1.2
|
|
// © 2018-9-24 gatosyocora
|
|
|
|
namespace VRCDeveloperTool
|
|
{
|
|
|
|
public class HandPoseAdder : Editor
|
|
{
|
|
|
|
private static string ORIGIN_ANIM_PATH = "Assets/VRCDeveloperTool/Editor/HandPoseAdder/Animations/"; // コピー元となるAnimationファイルが置いてあるディレクトリのパス
|
|
|
|
private static readonly string[] HANDNAMES ={"LeftHand.Index", "LeftHand.Little", "LeftHand.Middle", "LeftHand.Ring", "LeftHand.Thumb",
|
|
"RightHand.Index", "RightHand.Little", "RightHand.Middle", "RightHand.Ring", "RightHand.Thumb"};
|
|
|
|
private static readonly string[] HANDPOSTYPES = { "1 Stretched", "2 Stretched", "3 Stretched", "Spread" };
|
|
|
|
// None
|
|
[MenuItem("CONTEXT/Motion/Clear Hand pose", false, 0)]
|
|
private static void ClearHandAnimationKeys(MenuCommand command)
|
|
{
|
|
ClearHandPoseAnimationKeys(command);
|
|
}
|
|
|
|
// FINGER POINT
|
|
[MenuItem("CONTEXT/Motion/Add Hand pose 'FINGER POINT'", false, 1)]
|
|
private static void AddFPAnimationKeys(MenuCommand command)
|
|
{
|
|
AddHandPoseAnimationKeys(command, ORIGIN_ANIM_PATH + "FingerPoint.anim");
|
|
}
|
|
|
|
// FIST
|
|
[MenuItem("CONTEXT/Motion/Add Hand pose 'FIST'", false, 2)]
|
|
private static void AddFISTAnimationKeys(MenuCommand command)
|
|
{
|
|
AddHandPoseAnimationKeys(command, ORIGIN_ANIM_PATH + "Fist.anim");
|
|
}
|
|
|
|
// HAND GUN
|
|
[MenuItem("CONTEXT/Motion/Add Hand pose 'HAND GUN'", false, 3)]
|
|
private static void AddHGAnimationKeys(MenuCommand command)
|
|
{
|
|
AddHandPoseAnimationKeys(command, ORIGIN_ANIM_PATH + "HandGun.anim");
|
|
}
|
|
|
|
// HAND OPEN
|
|
[MenuItem("CONTEXT/Motion/Add Hand pose 'HAND OPEN'", false, 4)]
|
|
private static void AddHOAnimationKeys(MenuCommand command)
|
|
{
|
|
AddHandPoseAnimationKeys(command, ORIGIN_ANIM_PATH + "HandOpen.anim");
|
|
}
|
|
|
|
// ROCKN ROLL
|
|
[MenuItem("CONTEXT/Motion/Add Hand pose 'ROCK N ROLL'", false, 5)]
|
|
private static void AddRRAnimationKeys(MenuCommand command)
|
|
{
|
|
AddHandPoseAnimationKeys(command, ORIGIN_ANIM_PATH + "RocknRoll.anim");
|
|
}
|
|
|
|
// THUMBS UP
|
|
[MenuItem("CONTEXT/Motion/Add Hand pose 'THUMBS UP'", false, 6)]
|
|
private static void AddTUAnimationKeys(MenuCommand command)
|
|
{
|
|
AddHandPoseAnimationKeys(command, ORIGIN_ANIM_PATH + "ThumbsUp.anim");
|
|
}
|
|
|
|
|
|
// VICTORY
|
|
[MenuItem("CONTEXT/Motion/Add Hand pose 'VICTORY'", false, 7)]
|
|
private static void AddVICTORYAnimationKeys(MenuCommand command)
|
|
{
|
|
AddHandPoseAnimationKeys(command, ORIGIN_ANIM_PATH + "Victory.anim");
|
|
}
|
|
|
|
// 特定のAnimationファイルのAnimationキー全てをコピーする
|
|
public static void AddHandPoseAnimationKeys(MenuCommand command, string originPath)
|
|
{
|
|
AnimationClip targetClip = command.context as AnimationClip;
|
|
|
|
AnimationClip originClip = (AnimationClip)AssetDatabase.LoadAssetAtPath(originPath, typeof(AnimationClip)); // originPathよりAnimationClipの読み込み
|
|
|
|
CopyAnimationKeys(originClip, targetClip);
|
|
}
|
|
|
|
// originClipに設定されたAnimationKeyをすべてtargetclipにコピーする
|
|
public static void CopyAnimationKeys(AnimationClip originClip, AnimationClip targetClip)
|
|
{
|
|
foreach (var binding in AnimationUtility.GetCurveBindings(originClip).ToArray())
|
|
{
|
|
// AnimationClipよりAnimationCurveを取得
|
|
AnimationCurve curve = AnimationUtility.GetEditorCurve(originClip, binding);
|
|
// AnimationClipにキーリダクションを行ったAnimationCurveを設定
|
|
AnimationUtility.SetEditorCurve(targetClip, binding, curve);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 手の形に関するAnimationキーを全て削除する
|
|
/// </summary>
|
|
/// <param name="command"></param>
|
|
public static void ClearHandPoseAnimationKeys(MenuCommand command)
|
|
{
|
|
var targetClip = command.context as AnimationClip;
|
|
|
|
foreach (var handname in HANDNAMES)
|
|
{
|
|
foreach (var handpostype in HANDPOSTYPES)
|
|
{
|
|
var binding = new EditorCurveBinding();
|
|
binding.path = "";
|
|
binding.type = typeof(Animator);
|
|
binding.propertyName = handname + "." + handpostype;
|
|
|
|
// キーを削除する
|
|
AnimationUtility.SetEditorCurve(targetClip, binding, null);
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|