Unityの公式動画でプロシージャルモーションを作る動画が配信されていたので試してみました。
右下が元のアニメーション、中央が新しく作ったモーションになります。
腰にMuluti-Parent Constraintを、
両手にTwo Bone IK Constraintを使用しました。
ろくろアニメーション部分は、ベースとなるろくろピボットオブジェクト上に手のコントロールポイントピボットオブジェクトを置き、ろくろピボットオブジェクトをY,Zで適当に回しています。
手の部分にも元のアニメーションを若干残すため、Weightを1より小さくしました。
動画の通りに両手のコントロールポイントを作成し、それをそのままろくろピボットオブジェクト上にのせてみたのですが、それではコントロールポイントがついてきてくれなかったため、ろくろピボットオブジェクトにスクリプトをアタッチし、手のコントロールポイントをピボットオブジェクトに追随させるようにしました。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace RokuroHand
{
[System.Serializable]
public class RokuroHandInfo{
public Transform pivotTr;
public Transform targetTr;
public bool disablePosition;
};
public class RokuroHandCtrl : MonoBehaviour
{
[SerializeField] AnimationCurve m_acY=null;
[SerializeField] AnimationCurve m_acZ = null;
[SerializeField] RokuroHandInfo[] m_infoArr=null;
float m_timer;
// Start is called before the first frame update
void Start()
{
m_timer = 0f;
}
// Update is called once per frame
void Update()
{
m_timer += Time.deltaTime;
float ty = m_acY.Evaluate((m_timer * 0.25f) %1f);
float tz = m_acZ.Evaluate((m_timer * 0.33f) % 1f);
transform.rotation = Quaternion.Euler(0f, ty * 200f, tz * 400f);
foreach (RokuroHandInfo info in m_infoArr){
if (!info.disablePosition){
info.targetTr.position = info.pivotTr.position;
}
info.targetTr.rotation = info.pivotTr.rotation;
}
}
}
}
また、ろくろを回す際にIK制御の左腕が体にめり込んでいたのですが、空のオブジェクトを作成しHINTのところに入れ、適当なPositionを入れることでめり込まなくなりました。