Files
2026-03-04 10:03:45 +08:00

69 lines
2.0 KiB
C#

using System;
using UnityEngine;
namespace RootMotion.FinalIK
{
[Serializable]
public class BipedIKSolvers
{
public IKSolverLimb leftFoot = new IKSolverLimb(AvatarIKGoal.LeftFoot);
public IKSolverLimb rightFoot = new IKSolverLimb(AvatarIKGoal.RightFoot);
public IKSolverLimb leftHand = new IKSolverLimb(AvatarIKGoal.LeftHand);
public IKSolverLimb rightHand = new IKSolverLimb(AvatarIKGoal.RightHand);
public IKSolverFABRIK spine = new IKSolverFABRIK();
public IKSolverLookAt lookAt = new IKSolverLookAt();
public IKSolverAim aim = new IKSolverAim();
public Constraints pelvis = new Constraints();
private IKSolverLimb[] _limbs;
private IKSolver[] _ikSolvers;
public IKSolverLimb[] limbs
{
get
{
if (_limbs == null || (_limbs != null && _limbs.Length != 4))
{
_limbs = new IKSolverLimb[4] { leftFoot, rightFoot, leftHand, rightHand };
}
return _limbs;
}
}
public IKSolver[] ikSolvers
{
get
{
if (_ikSolvers == null || (_ikSolvers != null && _ikSolvers.Length != 7))
{
_ikSolvers = new IKSolver[7] { leftFoot, rightFoot, leftHand, rightHand, spine, lookAt, aim };
}
return _ikSolvers;
}
}
public void AssignReferences(BipedReferences references)
{
leftHand.SetChain(references.leftUpperArm, references.leftForearm, references.leftHand, references.root);
rightHand.SetChain(references.rightUpperArm, references.rightForearm, references.rightHand, references.root);
leftFoot.SetChain(references.leftThigh, references.leftCalf, references.leftFoot, references.root);
rightFoot.SetChain(references.rightThigh, references.rightCalf, references.rightFoot, references.root);
spine.SetChain(references.spine, references.root);
lookAt.SetChain(references.spine, references.head, references.eyes, references.root);
aim.SetChain(references.spine, references.root);
leftFoot.goal = AvatarIKGoal.LeftFoot;
rightFoot.goal = AvatarIKGoal.RightFoot;
leftHand.goal = AvatarIKGoal.LeftHand;
rightHand.goal = AvatarIKGoal.RightHand;
}
}
}