using UnityEngine; /// /// Настройки для одной волны /// [System.Serializable] public class WaveSettings { public Transform waveTransform; // Сама волна public float rotationSpeed = 5f; // Скорость вращения (+ по часовой, - против) public float bobSpeed = 1f; // Скорость подъёма/опускания public float bobHeight = 0.3f; // Амплитуда подъёма/опускания public float phaseOffset = 0f; // Начальное смещение фазы [HideInInspector] public Vector3 initialPosition; // Начальная позиция [HideInInspector] public float initialRotation; // Начальный угол поворота } /// /// Скрипт для управления волнами вокруг острова /// Каждая волна вращается независимо со своими параметрами /// public class Waves : MonoBehaviour { [Header("Настройки волн")] [SerializeField] private WaveSettings[] waves; // Массив настроек для каждой волны [Header("Глобальные настройки (опционально)")] [SerializeField] private bool useGlobalSettings = false; [SerializeField] private float globalRotationSpeed = 5f; [SerializeField] private float globalBobSpeed = 1f; [SerializeField] private float globalBobHeight = 0.3f; void Start() { // Если массив волн не задан, автоматически создаём настройки для дочерних объектов if (waves == null || waves.Length == 0) { waves = new WaveSettings[transform.childCount]; for (int i = 0; i < transform.childCount; i++) { waves[i] = new WaveSettings(); waves[i].waveTransform = transform.GetChild(i); // Задаём случайные параметры для разнообразия waves[i].rotationSpeed = Random.Range(-10f, 10f); waves[i].bobSpeed = Random.Range(0.5f, 2f); waves[i].bobHeight = Random.Range(0.2f, 0.5f); waves[i].phaseOffset = Random.Range(0f, Mathf.PI * 2f); } } // Сохраняем начальные позиции и повороты волн for (int i = 0; i < waves.Length; i++) { if (waves[i].waveTransform != null) { waves[i].initialPosition = waves[i].waveTransform.localPosition; waves[i].initialRotation = waves[i].waveTransform.localEulerAngles.y; } } } void Update() { // Обновляем каждую волну индивидуально for (int i = 0; i < waves.Length; i++) { if (waves[i].waveTransform != null) { UpdateWave(waves[i]); } } } private void UpdateWave(WaveSettings wave) { // Используем глобальные или индивидуальные настройки float rotSpeed = useGlobalSettings ? globalRotationSpeed : wave.rotationSpeed; float bSpeed = useGlobalSettings ? globalBobSpeed : wave.bobSpeed; float bHeight = useGlobalSettings ? globalBobHeight : wave.bobHeight; // Вращаем волну вокруг родительского объекта (острова) wave.initialRotation += rotSpeed * Time.deltaTime; wave.waveTransform.localEulerAngles = new Vector3( wave.waveTransform.localEulerAngles.x, wave.initialRotation, wave.waveTransform.localEulerAngles.z ); // Поднимаем/опускаем волну float verticalOffset = Mathf.Sin((Time.time * bSpeed) + wave.phaseOffset) * bHeight; Vector3 newPosition = wave.initialPosition; newPosition.y += verticalOffset; wave.waveTransform.localPosition = newPosition; } // Метод для рандомизации всех волн [ContextMenu("Randomize All Waves")] public void RandomizeAllWaves() { foreach (var wave in waves) { if (wave.waveTransform != null) { wave.rotationSpeed = Random.Range(-10f, 10f); wave.bobSpeed = Random.Range(0.5f, 2f); wave.bobHeight = Random.Range(0.2f, 0.5f); wave.phaseOffset = Random.Range(0f, Mathf.PI * 2f); } } } }