Вторник, 03 Августа 2021, 20:17

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

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Форум игроделов » Записи участника » zit [6]
Результаты поиска
zitДата: Воскресенье, 14 Октября 2018, 19:46 | Сообщение # 1 | Тема: Как проверить массив и текст в одно условие
был не раз
Сейчас нет на сайте
Цитата alexsilent ()
if (MyArray && MyArray.length > 0)

Рекомендую наоборот делать:
Код
void Update() {
if (MyArray.Length==0) return;
if (IgnoreUpdates) return;
if (CantWorkBecauseSunIsGoDown()) return;
// do something
}

Тогда не нужно рабочий код оборачивать в скобочки, особенно если проверки многоступенчатые.
zitДата: Воскресенье, 14 Октября 2018, 19:38 | Сообщение # 2 | Тема: Распознавание рисунка пользователя
был не раз
Сейчас нет на сайте
Я бы сначала попробовал простые методы. Какой результат даст попиксельное сравнение? И отпадает вопрос "насколько похоже" - 90% совпало - на 90% и похоже. Если (по факту) окажется, что попиксельное медленно - можно укрупнить сетку. Т.е. показываем образец 1920*1080, а сравниваем с образцом 192*108 (ну и рисует игрок сразу на двух картинках: визуальной 1920*1080 и фиктивной 192*108).
zitДата: Суббота, 06 Октября 2018, 23:14 | Сообщение # 3 | Тема: Как создать виртуальное время?
был не раз
Сейчас нет на сайте
Самое простое - вот так:
Код
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
zitДата: Среда, 03 Октября 2018, 23:15 | Сообщение # 4 | Тема: Как создать виртуальное время?
был не раз
Сейчас нет на сайте
Ну, самый простой таймер выглядит так:
Код
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 минуты
  }
}
zitДата: Среда, 03 Октября 2018, 23:08 | Сообщение # 5 | Тема: Стрельба только по игроку
был не раз
Сейчас нет на сайте
Самое простое - в Bullet добавить поле fromPlayer. При триггере:
Код
if (unit.isPlayer==this.fromPlayer) return;

Соответственно, при инстанцировании пули игроком fromPlayer устанавливать в true.
Только сначала рекомендую подумать, будет ли достаточно такой простой проверки. Например, если появится второй игрок, или помощник игрока, или какой-нибудь босс, который наносит урон и своим, и чужим. Плюс, со взрывами момент. Лучше создать виды реакций:
Код
public class Bullet : MonoBehaviour {
public enum HitReaction {
  Skip = 0,
  Damage = 100,
  JustDestroyBullet = 200
}
public HitReaction onHitToGround = HitReaction.JustDestroyBullet;
public HitReaction onHitToPlayer = HitReaction.Skip;
public HitReaction onHitToEnemy = HitReaction.Skip;
}

Так система будет расширяемой, можно будет докрутить проверку на второго игрока, или (позже) сделать разрушаемое окружение. Ну и проверять столкновение не с Unit, а с каким-нибудь BulletCatcher (можно разбить Bullet и BulletCatcher по разным слоям, чтобы разгрузить физику).
zitДата: Воскресенье, 30 Сентября 2018, 22:20 | Сообщение # 6 | Тема: Трава
был не раз
Сейчас нет на сайте
Еще World Creator умеет растительность поверх земли генерить.
Форум игроделов » Записи участника » zit [6]
  • Страница 1 из 1
  • 1
Поиск:

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