74 lines
2.1 KiB
C#
74 lines
2.1 KiB
C#
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
using NeoSaveGames.Serialization;
|
|
using NeoSaveGames;
|
|
|
|
namespace NeoFPS
|
|
{
|
|
[HelpURL("https://docs.neofps.com/manual/utilitiesref-mb-timeddisabler.html")]
|
|
public class TimedDisabler : MonoBehaviour, INeoSerializableComponent
|
|
{
|
|
[SerializeField, Tooltip("The time after starting that the action will be performed.")]
|
|
private float m_Timeout = 5f;
|
|
|
|
[SerializeField, Tooltip("The action to performm on timeout (disable or destroy the object).")]
|
|
private TimeoutAction m_Action = TimeoutAction.Disable;
|
|
|
|
private static readonly NeoSerializationKey k_TimerKey = new NeoSerializationKey("timer");
|
|
|
|
private float m_Timer = 0f;
|
|
private Coroutine m_TimedDisableCoroutine = null;
|
|
|
|
public enum TimeoutAction
|
|
{
|
|
Disable,
|
|
Destroy
|
|
}
|
|
|
|
#if UNITY_EDITOR
|
|
void OnValidate ()
|
|
{
|
|
if (m_Timeout < 0f)
|
|
m_Timeout = 0f;
|
|
}
|
|
#endif
|
|
|
|
void OnEnable ()
|
|
{
|
|
m_TimedDisableCoroutine = StartCoroutine(TimedDisable(0f));
|
|
}
|
|
|
|
IEnumerator TimedDisable(float timer)
|
|
{
|
|
m_Timer = timer;
|
|
while (m_Timer < m_Timeout)
|
|
{
|
|
yield return null;
|
|
m_Timer += Time.deltaTime;
|
|
}
|
|
|
|
m_TimedDisableCoroutine = null;
|
|
|
|
if (m_Action == TimeoutAction.Disable)
|
|
gameObject.SetActive(false);
|
|
else
|
|
Destroy(gameObject);
|
|
}
|
|
|
|
public void WriteProperties(INeoSerializer writer, NeoSerializedGameObject nsgo, SaveMode saveMode)
|
|
{
|
|
if (m_TimedDisableCoroutine != null)
|
|
writer.WriteValue(k_TimerKey, m_Timer);
|
|
}
|
|
|
|
public void ReadProperties(INeoDeserializer reader, NeoSerializedGameObject nsgo)
|
|
{
|
|
if (reader.TryReadValue(k_TimerKey, out m_Timer, m_Timer))
|
|
{
|
|
if (m_TimedDisableCoroutine == null)
|
|
m_TimedDisableCoroutine = StartCoroutine(TimedDisable(m_Timer));
|
|
}
|
|
}
|
|
}
|
|
} |