Ответы пользователя по тегу Разработка игр
  • Будет ли скрипт занесённый в префаб общим для всех объектов созданного этим префабом?

    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));
            }
        }
    }
    Ответ написан
    3 комментария
  • Как поменять направление пули?

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

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

    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, тогда такой проблемы не будет.
    Ответ написан
    1 комментарий
  • Как генерировать нормальные реки при помощи Perlin noise?

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

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

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

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

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

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

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

    BasmanovDaniil
    @BasmanovDaniil
    Геймдизайнер-телепат
    Анимации делает аниматор, если его нет, то либо берут готовые анимации, либо ими занимается моделер/художник. Программист такими вещами не должен заниматься, он может вставить анимации в игру, подключить логику запуска определённых анимаций, но создавать анимации точно не его работа. Ближе всего к анимированию, наверное, инверсная кинематика, но она в основном используется для решения примитивных задач.
    Ответ написан
    6 комментариев
  • Какой сервис можно использовать для проектирования уровня игры?

    BasmanovDaniil
    @BasmanovDaniil
    Геймдизайнер-телепат
    Кроме Tiled по сути ничего и нету, все либо используют его, либо встроенные инструменты движка, либо пишут свой редактор. У каждой игры своя специфика, поэтому универсальное решение сложно сделать.
    Ответ написан
    Комментировать
  • Как настроить, чтобы Directional Light освещал всю сцену?

    BasmanovDaniil
    @BasmanovDaniil
    Геймдизайнер-телепат
    Directional Light и так светит на всю сцену, то что у вас на скриншоте, это блик. Если не хотите блик, то либо поверните источник света так, чтобы ничего не бликовало в камеру, либо в настройках материала воды сделайте гладкость поменьше, ну или вообще поставьте Unlit шейдер. Если шейдер менять не хотите, то можете выкинуть Directional Light и вместо него меняйте общий Ambient в окне Lighting.
    Ответ написан
    Комментировать
  • Как в Unity в режиме 2D определить расстояние до преграды?

    BasmanovDaniil
    @BasmanovDaniil
    Геймдизайнер-телепат
    Странно, конечно, что у них двадэшное и тридэшное API так отличается, но при желании можно написать свою обёртку:
    using UnityEngine;
    
    public static class Physics2DUtility
    {
        public static bool Raycast(Ray2D ray, out RaycastHit2D hit)
        {
            hit = Physics2D.Raycast(ray.origin, ray.direction);
            return hit.collider != null;
        }
    }

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