137 lines
3.3 KiB
C#
137 lines
3.3 KiB
C#
using System;
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
using Utility;
|
|
|
|
/// <summary>
|
|
/// Macht genau das was man erwartet: Schaltet je nach Uhrzeit alle Kinder an oder aus.
|
|
/// </summary>
|
|
public class Zeitschaltuhr : MonoBehaviour, ISerializationCallbackReceiver
|
|
{
|
|
private TimeSpan _turnOnTimeSpan;
|
|
private TimeSpan _turnOffTimeSpan;
|
|
private float _activeTimeSpanInSeconds;
|
|
|
|
/// <summary>
|
|
/// Die Dauer der Active-Time der Kinder in echten Sekunden
|
|
/// </summary>
|
|
public float ActiveTimeSpanInSeconds => _activeTimeSpanInSeconds;
|
|
/// <summary>
|
|
/// Ob die Kinder gerade aktiv sind oder nicht
|
|
/// </summary>
|
|
public bool IsOn;
|
|
|
|
[SerializeField] private SimpleTime _turnOnTime;
|
|
[SerializeField] private SimpleTime _turnOffTime;
|
|
|
|
public SimpleTime TurnOnTime
|
|
{
|
|
get => _turnOnTime;
|
|
set
|
|
{
|
|
_turnOnTime = value;
|
|
_turnOnTimeSpan = _turnOnTime.ToTimeSpan();
|
|
}
|
|
}
|
|
|
|
public SimpleTime TurnOffTime
|
|
{
|
|
get => _turnOffTime;
|
|
set
|
|
{
|
|
_turnOffTime = value;
|
|
_turnOffTimeSpan = _turnOffTime.ToTimeSpan();
|
|
}
|
|
}
|
|
|
|
void Start()
|
|
{
|
|
CalculateOnTimeInSeconds();
|
|
UpdateOn();
|
|
}
|
|
|
|
void Update()
|
|
{
|
|
UpdateOn();
|
|
}
|
|
|
|
void UpdateOn()
|
|
{
|
|
if (!GameManager.Instance.IsStarted)
|
|
{
|
|
bool wasOn = IsOn;
|
|
IsOn = false;
|
|
if (IsOn != wasOn)
|
|
{
|
|
UpdateChildren();
|
|
}
|
|
return;
|
|
}
|
|
|
|
if (_turnOnTimeSpan < _turnOffTimeSpan)
|
|
{
|
|
// beide Zeiten am selben Tag
|
|
|
|
bool wasOn = IsOn;
|
|
|
|
IsOn = TimeManager.Instance.TimeOfDay.IsBetween(_turnOnTimeSpan, _turnOffTimeSpan);
|
|
|
|
if (IsOn != wasOn)
|
|
{
|
|
UpdateChildren();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// Zeiten über Mitternacht
|
|
|
|
bool wasOn = IsOn;
|
|
|
|
IsOn = !TimeManager.Instance.TimeOfDay.IsBetween(_turnOffTimeSpan, _turnOnTimeSpan);
|
|
|
|
if (IsOn != wasOn)
|
|
{
|
|
UpdateChildren();
|
|
}
|
|
}
|
|
}
|
|
|
|
void UpdateChildren()
|
|
{
|
|
for (int i = 0; i < transform.childCount; i++)
|
|
{
|
|
transform.GetChild(i).gameObject.SetActive(IsOn);
|
|
}
|
|
}
|
|
|
|
public void OnBeforeSerialize()
|
|
{
|
|
}
|
|
|
|
public void OnAfterDeserialize()
|
|
{
|
|
_turnOnTimeSpan = _turnOnTime.ToTimeSpan();
|
|
_turnOffTimeSpan = _turnOffTime.ToTimeSpan();
|
|
}
|
|
|
|
private void CalculateOnTimeInSeconds()
|
|
{
|
|
TimeSpan turnOnTimeSpan = _turnOnTime.ToTimeSpan();
|
|
TimeSpan turnOffTimeSpan = _turnOffTime.ToTimeSpan();
|
|
|
|
float onDurationInSeconds;
|
|
if (turnOnTimeSpan < turnOffTimeSpan)
|
|
{
|
|
onDurationInSeconds = (float)(turnOffTimeSpan - turnOnTimeSpan).TotalSeconds;
|
|
}
|
|
else
|
|
{
|
|
TimeSpan fullDay = TimeSpan.FromHours(24);
|
|
onDurationInSeconds = (float)((fullDay - turnOnTimeSpan) + turnOffTimeSpan).TotalSeconds;
|
|
}
|
|
|
|
_activeTimeSpanInSeconds = onDurationInSeconds * ((float)TimeManager.Instance.SecondsPerDay / 86400f); // 86400 Sekunden pro Tag
|
|
}
|
|
}
|