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);
}
}
}
}