// Animancer // https://kybernetik.com.au/animancer // Copyright 2018-2024 Kybernetik //
#pragma warning disable CS0649 // Field is never assigned to, and will always have its default value.
using Animancer.Units;
using System;
using Unity.Collections;
using UnityEngine;
using UnityEngine.Animations;
namespace Animancer.Samples.Jobs
{
///
/// An sample component that demonstrates how
/// can be used as a dynamic response to getting hit.
///
///
///
/// Sample:
///
/// Hit Impacts
///
///
/// https://kybernetik.com.au/animancer/api/Animancer.Samples.Jobs/HitReceiver
///
[AddComponentMenu(Strings.SamplesMenuPrefix + "Jobs - Hit Receiver")]
[AnimancerHelpUrl(typeof(HitReceiver))]
public class HitReceiver : MonoBehaviour
{
/************************************************************************************************************************/
[SerializeField] private AnimancerComponent _Animancer;
[SerializeField] private Transform[] _Bones;
[SerializeField, Degrees] private float _MaximumAngle = 45;
[SerializeField, Seconds] private float _SmoothingTime = 0.25f;
private SimpleLean _Lean;
private float _Speed;
/************************************************************************************************************************/
protected virtual void Awake()
{
Debug.Assert(_Bones.Length > 0, "No bones are assigned.", this);
NativeArray boneHandles =
AnimancerUtilities.ConvertToTransformStreamHandles(_Bones, _Animancer.Animator);
_Lean = new(_Animancer.Graph, Vector3.right, boneHandles);
}
/************************************************************************************************************************/
public void Hit(Vector3 direction, float force)
{
_Lean.Axis = Vector3.Cross(Vector3.up, direction).normalized;
_Speed = force;
enabled = true;
}
/************************************************************************************************************************/
protected virtual void Update()
{
float angle = Mathf.SmoothDamp(_Lean.Angle, 0, ref _Speed, _SmoothingTime);
angle = Math.Min(angle, _MaximumAngle);
_Lean.Angle = angle;
if (angle == 0 && _Speed == 0)
enabled = false;
}
/************************************************************************************************************************/
}
}