114 lines
4.1 KiB
C#
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);
|
|
}
|
|
}
|
|
}
|
|
}
|