Ответы пользователя по тегу Unity
  • Находил ли кто-нибудь алгоритм разделения рандомной карты на различные регионы?

    @AlexHell
    подробней про Кластеризацию
    https://habr.com/ru/post/101338/

    Ищу подобное решения для увеличения продуктивности алгоритмов поиска пути.

    вы можете провести все ваши предварительные расчеты в оффлайне (т.е. на этапе генерации карты, а не во время "битвы")

    как алгоритм - вводите любое правило (эвристику), которое показывает хорошие результаты, нужные вам (а никто не скажет, думайте, пробуйте)

    например
    - первым проходом - циклом итерируете все клетки одинакового типа (синие на карте например, допустим это "вода"), проверяете тип их соседей, выбираете границы, скажем зеленые\желтые (допустим "суша"), по результату этапа у вас есть большие области одного "цвета" с их границами (для описания можете заюзать bounding box или convex hull или что угодно такого рода)
    - вторым проходом - можно поделить крупные области, на более мелкие, например получить r1, r2, r3 с вашего скриншота, из исходного (на вашем скриншоте нету, но считайте что он сумма r1+r2+r3).. с помощью определения макс удаленности, скажем берете границу любую случайно - и от нее далее ведете по границе, пока не превышен лимит, или еще как-нибудь во время итерации ваших точек внутри региона проверяете лимит длины до первоначально выбранной границы

    p.s. а еще для той же цели оптимизации поиска почитайте
    https://www.redblobgames.com/pathfinding/grids/alg...
    Ответ написан
    Комментировать
  • Почему на смартфоне Lerp работает медленее?

    @AlexHell
    а где учат писать такой LERP с динамической точкой старта? для перемещения с равномерной скоростью нужно начальную точку и конечную взять статичными, меняя только коэффициент интерполяции от 0 до 1
    например (инцииализацию можете и по-своему сделать)
    public GameObject Test;
    public Vector3 StartPosition;
    public Vector3 TargetPosition;
    void Start() {
      StartPosition = Test.transform.position;
    }
    void Update(){
        Test.transform.position = Vector3.Lerp(StartPosition, TargetPosition, 5f * Time.deltaTime);
        }


    то что вы изначально написали может дико зависеть как от FPS так и от погрешности устройства, и вобще криво т.к. не выражает намерений (от куда до куда за сколько пеермещаться должно?)
    Ответ написан
    Комментировать
  • Как найти пустое место на воде в 2d?

    @AlexHell
    простое решение - цикл перебора рандомных варинтов X
    // ВНЕ цикла подбора рандомного X для оптимизации
      foreach (GameObject enemy in enemies)
      {
        // заполнить _usedCoordX
      }
    // цикл подбора рандомного X
    while (true)
    {
      int x = Random.Range(1 - _minX, _maxX);
      if (!_usedCoordX.Contains(x)) break;
    }


    (НЕ эффективное по перфомансу, можно оптимизить - структурами Spatial или заполненными областями - не буду приводить реализации)

    ___
    UPDATE:

    там где _usedCoordX заполняется
    хорошо бы бить поле на GRID равномерный, аналог хеша
    ______
    |__|__|
    |__|__|

    например
    если позиция object.X >= 10 && object.X < 20 то newX=1
    если позиция object.X >= 20 && object.X < 30 то newX=2
    и т.п с шагом 10
    тогда при уже существующем объекте с X = 15, не сгенерится объект с X = 16 или 17 и т.п т.к они в одной ячейке сетки

    и Random конечно по той же размерности кидать (_maxX должен быть не полного пиксельного\объектого размера, а размера сетки)

    UPD2: по теме https://gamedev.stackexchange.com/questions/69310/...
    и там же есть картинка

    UPD3: вместо равномерного GRID - можно юзать истинный Collision Detection, т.е после генерации Random X - проверять всех врагов вокруг, и если есть - генерить заного, так наверное лучше будет

    .. но опять же можно проверять по GRID-у всех в этой же ячейке (т.е если X равен 15, то проверим всех врагов - есть ли они в X от 10 до 19, и если нет - выход из цикла
    .. плюс проверять в соседних ячейках (иначе будут прям вплотную генериться
    Ответ написан
    Комментировать