itask
This commit is contained in:
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user