using UnityEngine; using Random = UnityEngine.Random; namespace Dustyroom { public class FloatingMotion : MonoBehaviour { public float verticalAmplitude = 1.0f; public float horizontalAmplitude = 0.0f; public bool startAtRandomOffset = true; [Space] public float speed = 1.0f; [Space, Tooltip("In seconds")] public float startDelay = 0; [Space] public bool worldSpace = false; private Vector3 _initialPosition; private float _offsetH = 0f; private float _offsetV = 0f; private bool _isMoving = false; private void Start() { Invoke(nameof(Initialize), startDelay); } private void Initialize() { _initialPosition = worldSpace ? transform.position : transform.localPosition; if (startAtRandomOffset) { _offsetH = Random.value * 1000f; _offsetV = Random.value * 1000f; } _isMoving = true; } private void Update() { if (!_isMoving) { return; } var hDirection = new Vector3(Mathf.Sin(Time.timeSinceLevelLoad * speed * 0.5f + _offsetV + 100f), 0f, Mathf.Cos(Time.timeSinceLevelLoad * speed + _offsetV + 100f)); Vector3 offset = Vector3.up * (Mathf.Sin(Time.timeSinceLevelLoad * speed + _offsetH) * verticalAmplitude) + hDirection * (Mathf.Sin(Time.timeSinceLevelLoad * speed + _offsetV) * horizontalAmplitude); Vector3 position = _initialPosition + offset * Time.timeScale; if (worldSpace) { transform.position = position; } else { transform.localPosition = position; } } } }