48 lines
1.2 KiB
C#
48 lines
1.2 KiB
C#
using System;
|
|
using UnityEngine;
|
|
|
|
namespace RootMotion.FinalIK
|
|
{
|
|
public class CCDBendGoal : MonoBehaviour
|
|
{
|
|
public CCDIK ik;
|
|
|
|
[Range(0f, 1f)]
|
|
public float weight = 1f;
|
|
|
|
private void Start()
|
|
{
|
|
IKSolverCCD solver = ik.solver;
|
|
solver.OnPreUpdate = (IKSolver.UpdateDelegate)Delegate.Combine(solver.OnPreUpdate, new IKSolver.UpdateDelegate(BeforeIK));
|
|
}
|
|
|
|
private void BeforeIK()
|
|
{
|
|
if (!base.enabled)
|
|
{
|
|
return;
|
|
}
|
|
float num = ik.solver.IKPositionWeight * weight;
|
|
if (!(num <= 0f))
|
|
{
|
|
Vector3 position = ik.solver.bones[0].transform.position;
|
|
Quaternion quaternion = Quaternion.FromToRotation(ik.solver.bones[ik.solver.bones.Length - 1].transform.position - position, base.transform.position - position);
|
|
if (num < 1f)
|
|
{
|
|
quaternion = Quaternion.Slerp(Quaternion.identity, quaternion, num);
|
|
}
|
|
ik.solver.bones[0].transform.rotation = quaternion * ik.solver.bones[0].transform.rotation;
|
|
}
|
|
}
|
|
|
|
private void OnDestroy()
|
|
{
|
|
if (ik != null)
|
|
{
|
|
IKSolverCCD solver = ik.solver;
|
|
solver.OnPreUpdate = (IKSolver.UpdateDelegate)Delegate.Remove(solver.OnPreUpdate, new IKSolver.UpdateDelegate(BeforeIK));
|
|
}
|
|
}
|
|
}
|
|
}
|