This commit is contained in:
2026-03-28 10:03:46 +01:00
parent 677c875c58
commit 72a75c121a

View File

@@ -1,18 +1,15 @@
using System;
using UnityEngine; using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
public class WindController : MonoBehaviour public class WindController : MonoBehaviour, ITask
{ {
[Header("settings větru")] [Header("Settings větru")]
[Tooltip("Maximální síla větru (kladná i záporná)")]
public float maxWindTorque = 8f; public float maxWindTorque = 8f;
[Tooltip("Jak rychle se větr mění směrem/sílou")]
public float windChangeSpeed = 0.6f; public float windChangeSpeed = 0.6f;
[Tooltip("Jak často se objeví silnější vichřice (v sekundách)")]
public float gustInterval = 4f; public float gustInterval = 4f;
[Tooltip("Multiplier pro sílu vichřice")]
public float gustMultiplier = 2.0f; public float gustMultiplier = 2.0f;
public float CurrentWindTorque { get; private set; } public float CurrentWindTorque { get; private set; }
@@ -20,6 +17,16 @@ public class WindController : MonoBehaviour
private float targetTorque; private float targetTorque;
private float gustTimer; private float gustTimer;
private Action<ITask> _onCompleted;
private Action<ITask> _onExit;
public string TaskID { get; set; }
public TaskType TaskType { get; set; }
public string TaskName { get; set; }
public (double, double) TaskLocation { get; set; }
public bool IsCompleted { get; private set; }
void Start() void Start()
{ {
PickNewTargetTorque(); PickNewTargetTorque();
@@ -28,24 +35,43 @@ public class WindController : MonoBehaviour
void Update() void Update()
{ {
// Smoothly move wind toward target torque
CurrentWindTorque = Mathf.Lerp(CurrentWindTorque, targetTorque, Time.deltaTime * windChangeSpeed); CurrentWindTorque = Mathf.Lerp(CurrentWindTorque, targetTorque, Time.deltaTime * windChangeSpeed);
// Occasional gusts
gustTimer -= Time.deltaTime; gustTimer -= Time.deltaTime;
if (gustTimer <= 0f) if (gustTimer <= 0f)
{ {
// Apply a short gust by shifting target torque more aggressively float gust = UnityEngine.Random.Range(-maxWindTorque, maxWindTorque) * gustMultiplier;
float gust = Random.Range(-maxWindTorque, maxWindTorque) * gustMultiplier;
targetTorque = Mathf.Clamp(gust, -maxWindTorque * gustMultiplier, maxWindTorque * gustMultiplier); targetTorque = Mathf.Clamp(gust, -maxWindTorque * gustMultiplier, maxWindTorque * gustMultiplier);
gustTimer = gustInterval; gustTimer = gustInterval;
Invoke(nameof(PickNewTargetTorque), 0.8f); // gust lasts ~0.8s Invoke(nameof(PickNewTargetTorque), 0.8f);
} }
} }
private void PickNewTargetTorque() private void PickNewTargetTorque()
{ {
targetTorque = Random.Range(-maxWindTorque, maxWindTorque); targetTorque = UnityEngine.Random.Range(-maxWindTorque, maxWindTorque);
} }
}
public void Initialize(Action<ITask> onCompleted)
{
_onCompleted = onCompleted;
IsCompleted = false;
}
public void Complete()
{
if (IsCompleted) return;
IsCompleted = true;
_onCompleted?.Invoke(this);
}
public void ExitTask(Action<ITask> onExit)
{
_onExit = onExit;
_onExit?.Invoke(this);
}
}