| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 | using OfficeOpenXml.FormulaParsing.Excel.Functions.Math;using UnityEngine;public class StressReceiver : MonoBehaviour{    public float trauma;    private float _trauma;    private Vector3 _lastPosition;    private Vector3 _lastRotation;    [Tooltip("Exponent for calculating the shake factor. Useful for creating different effect fade outs")]    public float TraumaExponent = 1;    [Tooltip("Maximum angle that the gameobject can shake. In euler angles.")]    public Vector3 MaximumAngularShake = Vector3.one * 5;    [Tooltip("Maximum translation that the gameobject can receive when applying the shake effect.")]    public Vector3 MaximumTranslationShake = Vector3.one * .75f;    private System.Action callBack;    [ContextMenu("asdasda")]    public void Test()    {        InduceStress(trauma,null);    }    private void Update()    {        float shake = Mathf.Pow(_trauma, TraumaExponent);        /* Only apply this when there is active trauma */        if(shake > 0.01f)        {            var previousRotation = _lastRotation;            var previousPosition = _lastPosition;            /* In order to avoid affecting the transform current position and rotation each frame we substract the previous translation and rotation */            _lastPosition = new Vector3(                MaximumTranslationShake.x * (Mathf.PerlinNoise(0, Time.time * 25) * 2 - 1),                MaximumTranslationShake.y * (Mathf.PerlinNoise(1, Time.time * 25) * 2 - 1),                MaximumTranslationShake.z * (Mathf.PerlinNoise(2, Time.time * 25) * 2 - 1)            ) * shake;            _lastRotation = new Vector3(                MaximumAngularShake.x * (Mathf.PerlinNoise(3, Time.time * 25) * 2 - 1),                MaximumAngularShake.y * (Mathf.PerlinNoise(4, Time.time * 25) * 2 - 1),                MaximumAngularShake.z * (Mathf.PerlinNoise(5, Time.time * 25) * 2 - 1)            ) * shake;            transform.localPosition += _lastPosition - previousPosition;            transform.localRotation = Quaternion.Euler(transform.localRotation.eulerAngles + _lastRotation - previousRotation);            _trauma = Mathf.Clamp01(_trauma - Time.deltaTime);        }        else        {            if (_lastPosition == Vector3.zero && _lastRotation == Vector3.zero)            {                callBack?.Invoke();                return;            }                       /* Clear the transform of any left over translation and rotations */            transform.localPosition -= _lastPosition;            transform.localRotation = Quaternion.Euler(transform.localRotation.eulerAngles - _lastRotation);            _lastPosition = Vector3.zero;            _lastRotation = Vector3.zero;            callBack?.Invoke();        }    }    /// <summary>    ///  Applies a stress value to the current object.    /// </summary>    /// <param name="Stress">[0,1] Amount of stress to apply to the object</param>    public void InduceStress(float Stress,System.Action callBack)    {        this.callBack = callBack;        _trauma = Mathf.Clamp01(_trauma + Stress);    }}
 |