Самое простое - вот так:
Код
public class Timer_DoSomethingEveryMinute: Timer {
// Seconds устанавливаем в 60 в инспекторе
protected int PrevActionI = -1;
public override void DoAction() {
Tail = Seconds; // чтобы снова сработало через одну минуту
PrevActionI++;
// делим на количество ежеминутных реакций, чтобы на 4й минуте случились теже изменения, что и на 1й
int i = PrevActionI % 3;
if (i==0) {
OnMinute_1();
} else if (i==1) {
OnMinute_2();
} else if (i==2) {
OnMinute_3();
}
}
private void OnMinute_1() {
// прошла первая минута
}
private void OnMinute_2() {
// прошла вторая минута
}
private void OnMinute_3() {
// прошла третья минута
}
}
Добавлено (06 Октября 2018, 23:35)
---------------------------------------------
На массивах - посложнее, но и погибче. Создаем компонент, у которого есть метод DoAction, от него наследуем наши ежеминутные действия:
Код
public class Action_Any : MonoBehaviour {
public virtual void DoAction() {}
}
Код
public class Action_Activate : Action_Any {
// активируем некоторые объекты
public List<GameObject> ActivateThis = new List<GameObject>() {};
public override void DoAction() {
foreach (var v in ActivateThis) {
v.SetActive(true);
}
}
}
Код
public class Action_Destroy : Action_Any {
// уничтожаем некоторые объекты
public List<GameObject> DestroyThis = new List<GameObject>() {};
public override void DoAction() {
foreach (var v in DestroyThis) {
Destroy(v);
}
}
}
Код
public class Monter : MonoBehaviour {
// монстр, всех монстров будем наследовать от Monter, как Action_Destroy от Action_Any
public float Health = 100;
public float Shield = 100;
public virtual void IncreaseHealth(float v) {
// увеличиваем здоровье
Health += v;
// а вот при уроне лучше сделать методы OnBulletHit, OnExplosionHit - чтобы монстры могли реагировать на разные события по-разному
CheckHealth(); // на всякий пожарный
}
public virtual void CheckHealth() {
// лучше запустить анимашку смерти и активировать объект с Action_Destroy по таймеру
if (Health<0.001f) Destroy(this.gameObject);
}
}
Код
public class MonterModifier : Action_Any {
// изменяем некоторых врагов
public List<Monter> MyMonsters = new List<Monter>() {};
public float HealthAdd = 0f;
public bool ShieldDropToZero = false;
public override void DoAction() {
foreach (var v in MyMonsters) {
v.IncreaseHealth(HealthAdd);
}
if (ShieldDropToZero) {
foreach (var v in MyMonsters) {
v.Shield = 0f; // лучше сделать у монстра метод, который снимает щит
}
}
}
}
Далее изменяем таймер:
Код
public class Timer_DoSomethingEveryMinute: Timer {
// Seconds устанавливаем в 60 в инспекторе
public List<Action_Any> Actions = new List<Action_Any>() {};
// в инспекторе задаем список ежеминутных действий - Action_Activate, Action_Destroy, MonterModifier, пишем свои действия унаследованные от Action_Any
public bool Repeatable = true;
protected int PrevActionI = -1;
public override void DoAction() {
Tail = Seconds; // чтобы снова сработало через одну минуту
PrevActionI++;
int i = PrevActionI;
if (Repeatable) {
// делим на количество ежеминутных реакций, чтобы на 4й минуте случились теже изменения, что и на 1й
i = i % action.Count;
} else {
if (i>=action.Count) {
// действия кончились - таймер самоуничтожается
Destroy(this);
return; // не пытаемся вызвать несуществующее действие
}
}
var curAction = Actions[i];
if (curAction==null) return;
curAction.DoAction();
}
}