Задать вопрос
  • Как создавать такие лабиринты для Unity?

    BasmanovDaniil
    @BasmanovDaniil
    Геймдизайнер-телепат
    Задача состоит из двух частей: генерация графа лабиринта и визуализация графа. Про алгоритмы генерации можно почитать в википедии, их очень много, все дают разные результаты, весьма вероятно, что вам придётся придумать свой, чтобы получить нужную связность лабиринта. Пример генерации можете посмотреть в моём тулките. Когда граф сгенерирован, его можно визуализировать любым образом, всё зависит только от вашей фантазии, проще всего это сделать с помощью инстанцирования префабов. Просто обходите весь граф и создаёте стенки в нужных местах. Примеры кода можете посмотреть здесь и здесь.
    Ответ написан
    1 комментарий
  • Как передвинуть объект в Unity 3D?

    BasmanovDaniil
    @BasmanovDaniil
    Геймдизайнер-телепат
    Все объекты на сцене двигаются одинаково - через изменение положения трансформа. Либо используете Transform.Translate, либо меняете Transform.position/Transform.localPosition напрямую. В 2d всё работает точно так же, просто не меняйте координату z, двигайте только в плоскости XY.
    Ответ написан
    Комментировать
  • Как откатить версию SDK на более раннюю?

    BasmanovDaniil
    @BasmanovDaniil
    Геймдизайнер-телепат
    Открываете Android SDK Manager и качаете нужную версию.
    562aeddab9ee4edfb275f128e972f472.png
    Ответ написан
    1 комментарий
  • Как построить путь от точки А до точки Б визуально в Unity3D?

    BasmanovDaniil
    @BasmanovDaniil
    Геймдизайнер-телепат
    Самый простой способ - это использовать компонент LineRenderer.

    Если его возможностей недостаточно, то можно инстанцировать префабы в каждой точке пути:
    private GameObject waypointPrefab;
    
    private void DrawPath(List<Vector3> path)
    {
        foreach (var position in path)
        {
            Instantiate(waypointPrefab, position, Quaternion.identity);
        }
    }

    При желании можно их поворачивать в сторону следующей точки. Скорее всего, вам ещё понадобится пул для объектов, которые вы инстанцируете.

    Если визуализация нужна неразрывная, но более детальная, чем умеет LineRenderer, то можно строить меш нужной формы в рантайме. Хорошие туториалы по теме есть здесь.
    Ответ написан
    Комментировать
  • Как в unity реализовать подобный интерфейс?

    BasmanovDaniil
    @BasmanovDaniil
    Геймдизайнер-телепат
    Вам нужен класс UnityEvent, можете от него отнаследоваться, если хотите предавать какие-то данные, либо используйте просто так. Вызывать из кода надо с помощью Invoke.
    Ответ написан
    Комментировать
  • Реализация мини-игр в 3d-игре?

    BasmanovDaniil
    @BasmanovDaniil
    Геймдизайнер-телепат
    Делаете миниигру префабом на отдельной сцене таким образом, чтобы в неё можно было играть с любой камерой. Тестируете, полируете. Потом вставляете туда, где она должна быть. Далее несколько вариантов.
    Вариант для ленивых - по кнопке выключаете камеру и модельку персонажа, включаете камеру, которая смотрит на миниигру. Возвращаетесь обратно аналогичным образом. Переключение камеры можно замаскировать уходом в затемнение или ещё как.
    Вариант посложнее - делаете контроллер камеры, который умеет фокусироваться на точках в пространстве, в нужный момент меняете точку фокуса с персонажа на миниигру. Либо это может быть один супер скрипт, который умеет делать всё, либо это может быть два скрипта, которые работают по очереди когда надо. Камера будет плавно доезжать от персонажа к миниигре, что добавит живости и связности игровому миру.
    При желании можно комбинировать оба варианта: доезжать в сторону миниигры и одновременно затемнять экран, а потом включать другую статичную настроенную под миниигру камеру.
    Ответ написан
    1 комментарий
  • Краудфандинг без "раскрутки" в медия?

    BasmanovDaniil
    @BasmanovDaniil
    Геймдизайнер-телепат
    Нет. Краудфандинг подразумевает крауд - толпу, если про ваш проект никто не знает, то и поддерживать его никто не будет. Успешный сбор денег на кикстартере требует работы с прессой до и после запуска страницы проекта. На канале GDC есть хороший доклад на тему.
    Ответ написан
    Комментировать
  • Будет ли скрипт занесённый в префаб общим для всех объектов созданного этим префабом?

    BasmanovDaniil
    @BasmanovDaniil
    Геймдизайнер-телепат
    Скрипт не будет общим, у каждого инстанцированного префаба будет свой экземпляр класса. А проблема у вас в скрипте, вы считаете одинаковое расстояние для всех объектов:
    pointDistans = GameObject.Find("point").GetComponent<Transform>();
    ...
    distans = Vector3.Distance (pointDistans.position, camer.position);

    По всей видимости, вам нужно поменять строчку в апдейте:
    distans = Vector3.Distance (transform.position, camer.position);
    Ответ написан
    Комментировать
  • Как настроить нормально освещение Unity?

    BasmanovDaniil
    @BasmanovDaniil
    Геймдизайнер-телепат
    Если хотите похожую картинку, то сначала идёте в Player Settings и выставляете Color Space: Linear. Потом в материале, поиграйте металликом и гладкостью материала, которым вы рисуете сцену. Далее приступайте к настройке освещения, начинать нужно с ambient'а. Выключаете источник света и в окне Lighting меняете скайбокс на серый, либо в качестве источника эмбиента выбираете градиент или цвет. Этим вы настроите приблизительную яркость затенённых поверхностей. Потом включаете источник света и настраиваете его цвет и интенсивность. Напоследок вам нужно запечь лайтмапы, чтобы получить тенюшки во всех складках местности. Либо можете воспользоваться постэффектом SSAO. Подробнее обо всём этом можно почитать в официальных туториалах:
    https://unity3d.com/ru/learn/tutorials/topics/grap...
    https://unity3d.com/learn/tutorials/topics/graphic...
    Ответ написан
    Комментировать
  • Как загрузить картинку через sprite?

    BasmanovDaniil
    @BasmanovDaniil
    Геймдизайнер-телепат
    Для начала вытащите замену спрайта из апдейта, суньте в Awake или Start. Потом дебаггером проверьте что у вас действительно что-то грузится из ресурсов. В остальном всё должно работать.
    Ответ написан
  • Как вернуть прежнее состояние объекта после использования Physics2D.IgnoreCollision?

    BasmanovDaniil
    @BasmanovDaniil
    Геймдизайнер-телепат
    IgnoreCollision можно сбросить выключением коллайдера, как и написано в документации:
    When deactivating the collider the IgnoreCollision state will be lost and you have to call Physics2D.IgnoreCollision again.

    IgnoreLayerCollision, по всей видимости, меняет матрицу взаимодействия слоёв, и отменить его так просто нельзя. Либо запоминайте то, что вы игнорировали, либо сохраняйте матрицу целиком с помощью GetIgnoreLayerCollision и GetLayerCollisionMask, а когда понадобится, так же целиком перезаписывайте текущую матрицу.

    Ещё можно разрулить всё слоями и переносить либо движущиеся объекты между слоями, либо препятствия. IgnoreCollision это скорее костыль для особых ситуаций, повсеместно использовать его не стоит.
    Ответ написан
    Комментировать
  • Есть ли в юнити глобальные переменные?

    BasmanovDaniil
    @BasmanovDaniil
    Геймдизайнер-телепат
    В юнити, а точнее в c# нет глобальных переменных. Существуют статические переменные и константы, которыми можно пользоваться для хранения глобальной информации, но весьма сомнительно, что вам нужна действительно глобальная доступность. Скорее всего, у вас есть несколько классов, которые из-за неправильного разделения обязанностей вынуждены залезать друг в друга для синхронизации состояния. Это решается только переорганизацией кода, глобальные переменные и синглтоны дело только усугубят.
    В контексте юнити для разрешения зависимостей хорошо работает техника dependency injection, которая реализована во многих фреймворках, например в Zenject. Помимо этого, в юнити есть ScriptableObject, который очень удобен для хранения конфигов, позволяет легко передавать их между классами и редактировать в рантайме. Думаю, этих двух вещей должно быть достаточно для начала, остальное придёт с практикой.
    Ответ написан
    Комментировать
  • Delta Time или Fixed Delta Time?

    BasmanovDaniil
    @BasmanovDaniil
    Геймдизайнер-телепат
    Точнее всего во время старта сохранять DateTime.Now, а в момент остановки таймера брать DateTime ещё раз, вычитать первое из второго и получать TimeSpan, а дальше можно делать что угодно. Это самый гибкий вариант, но DateTime ничего не знает про Time.timeScale, если вы хотите учитывать замедление-ускорение времени, то берите Time.time и точно так же отмеряйте старт и финиш таймера. Плюсовать deltaTime очень ненадёжно.
    Ответ написан
  • Как создаются приложения аналогичные LifeLine, где имеется диалоговое окно с действиями?

    BasmanovDaniil
    @BasmanovDaniil
    Геймдизайнер-телепат
    Были такие вопросы совсем недавно:
    Как создавать игру квест(текстовый)?
    Какой игровой движок лучше использовать для текстового квеста на андроид?

    Вкратце: делаете редактор графа, делаете механику перемещения по графу, цепляете в узлы графа данные для отображения. Конкретно в LifeLine продвижение по графу связано со временем, но это просто ещё одна механика.
    Ответ написан
    Комментировать
  • Когда начать работу над сохранением прогресса в игре?

    BasmanovDaniil
    @BasmanovDaniil
    Геймдизайнер-телепат
    Для сферической игры в вакууме, я бы начал делать сохранения после того, как сделал меню, чтобы как можно раньше реализовать полный цикл приложения. Никто мешает вам в отдельных тестовых сценах/проектах продолжать работу над геймплеем, и никто не заставляет вас сразу сохранять все механики. Но, по крайней мере, вы сразу задумаетесь о том, какие переменные может понадобиться сохранять, а это заставит вас соответствующим образом поменять архитектуру, что сделает ваше приложение более гибким. А "кучу идей" в любом случае не стоит пихать в основное приложение, эксперименты с механиками не должны ломать стабильное состояние игры. Интегрировать механики с сохранками имеет смысл только после их утверждения.
    Ответ написан
    Комментировать
  • Как запустить видео в Unity VR(Cardboard)?

    BasmanovDaniil
    @BasmanovDaniil
    Геймдизайнер-телепат
    В Unity 5.6, которая вышла сегодня, есть поддержка 360 видео из коробки. Документация на сайте ещё не вся обновилась, но пользоваться можно. Поддержка всех VR платформ тоже есть.
    https://docs.unity3d.com/ScriptReference/Video.Vid...
    https://docs.google.com/document/d/1gZa5z_jEEETDk8...

    5_6_feature_videoplayer.gif
    Ответ написан
    2 комментария
  • Как реализованы порталы в игре Portal?

    BasmanovDaniil
    @BasmanovDaniil
    Геймдизайнер-телепат
    Честные порталы делать очень сложно, нужно хорошо понимать физику и весь пайплайн рендера. Есть очень много граничных случаев, каждый из которых нужно отдельно поддерживать: портал внутри портала, пересечение границ внутреннего и внешнего портала, несколько внутренних порталов, повороты плоскости портала, перемещение предметов, тени и освещение, прозрачные материалы и т. п. Есть две основные техники реализации отрисовки порталов: через рендер текстуры и стенсильный буфер.

    Порталы на рендер текстурах делаются проще, но они дороже по производительности, даже на простой геометрии несколько порталов могут оказаться непосильной задачей для компьютера. Основной принцип следующий: когда вы смотрите на портал, на другой стороне портала камера рисует картинку в текстуру, эта текстура натягивается на плоскую геометрию, и со стороны кажется, будто бы через дырку видно другую часть сцены. Примитивную реализацию такой схемы можно собрать руками в редакторе, но дальше начинаются сложности. Если у конечного портала "за спиной" будет геометрия, она попадёт во вьюпорт камеры и будет странно смотреться. Чтобы это предотвратить нужно ближнюю плоскость отсечения у камеры сдвигать в плоскость портала с помощью CalculateObliqueMatrix. Для вычисления положения камеры и пересчёта матрицы есть удобный колбэк OnRenderObject. После корректировки матрицы порталы будут смотреться более-менее корректно, но будут всплывать всевозможные косяки при перемещении через плоскость портала из-за буфера глубины и nearClipPlane основной камеры.

    Стенсильные порталы будут работать сильно быстрее, но для их реализации нужно хорошо шарить в шейдерах. Расписывать их работу подробно не буду, в целом они делаются точно так же, только трюки с рендер текстурами заменяются на трюки с буферами, предлагаю лучше почитать пару полезных статей на тему: раз и два. В контексте юнити всё немного сложнее, чем на чистом OpenGL, потому что нет прямого доступа ко всем буферам и для получения похожего результата придётся немного поизвращаться. Потенциально облегчить задачу может низкоуровневое API, но у меня не получилось добиться хороших результатов без потери качества картинки. Я возлагаю большие надежды на ScriptableRenderLoop, если судить по документации, это как раз то, что нужно.

    Прошу заметить, что всё вышесказанное касается чисто графической части, для простейшего случая, когда мы имеем FPS камеру без анимаций, без дополнительных механик, которая просто ездит по уровню и может заглядывать в порталы. Что уж говорить про миллион потенциальных багов, если вы захотите включить рядом с порталом систему частиц или взять в руки кубик. Посему советую либо купить плагин и довольствоваться тем, что он умеет, либо приготовиться потратить несколько месяцев на разработку своей портальной системы. И в том и другом случае ограничения движка не позволят вам в разумные сроки получить Portal, в лучшем случае это будет Narbacular Drop.
    Ответ написан
    Комментировать
  • Есть ли игры в открытом мире с круглой землей (картой)?

    BasmanovDaniil
    @BasmanovDaniil
    Геймдизайнер-телепат
    Много игр с такими мирами: No Man's Sky, Super Mario Galaxy, Planetary Annihilation. Разрабы No Man's Sky недавно проводили презентацию про свои технологии генерации. Про Super Mario Galaxy есть небольшой видеоролик на YouTube. У разработчиков Planetary Annihilation даже есть свой видеоблог, там обсуждалось много технических моментов.
    Ответ написан
    Комментировать
  • Как сделать чтобы число каждую секунду убавлялось в C# под unity?

    BasmanovDaniil
    @BasmanovDaniil
    Геймдизайнер-телепат
    Вариант первый: внутри Update уменьшаете число с определённой скоростью и постоянно проверяете перешагнуло ли значение порог.
    using UnityEngine;
    
    public class Test : MonoBehaviour
    {
        public float value = 100;
        public float speed = 5;
    
        private void Update()
        {
            value -= Time.deltaTime*speed;
            if (value < 0)
            {
                Debug.Log("Zero");
            }
        }
    }

    Такой вариант удобен, если не нужна точность, интервал времени небольшой, а после достижения значения скрипт уничтожается либо перезапускается. Время достижения цели вычисляется делением value на speed, либо наоборот из времени можно вычислять скорость. На плохом FPS значение будет плавать, синхронизировать несколько таймеров будет проблемно.

    Второй вариант: вычислять время, когда переменная должна принять определённое значение, текущее значение вычислять когда надо.
    using UnityEngine;
    
    public class Test : MonoBehaviour
    {
        public float maxValue = 100;
        public float interval = 20;
        public float currentValue;
    
        private float zeroTime;
    
        private void Awake()
        {
            zeroTime = Time.time + interval;
        }
    
        private void Update()
        {
            if (Time.time >= zeroTime)
            {
                Debug.Log("Zero");
            }
            else
            {
                float currentNormalizedTime = 1 - (zeroTime - Time.time)/interval;
                currentValue = Mathf.Lerp(maxValue, 0, currentNormalizedTime);
            }
        }
    }

    Точность в таком случае будет лучше. Если хочется, то можно запоминать только время старта изменения переменной, либо и то и другое. Опираясь на время проще сделать нелинейное изменение значения, вместо лерпа можно подставить любую функцию.

    Третий вариант такой же как и второй, только вместо Time.time нужно использовать DateTime.Now. DateTime не завязан на сессию приложения, его можно сериализовать и сохранять локально либо на сервере. Например, вы делаете тамагочи и хотите, чтобы питомец подыхал, если за ним долго не ухаживать. С помощью сохранённого времени вы можете уменьшать здоровье в реальном времени и ретроспективно при запуске приложения.

    Если хочется совсем харкора, то можно пользоваться не Update, а отдельным тредом, в котором будет жить ваш таймер, но такое бывает нужно лишь в исключительных случаях.
    Ответ написан
    Комментировать