74 lines
2.1 KiB
C#
74 lines
2.1 KiB
C#
using System;
|
|
using UnityEngine;
|
|
|
|
namespace RootMotion.FinalIK
|
|
{
|
|
public class FBBIKArmBending : MonoBehaviour
|
|
{
|
|
public FullBodyBipedIK ik;
|
|
|
|
public Vector3 bendDirectionOffsetLeft;
|
|
|
|
public Vector3 bendDirectionOffsetRight;
|
|
|
|
public Vector3 characterSpaceBendOffsetLeft;
|
|
|
|
public Vector3 characterSpaceBendOffsetRight;
|
|
|
|
private Quaternion leftHandTargetRotation;
|
|
|
|
private Quaternion rightHandTargetRotation;
|
|
|
|
private bool initiated;
|
|
|
|
private void LateUpdate()
|
|
{
|
|
if (!(ik == null))
|
|
{
|
|
if (!initiated)
|
|
{
|
|
IKSolverFullBodyBiped solver = ik.solver;
|
|
solver.OnPostUpdate = (IKSolver.UpdateDelegate)Delegate.Combine(solver.OnPostUpdate, new IKSolver.UpdateDelegate(OnPostFBBIK));
|
|
initiated = true;
|
|
}
|
|
if (ik.solver.leftHandEffector.target != null)
|
|
{
|
|
Vector3 left = Vector3.left;
|
|
ik.solver.leftArmChain.bendConstraint.direction = ik.solver.leftHandEffector.target.rotation * left + ik.solver.leftHandEffector.target.rotation * bendDirectionOffsetLeft + ik.transform.rotation * characterSpaceBendOffsetLeft;
|
|
ik.solver.leftArmChain.bendConstraint.weight = 1f;
|
|
}
|
|
if (ik.solver.rightHandEffector.target != null)
|
|
{
|
|
Vector3 right = Vector3.right;
|
|
ik.solver.rightArmChain.bendConstraint.direction = ik.solver.rightHandEffector.target.rotation * right + ik.solver.rightHandEffector.target.rotation * bendDirectionOffsetRight + ik.transform.rotation * characterSpaceBendOffsetRight;
|
|
ik.solver.rightArmChain.bendConstraint.weight = 1f;
|
|
}
|
|
}
|
|
}
|
|
|
|
private void OnPostFBBIK()
|
|
{
|
|
if (!(ik == null))
|
|
{
|
|
if (ik.solver.leftHandEffector.target != null)
|
|
{
|
|
ik.references.leftHand.rotation = ik.solver.leftHandEffector.target.rotation;
|
|
}
|
|
if (ik.solver.rightHandEffector.target != null)
|
|
{
|
|
ik.references.rightHand.rotation = ik.solver.rightHandEffector.target.rotation;
|
|
}
|
|
}
|
|
}
|
|
|
|
private void OnDestroy()
|
|
{
|
|
if (ik != null)
|
|
{
|
|
IKSolverFullBodyBiped solver = ik.solver;
|
|
solver.OnPostUpdate = (IKSolver.UpdateDelegate)Delegate.Remove(solver.OnPostUpdate, new IKSolver.UpdateDelegate(OnPostFBBIK));
|
|
}
|
|
}
|
|
}
|
|
}
|