Среда, 12 Декабря 2018, 12:23

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Модератор форума: beril  
Форум игроделов » Движки для разработки игр и сложные системы разработки » Unity » Как создать виртуальное время?
Как создать виртуальное время?
DaniilF12Дата: Среда, 03 Октября 2018, 22:56 | Сообщение # 1
был не раз
Сейчас нет на сайте
Мне нужно создать виртуальное время, а в дальнейшем взаимодействовать с ним. Мне нужно сделать так чтобы каждые прошедшие 24 минуты обнулялись и считывались, каждая минута под свое значение. Подскажите как проще это сделать, пожалуйста.
zitДата: Среда, 03 Октября 2018, 23:15 | Сообщение # 2
был не раз
Сейчас нет на сайте
Ну, самый простой таймер выглядит так:
Код
public class Timer: MonoBehaviour {
  public float Seconds = 0f;
  protected float Tail = 0f;
  void Start() {
    Tail = Seconds;
  }
  void Update() {
    Tail -= Time.deltaTime;
    if (Tail<0.001f) DoAction();
  }
  public virtual void DoAction() {}
}

Код
public class Timer_ErasePrevState: Timer {
  // 24*60 задаем в инспекторе
  public override void DoAction() {
    // что мы там стираем? вот тут стираем...
    Tail = Seconds; // чтобы снова сработало через 24 минуты
  }
}
DaniilF12Дата: Пятница, 05 Октября 2018, 19:05 | Сообщение # 3
был не раз
Сейчас нет на сайте
zit, А как взаимодействовать с каждой из минут?
drcrackДата: Суббота, 06 Октября 2018, 18:34 | Сообщение # 4
почти ветеран
Сейчас нет на сайте
Цитата
zit, А как взаимодействовать с каждой из минут?

что это вообще значит?
DaniilF12Дата: Суббота, 06 Октября 2018, 19:23 | Сообщение # 5
был не раз
Сейчас нет на сайте
drcrack, Например если пошла 11 минута, происходит одно действие, 5 минут - другое.
zitДата: Суббота, 06 Октября 2018, 23:14 | Сообщение # 6
был не раз
Сейчас нет на сайте
Самое простое - вот так:
Код
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();
  }
}


Сообщение отредактировал zit - Суббота, 06 Октября 2018, 23:42
Форум игроделов » Движки для разработки игр и сложные системы разработки » Unity » Как создать виртуальное время?
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2018 Рейтинг