Задача такая - создать скрипт, который может запускать указанные события через указанное время. Моя реализация:
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
public class TimedTriggers : MonoBehaviour {
[Serializable]
public struct TimedEvent {
public float delay;
public bool looping;
public UnityEvent onEvent;
private float timer;
private bool readyToPlay;
}
[Min(0.01f)][SerializeField] private float m_timeStep = 0.1f;
[SerializeField] private List<TimedEvent> m_events = new List<TimedEvent>();
private void Awake() => StartCoroutine(TimeRoutine());
private IEnumerator TimeRoutine() {
while (true) {
if (m_events.Count > 0)
foreach (TimedEvent e in m_events)
Tick(e);
yield return new WaitForSeconds(m_timeStep);
}
}
private void Tick(TimedEvent timedEvent) {
if (timedEvent.timer < timedEvent.delay)
timedEvent.timer += m_timeStep;
else {
if (timedEvent.looping && !timedEvent.readyToPlay)
timedEvent.readyToPlay = true;
if (timedEvent.readyToPlay) {
timedEvent.readyToPlay = false;
timedEvent.timer = 0f;
timedEvent.onEvent.Invoke();
}
}
}
}
Проблема в том, что консоль ругается на наличие не публичных полей в структуре:
Можно забить и сделать все поля public, но перед этим хотелось бы узнать, есть ли нормальное решение этой проблемы?