168 lines
3.4 KiB
C#
168 lines
3.4 KiB
C#
using System;
|
|
using UnityEngine;
|
|
|
|
namespace RootMotion.FinalIK
|
|
{
|
|
public class FingerRig : SolverManager
|
|
{
|
|
[Tooltip("The master weight for all fingers.")]
|
|
[Range(0f, 1f)]
|
|
public float weight = 1f;
|
|
|
|
public Finger[] fingers = new Finger[0];
|
|
|
|
public bool initiated { get; private set; }
|
|
|
|
public bool IsValid(ref string errorMessage)
|
|
{
|
|
Finger[] array = fingers;
|
|
for (int i = 0; i < array.Length; i++)
|
|
{
|
|
if (!array[i].IsValid(ref errorMessage))
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
[ContextMenu("Auto-detect")]
|
|
public void AutoDetect()
|
|
{
|
|
fingers = new Finger[0];
|
|
for (int i = 0; i < base.transform.childCount; i++)
|
|
{
|
|
Transform[] array = new Transform[0];
|
|
AddChildrenRecursive(base.transform.GetChild(i), ref array);
|
|
if (array.Length == 3 || array.Length == 4)
|
|
{
|
|
Finger finger = new Finger();
|
|
finger.bone1 = array[0];
|
|
finger.bone2 = array[1];
|
|
if (array.Length == 3)
|
|
{
|
|
finger.tip = array[2];
|
|
}
|
|
else
|
|
{
|
|
finger.bone3 = array[2];
|
|
finger.tip = array[3];
|
|
}
|
|
finger.weight = 1f;
|
|
Array.Resize(ref fingers, fingers.Length + 1);
|
|
fingers[fingers.Length - 1] = finger;
|
|
}
|
|
}
|
|
}
|
|
|
|
public void AddFinger(Transform bone1, Transform bone2, Transform bone3, Transform tip, Transform target = null)
|
|
{
|
|
Finger finger = new Finger();
|
|
finger.bone1 = bone1;
|
|
finger.bone2 = bone2;
|
|
finger.bone3 = bone3;
|
|
finger.tip = tip;
|
|
finger.target = target;
|
|
Array.Resize(ref fingers, fingers.Length + 1);
|
|
fingers[fingers.Length - 1] = finger;
|
|
initiated = false;
|
|
finger.Initiate(base.transform, fingers.Length - 1);
|
|
if (fingers[fingers.Length - 1].initiated)
|
|
{
|
|
initiated = true;
|
|
}
|
|
}
|
|
|
|
public void RemoveFinger(int index)
|
|
{
|
|
if ((float)index < 0f || index >= fingers.Length)
|
|
{
|
|
Warning.Log("RemoveFinger index out of bounds.", base.transform);
|
|
return;
|
|
}
|
|
if (fingers.Length == 1)
|
|
{
|
|
fingers = new Finger[0];
|
|
return;
|
|
}
|
|
Finger[] array = new Finger[fingers.Length - 1];
|
|
int num = 0;
|
|
for (int i = 0; i < fingers.Length; i++)
|
|
{
|
|
if (i != index)
|
|
{
|
|
array[num] = fingers[i];
|
|
num++;
|
|
}
|
|
}
|
|
fingers = array;
|
|
}
|
|
|
|
private void AddChildrenRecursive(Transform parent, ref Transform[] array)
|
|
{
|
|
Array.Resize(ref array, array.Length + 1);
|
|
array[array.Length - 1] = parent;
|
|
if (parent.childCount == 1)
|
|
{
|
|
AddChildrenRecursive(parent.GetChild(0), ref array);
|
|
}
|
|
}
|
|
|
|
protected override void InitiateSolver()
|
|
{
|
|
initiated = true;
|
|
for (int i = 0; i < fingers.Length; i++)
|
|
{
|
|
fingers[i].Initiate(base.transform, i);
|
|
if (!fingers[i].initiated)
|
|
{
|
|
initiated = false;
|
|
}
|
|
}
|
|
}
|
|
|
|
public void UpdateFingerSolvers()
|
|
{
|
|
Finger[] array = fingers;
|
|
for (int i = 0; i < array.Length; i++)
|
|
{
|
|
array[i].Update(weight);
|
|
}
|
|
}
|
|
|
|
public void FixFingerTransforms()
|
|
{
|
|
if (!(weight <= 0f))
|
|
{
|
|
Finger[] array = fingers;
|
|
for (int i = 0; i < array.Length; i++)
|
|
{
|
|
array[i].FixTransforms();
|
|
}
|
|
}
|
|
}
|
|
|
|
public void StoreDefaultLocalState()
|
|
{
|
|
Finger[] array = fingers;
|
|
for (int i = 0; i < array.Length; i++)
|
|
{
|
|
array[i].StoreDefaultLocalState();
|
|
}
|
|
}
|
|
|
|
protected override void UpdateSolver()
|
|
{
|
|
UpdateFingerSolvers();
|
|
}
|
|
|
|
protected override void FixTransforms()
|
|
{
|
|
if (!(weight <= 0f))
|
|
{
|
|
FixFingerTransforms();
|
|
}
|
|
}
|
|
}
|
|
}
|