Files
Ipseity-Demo/Packages/OctoCore/Runtime/Scripts/Components/OctoIkRaycast.cs
T
2026-02-09 23:53:14 +01:00

50 lines
1.6 KiB
C#

using UnityEngine;
public class OctoIkRaycast : MonoBehaviour
{
public float _distance = 1;
public Vector3 rotationOffset;
public Transform _target;
public LayerMask _layerMask;
Vector3 originPos;
Vector3 targetPos;
Quaternion originRot;
Quaternion targetRot;
void Start()
{
originPos = targetPos = _target.localPosition;
originRot = targetRot = _target.localRotation;
}
void Update()
{
float deltaPos = Time.deltaTime * 3f;
float deltaRot = Time.deltaTime * 3f;
RaycastHit hit;
if (Physics.Raycast(transform.position, transform.TransformDirection(Vector3.forward), out hit, _distance, _layerMask))
{
Debug.DrawRay(transform.position, transform.TransformDirection(Vector3.forward) * hit.distance, Color.yellow);
targetPos = transform.InverseTransformPoint(hit.point);
targetRot = Quaternion.LookRotation(-transform.InverseTransformDirection(hit.normal), transform.up) * Quaternion.Euler(rotationOffset);
deltaPos = Mathf.Lerp(1, deltaPos, Mathf.Clamp01(hit.distance / _distance));
deltaRot = Mathf.Lerp(.1f, deltaRot, Mathf.Clamp01(hit.distance / _distance));
}
else
{
Debug.DrawRay(transform.position, transform.TransformDirection(Vector3.forward) * _distance, Color.white);
targetPos = originPos;
targetRot = originRot;
}
_target.localPosition = Vector3.Lerp(_target.localPosition, targetPos, deltaPos);
_target.localRotation = Quaternion.Lerp(_target.localRotation, targetRot, deltaRot);
}
}