Files
2026-03-04 09:37:33 +08:00

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();
}
}
}
}