Ответы пользователя по тегу Разработка игр
  • Как двигать объект до определенной точки при помощи rigidbody.velocity?

    BasmanovDaniil
    @BasmanovDaniil
    Геймдизайнер-телепат
    Если двигать физический объект через трансформ, то можно огрести глюки симуляции и лишние пересчёты физики. Двигайте лучше через Rigidbody.position или Rigidbody.MovePosition.
    Самостоятельно физические объекты двигаются только под действием сил, в вашем случае без циклов не обойтись.
    Ответ написан
  • Как создавать такие лабиринты для Unity?

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

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

    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...
    Ответ написан
  • Есть ли в юнити глобальные переменные?

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

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

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

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

    BasmanovDaniil
    @BasmanovDaniil
    Геймдизайнер-телепат
    SphereIndicator это корутина, а корутины запускаются с помощью StartCoroutine:
    void Update ()
    {
        if (Input.GetMouseButton(0))
        {
            var centerPoint = new Vector3(_camera.pixelWidth / 2, _camera.pixelHeight /2, 0);
            Ray ray = _camera.ScreenPointToRay(centerPoint);
            RaycastHit hit;
            bool e = Physics.Raycast(ray, out hit);
            if (e)
            {
                StartCoroutine(SphereIndicator(hit.point));
            }
        }
    }
    Ответ написан
  • Как поменять направление пули?

    BasmanovDaniil
    @BasmanovDaniil
    Геймдизайнер-телепат
    Пуля летит вправо, потому что внутри ShootScript ей задаётся такое направление:
    MoveScript move = shootTransform.gameObject.GetComponent<MoveScript>();
    if (move != null)
    {
        move.direction = this.transform.right;
    }

    Зададите другое - полетит в другую сторону. Нужный вектор можно найти с помощью Input.mousePosition и Camera.ScreenToWorldPoint.
    А вообще говоря, специально для таких случаев юнити создаёт проекты-туториалы, где есть готовые скрипты, которые можно изучать и делать своё, либо использовать как есть.
    Ответ написан
  • С чего начать программисту-разработчику игр?

    BasmanovDaniil
    @BasmanovDaniil
    Геймдизайнер-телепат
    Были такие вопросы и не раз:
    GameDev — куда «шагнуть», и как туда попасть для обучения?
    С чего начать путь в Game Dev?
    Что нужно, чтобы стать разработчиком игр?

    Берёте движок (Unreal или Unity по вкусу), читаете мануал, разбираете официальные туториалы, а потом берёте документацию к языку и движку и делаете тетрис или змейку, любую примитивную классическую игру. Когда сделаете парочку простых игрушек, то уже будете лучше понимать свои возможности. С таким мини-портфолио можно пойти в студию разработчиком, либо, если есть куча денег и хочется приключений, можно попробовать делать игры в одиночку и пытаться на них зарабатывать.
    Ответ написан
  • Как создавать игру квест(текстовый)?

    BasmanovDaniil
    @BasmanovDaniil
    Геймдизайнер-телепат
    Вариантов реализации текстовых квестов много, но в конечном итоге всё сводится графу и механике путешествия по нему. Возьмём примитивный вариант, где у вас есть вопрос с двумя вариантами ответа, каждый из которых приводит к своему результату. Вы можете представить этот вопрос как вершину графа, из которой есть два выхода в другие вершины. При таком раскладе количество вершин будет расти экспоненциально, но никто не мешает вам на оба ответа вести в одну вершину и таким образом управлять ветвлением. На такой механике можно построить очень большое количество историй, но, если хочется большего, то можно добавить другую механику.

    Ответы на вопросы могут выставлять специальные флаги, которые проверяются позже по графу. "Убить злодея?" - "Да", выставили флаг, через несколько вершин графа проверили условие и попали в другую сюжетную ветку. Флаги можно комбинировать и получать дополнительные варианты концовок.

    Кроме булевых переменных можно использовать целочисленные и дробные переменные. Например, каждое принятое решение может двигать главного героя по линии добрый-злой, а в определённых точках это значение проверяется на попадание в диапазон.

    Короче говоря, я бы предложил вам начать с абстракции над switch-case, которую можно связывать друг с дружкой, а потом почитал бы блог Emily Short, она специалист в текстовых квестах и делала кучу всевозможных механик учёта решений игрока.

    UPD: Ещё советую попробовать Twine, сейчас это самый популярный движок для текстовых игр.
    Ответ написан
  • Unity как убрать дублирование объектов?

    BasmanovDaniil
    @BasmanovDaniil
    Геймдизайнер-телепат
    У вас на камере clearFlags выставлен "Depth only" либо "Don't Clear", поэтому у вас все объекты рисуют шлейфы. Поставьте Solid Color или Skybox, тогда такой проблемы не будет.
    Ответ написан
  • Как генерировать нормальные реки при помощи Perlin noise?

    BasmanovDaniil
    @BasmanovDaniil
    Геймдизайнер-телепат
    Популярный способ - это построить карту высот, выбрать одну из точек в горах в качестве источника, а потом с помощью поиска пути спуститься по карте высот вниз одновременно рисуя путь реки.
    www-cs-students.stanford.edu/~amitp/game-programmi...
    Ответ написан
  • Как связываются ресурсы с кодом?

    BasmanovDaniil
    @BasmanovDaniil
    Геймдизайнер-телепат
    А вот зря отказываетесь от изучения движков, на живом примере проще понять внутреннее устройство.

    В общем случае, все игровые ресурсы во время интеграции снабжаются идентификатором и каким-то описанием, это может происходить в автоматическом или ручном режиме. При сборке приложения они пакуются в архив либо складываются в папочку в чистом виде. Таким образом, у движка появляется организованное хранилище, из которого он может по идентификатору доставать текстуры, модели, анимации, звуки и т. п.

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

    Импорт ресурсов, сериализация настроек, разработка и поддержка редактора - это всё задачи нетривиальные и трудоёмкие, поэтому в наше время никто больше не парится с разработкой своего движка.
    Ответ написан
  • Что делать, если не запускается Unity3d?

    BasmanovDaniil
    @BasmanovDaniil
    Геймдизайнер-телепат
    У вас точно последняя версия? Во всех последних версиях есть кнопка "work offline" рядом с "sign in" как раз для таких случаев. Для работы в редакторе регистрация не обязательна.
    Ответ написан
  • Операция, обратная запеканию нормалей?

    BasmanovDaniil
    @BasmanovDaniil
    Геймдизайнер-телепат
    Напрямую из нормалей геометрию не получить, но это можно сделать из displacement map. Получить displacement map из карты нормалей можно например с помощью этой утилиты. Далее используете Displacement to Polygons в Maya, Displace Mesh в 3ds Max или аналогичную кнопку в своём любимом редакторе.
    Ответ написан