Aetheria/Assets/Scripts/Gameplay/ArticulationPoint.cs

48 lines
1.4 KiB
C#
Raw Normal View History

2021-01-05 02:56:17 +00:00
using UnityEngine;
public class ArticulationPoint : MonoBehaviour
{
public Transform Target;
public int Group;
2026-06-21 09:37:54 +01:00
2021-01-05 02:56:17 +00:00
public float YawMin;
public float YawMax;
public float PitchMin;
public float PitchMax;
public float Speed;
private float _yaw;
private float _pitch;
2021-01-05 02:56:17 +00:00
void Update()
{
if (Target)
{
var targetLocal = transform.InverseTransformPoint(Target.position);
2026-06-21 09:37:54 +01:00
2021-01-05 02:56:17 +00:00
var yaw = Vector2.SignedAngle(new Vector2(0, 1), new Vector2(targetLocal.x, targetLocal.z));
var pitch = Vector2.SignedAngle(new Vector2(1, 0), new Vector2(targetLocal.z, targetLocal.y));
2026-06-21 09:37:54 +01:00
var targetYaw = Mathf.Clamp(_yaw - yaw, YawMin, YawMax);
var targetPitch = Mathf.Clamp(_pitch - pitch, PitchMin, PitchMax);
2026-06-21 09:37:54 +01:00
if (Mathf.Abs(targetYaw - _yaw) < Speed * Time.deltaTime)
_yaw = targetYaw;
2026-06-21 09:37:54 +01:00
else _yaw = _yaw + Mathf.Sign(targetYaw - _yaw) * Speed * Time.deltaTime;
2026-06-21 09:37:54 +01:00
if (_yaw < -360)
_yaw += 360;
2026-06-21 09:37:54 +01:00
if (_yaw > 360)
_yaw -= 360;
2026-06-21 09:37:54 +01:00
if (Mathf.Abs(targetPitch - _pitch) < Speed * Time.deltaTime)
_pitch = targetPitch;
2026-06-21 09:37:54 +01:00
else _pitch = _pitch + Mathf.Sign(targetPitch - _pitch) * Speed * Time.deltaTime;
transform.localRotation = Quaternion.Euler(_pitch, _yaw, 0);
2021-01-05 02:56:17 +00:00
}
}
}