2026-01-09 08:45:22 +03:00

114 lines
4.1 KiB
C#

using UnityEngine;
/// <summary>
/// Íàñòðîéêè äëÿ îäíîé âîëíû
/// </summary>
[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; // Íà÷àëüíûé óãîë ïîâîðîòà
}
/// <summary>
/// Ñêðèïò äëÿ óïðàâëåíèÿ âîëíàìè âîêðóã îñòðîâà
/// Êàæäàÿ âîëíà âðàùàåòñÿ íåçàâèñèìî ñî ñâîèìè ïàðàìåòðàìè
/// </summary>
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);
}
}
}
}