You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
45 lines
1.3 KiB
C#
45 lines
1.3 KiB
C#
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
|
|
namespace RootMotion.FinalIK
|
|
{
|
|
|
|
/// <summary>
|
|
/// Bend goal object for CCDIK. Add this to a GameObject you wish CCD to bend towards.
|
|
/// </summary>
|
|
public class CCDBendGoal : MonoBehaviour
|
|
{
|
|
|
|
public CCDIK ik;
|
|
[Range(0f, 1f)] public float weight = 1f;
|
|
|
|
private void Start()
|
|
{
|
|
ik.solver.OnPreUpdate += BeforeIK;
|
|
}
|
|
|
|
private void BeforeIK()
|
|
{
|
|
if (!enabled) return;
|
|
float w = ik.solver.IKPositionWeight * weight;
|
|
if (w <= 0f) return;
|
|
|
|
Vector3 firstBonePos = ik.solver.bones[0].transform.position;
|
|
Vector3 lastBonePos = ik.solver.bones[ik.solver.bones.Length - 1].transform.position;
|
|
|
|
// Rotating the CCD chain towards this gameobject before it solves so it rolls in from that direction
|
|
Quaternion f = Quaternion.FromToRotation(lastBonePos - firstBonePos, transform.position - firstBonePos);
|
|
|
|
if (w < 1f) f = Quaternion.Slerp(Quaternion.identity, f, w);
|
|
|
|
ik.solver.bones[0].transform.rotation = f * ik.solver.bones[0].transform.rotation;
|
|
}
|
|
|
|
private void OnDestroy()
|
|
{
|
|
if (ik != null) ik.solver.OnPreUpdate -= BeforeIK;
|
|
}
|
|
}
|
|
}
|