Aetheria/Assets/Scripts/Gameplay/ArticulationPoint.cs

52 lines
1.5 KiB
C#
Raw Normal View History

2021-01-05 02:56:17 +00:00
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Unity.Mathematics;
using static Unity.Mathematics.math;
public class ArticulationPoint : MonoBehaviour
{
public Transform Target;
public int Group;
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);
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));
var targetYaw = clamp(_yaw - yaw, YawMin, YawMax);
var targetPitch = clamp(_pitch - pitch, PitchMin, PitchMax);
if (abs(targetYaw - _yaw) < Speed * Time.deltaTime)
_yaw = targetYaw;
else _yaw = _yaw + sign(targetYaw - _yaw) * Speed * Time.deltaTime;
if(_yaw < -360)
_yaw += 360;
if(_yaw > 360)
_yaw -= 360;
if (abs(targetPitch - _pitch) < Speed * Time.deltaTime)
_pitch = targetPitch;
else _pitch = _pitch + sign(targetPitch - _pitch) * Speed * Time.deltaTime;
transform.localRotation = Quaternion.Euler(_pitch, _yaw, 0);
2021-01-05 02:56:17 +00:00
}
}
}