using UnityEngine; namespace RR.Common.Behaviour { /// /// Компонент левитации объекта — плавное движение вверх-вниз относительно начальной позиции. /// public class Levitator : MonoBehaviour { [Header("Параметры левитации")] [Tooltip("Высота левитации (амплитуда отклонения от начальной позиции).")] [SerializeField, Min(0f)] private float height = 0.1f; [Tooltip("Скорость левитации (частота колебаний).")] [SerializeField, Min(0f)] private float speed = 1f; [Tooltip("Плавность движения. Чем выше значение, тем более плавные переходы на пиках.")] [SerializeField, Range(0f, 1f)] private float smoothness = 1f; private Vector3 _startPosition; private float _phase; private void Start() { _startPosition = transform.localPosition; } private void Update() { _phase += speed * Time.deltaTime; // Базовое синусоидальное движение float raw = Mathf.Sin(_phase * Mathf.PI * 2f); // Применяем плавность: интерполяция между линейным треугольным и синусоидальным движением float triangle = Mathf.PingPong(_phase * 2f, 2f) - 1f; float value = Mathf.Lerp(triangle, raw, smoothness); transform.localPosition = _startPosition + Vector3.up * (value * height); } } }