Ответы пользователя по тегу Разработка игр
  • Как сделать так, чтобы разные ассеты падали в случайном порядке?

    BasmanovDaniil
    @BasmanovDaniil
    Геймдизайнер-телепат
    Создаёте список объектов, выбираете случайный с помощью Random.Range:
    using System.Collections.Generic;
    using UnityEngine;
    
    public class Example : MonoBehaviour
    {
        public List<GameObject> prefabs = new List<GameObject>();
    
        private void Update()
        {
            Spawn();
        }
    
        private void Spawn()
        {
            var prefab = prefabs[Random.Range(0, prefabs.Count)];
            Instantiate(prefab);
        }
    }
    Ответ написан
  • Как умножить текстуры в шейдере Unity?

    BasmanovDaniil
    @BasmanovDaniil
    Геймдизайнер-телепат
    Шейдеры для прожекторов работают точно так же, просто uv-карта рассчитывается по-другому:
    Projector/Multiply
    Shader "Projector/Multiply"
    {
        Properties
        {
            _ShadowTex("Cookie", 2D) = "gray" {}
            _FalloffTex("FallOff", 2D) = "white" {}
            // Добавляем свойство
            _MaskTex("Mask", 2D) = "white" {}
        }
        Subshader
        {
            Tags {"Queue"="Transparent"}
            Pass
            {
                ZWrite Off
                ColorMask RGB
                Blend DstColor Zero
                Offset -1, -1
    
                CGPROGRAM
                #pragma vertex vert
                #pragma fragment frag
                #pragma multi_compile_fog
                #include "UnityCG.cginc"
                
                struct v2f
                {
                    float4 uvShadow : TEXCOORD0;
                    float4 uvFalloff : TEXCOORD1;
                    UNITY_FOG_COORDS(2)
                    float4 pos : SV_POSITION;
                };
                
                float4x4 unity_Projector;
                float4x4 unity_ProjectorClip;
                
                v2f vert (float4 vertex : POSITION)
                {
                    v2f o;
                    o.pos = UnityObjectToClipPos(vertex);
                    o.uvShadow = mul(unity_Projector, vertex);
                    o.uvFalloff = mul(unity_ProjectorClip, vertex);
                    UNITY_TRANSFER_FOG(o,o.pos);
                    return o;
                }
                
                sampler2D _ShadowTex;
                sampler2D _FalloffTex;
                // Добавляем переменную, чтобы использовать текстуру внутри прохода
                sampler2D _MaskTex;
                
                fixed4 frag (v2f i) : SV_Target
                {
                    fixed4 texS = tex2Dproj(_ShadowTex, UNITY_PROJ_COORD(i.uvShadow));
                    texS.a = 1.0 - texS.a;
    
                    fixed4 texF = tex2Dproj(_FalloffTex, UNITY_PROJ_COORD(i.uvFalloff));
                    fixed4 res = lerp(fixed4(1, 1, 1, 0), texS, texF.a);
    
                    // Сэмплируем текстуру
                    fixed4 mask = tex2Dproj(_MaskTex, UNITY_PROJ_COORD(i.uvShadow));
                    // Применяем маску
                    res *= mask;
    
                    UNITY_APPLY_FOG_COLOR(i.fogCoord, res, fixed4(1, 1, 1, 1));
                    return res;
                }
                ENDCG
            }
        }
    }

    Чтобы лучше понять что из себя представляют uvShadow и uvFalloff, можете вывести их на экран во фрагментном шейдере:
    fixed4 frag (v2f i) : SV_Target
    {
        float2 uvShadow = UNITY_PROJ_COORD(i.uvShadow);
        float2 uvFalloff = UNITY_PROJ_COORD(i.uvFalloff);
        return fixed4(uvShadow, 0.0, 1.0);
        //return fixed4(uvFalloff, 0.0, 1.0);
    }
    Ответ написан
  • В каком порядке изучать математические дисциплины?

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

    Если ещё не читали, то прочтите статью Линейная алгебра для разработчиков игр, ещё могу посоветовать этот доклад с GDC. Для лучшего понимания трёхмерной графики очень полезно научиться моделить примитивные вещи в трёхмерном редакторе, а ещё лучше попробовать процедурно сгенерировать какую-нибудь сферу или кубик.

    Кроме того, для расширения кругозора советую погулять по ссылкам википедии про вычислительную геометрию. Какие-то вещи стоит попробовать написать самому (например, алгоритм пересечения отрезков), а про какие-то достаточно просто знать - с той же триангуляцией можно месяцами возиться, для таких вещей лучше брать готовую библиотеку.
    Ответ написан
  • Как не находить через тэг объекты у которых в названии "Preview Scene"?

    BasmanovDaniil
    @BasmanovDaniil
    Геймдизайнер-телепат
    По всей видимости, вы находите служебные объекты редактора. Если они скрыты в иерархии, то можете проверить Object.hideFlags и отсеять те, у которых выставлен флаг HideInHierarchy.
    Ответ написан
  • Что быстрее рендерится-спрайты или модели?

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

    BasmanovDaniil
    @BasmanovDaniil
    Геймдизайнер-телепат
    Нормальный подход, так много где делают, просто мало кода видели, вот и кажется странным. Более того, его используют не только для атакующих, но и атакуемых, например, делают интерефейс IDamageable и при нанесении урона работают с ним, а логика нанесения повреждений скрывается в конкретном классе.
    P. S. Attack пишется с двумя t.
    Ответ написан
  • Что выбрать для создания логического квеста?

    BasmanovDaniil
    @BasmanovDaniil
    Геймдизайнер-телепат
    Такие решения нужно принимать исходя из доступных ресурсов. Умеете хорошо рисовать - выбирайте 2D, умеете хорошо моделить - выбирайте 3D. Двадэшные спрайты сильно быстрее и дешевле в производстве, чем модели, но анимировать их может быть сложнее, тут зависит от технологии: скелетная анимация или спрайтовая. Кроме анимации технология влияет на скорость итерации, если, например, захотите поменять одежду персонажу, то со спрайтовой анимацией придется перерисовывать все атласы, со скелетной такого может и не быть, но всё зависит от используемых инструментов. С трёхмерными моделями в плане анимаций проще, при желании вообще можно найти готовые, но тридешность тянет за собой кучу других проблем: большая нагрузка на видеокарту, стилистические ограничения, возня с освещением и т. п. Если говорить про квесты, то часто идут на компромисс: героев моделят, а задники рисуют плоскими. Ещё иногда фоны моделят, но потом рендерят в текстуру и дорисовывают в фотошопе.

    Кроме того, многое зависит от ваших стилистических предпочтений, какой-то картинки проще добиться с помощью моделей, а какую-то проще нарисовать руками. При желании, конечно, можно шейдерами и постэффектами всё изменить до неузнаваемости, но не факт, что вы захотите усложнять пайплайн рендера. Для абстрактного квеста в вакууме, я бы советовал двигать в сторону двадэшной скелетной анимации, так вы быстрее всего сможете сделать прототип, а для того, чтобы разнообразить и оживить картинку, есть много трюков, посмотрите доклад от разрабов Broken Age.
    Ответ написан
  • Как сохранить кастомный массив в Unity?

    BasmanovDaniil
    @BasmanovDaniil
    Геймдизайнер-телепат
    В первую очередь вам нужно пометить класс атрибутом System.Serializable, после этого юнити будет знать, что этот класс можно сериализовать и будет показывать поля с этим типом в инспекторе. Правда нужно понимать, что юнити умеет сериализовывать далеко не все типы, поэтому DateTime вам придётся переводить в строковое представление. Чтобы вписаться в общий процесс сериализации, вам нужно реализовать интерфейс ISerializationCallbackReceiver и написать методы, в которых вы будете переводить DateTime в строку и обратно. После этого можете использовать JsonUtility, для сериализации в json и записи в файл или куда-то ещё.
    Ответ написан
  • Как моделировать дорожный трафик?

    BasmanovDaniil
    @BasmanovDaniil
    Геймдизайнер-телепат
    Открываете Google Scholar и читаете первые пять-десять страниц. После прочтения легко может оказаться, что вам не то что физика не нужна, но и вообще транспортные сети можно без автомобилей тестировать.
    Ответ написан
  • Как попасть в game-dev и с чего начать карьеру в этой области если ты веб-разработчик?

    BasmanovDaniil
    @BasmanovDaniil
    Геймдизайнер-телепат
    Ответы не ищи @ Вопросы пиши
    Куда податься вчерашнему студенту-недопрограммисту, желающему попасть в геймдев?
    Хочу попасть в игровую индустрию. В какую магистратуру поступать?
    Как попасть в game dev?
    Что нужно, чтобы стать разработчиком игр?
    С чего начать путь в Game Dev?

    Самый простой способ продемонстрировать свои способности работодателю - сделать игру. Выбираете любую классическую ретро-игру попроще (змейка, тетрис, арканоид), садитесь и делаете. Когда закончите с геймплеем, сделайте главное меню, выход по кнопке Esc, туториал или хотя бы инструкции - короче говоря, все те мелочи, которые делают игру игрой, а не прототипом. Потом берёте и выкладываете исходники на GitHub, а сборку на GitHub Pages или itch.io. Если игра мобильная, то можете разориться на лицензию разработчика и подзасрать магазин своей поделкой, тут уж как сами хотите.

    Когда всё это сделаете, можете подавать резюме, этого должно быть достаточно на позицию джуна. Будет плюсом, разумеется, если вы сделаете не одну игру, а несколько, желательно разных жанров. Они не обязательно все должны быть магазинного качества, тут уже скорее важно показать, что вы умеете делать игры в общем, а не только тетрисы. Для проверки своих навыков очень рекомендую поучаствовать в геймджемах (Ludum Dare, itch.io), они хорошо учат собранности и вырезанию лишних фичей.

    Из обучающих ресурсов могу посоветовать туториалы на Catlike Coding, там рассматривается довольно много продвинутых вещей. Про официальные туториалы тоже советую не забывать, в последнее время их качество стало сильно выше.
    Ответ написан
  • Как можно перевести персонажа игры вместе с реальной одеждой в формат 3д?

    BasmanovDaniil
    @BasmanovDaniil
    Геймдизайнер-телепат
    Берёте художника, сажаете в хорошо проветриваемую комнату и отправляете моделить на несколько недель. Сканирование подойдёт только для текстур, сетки моделей после сканирования получаются грязные, анимировать их будет тяжело. Если персонаж будет просто стоять на месте, то, например, анимацию дыхания можно зафейковать шейдером, в таком случае, возможно, имеет смысл попробовать сканировать шмотки. Но, опять-таки, где вы это будете делать? В СНГ таких контор штуки две, а за границу шмотки отправлять будет накладно. Делать свой стенд для сканирования вылетит в копеечку и много месяцев экспериментов и разработки. Многое ещё зависит от доступной вам информации, например, если у вас есть выкройки одежды, то, теоретически можно их экспортировать в Marvelous Designer. Может быть даже что-то автоматизировать. Но скорее всего выкроек у вас нет, шмотки только одного размера или только на фотографиях, денег нет, а времени в обрез. В таком случае самый жизнеспособный вариант это посадить несколько художников моделить одежду по рефам, при желании процесс достаточно хорошо масштабируется.

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

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

    Что касается взаимодействия шейдеров с объектами, так оно отсутствует. Шейдеры ничего не знают про сцену и объекты, они работают только с данными, которые есть в модельке, экранных буферах и переданных параметрах. Есть ещё глобальные константы и ключевые слова, но не думаю, что они вам в скором времени понадобятся.

    Если говорить конкретно о примере с просвечиванием сквозь стену, то делается оно довольно просто с помощью двухпроходного шейдера с изменённым ZTest. Один раз моделька рисуется только там, где в z-буфере уже что-то есть, и один раз рисуется "как обычно". В шейдере ниже я просто скопировал второй раз проход из обычного Unlit шейдера и добавил строчку с ZTest Greater, ничего сложного.
    Пример шейдера
    Shader "Custom/Example"
    {
        Properties
        {
            _Color ("Color", Color) = (1, 1, 1, 1)
        }
        SubShader
        {
            Tags { "RenderType"="Opaque" }
            LOD 100
    
            Pass
            {
                CGPROGRAM
                #pragma vertex vert
                #pragma fragment frag
                
                #include "UnityCG.cginc"
    
                struct appdata
                {
                    float4 vertex : POSITION;
                };
    
                struct v2f
                {
                    float4 vertex : SV_POSITION;
                };
    
                float4 _Color;
                
                v2f vert (appdata v)
                {
                    v2f o;
                    o.vertex = UnityObjectToClipPos(v.vertex);
                    return o;
                }
                
                fixed4 frag (v2f i) : SV_Target
                {
                    return _Color;
                }
                ENDCG
            }
    
            Pass
            {
                ZTest Greater
    
                CGPROGRAM
                #pragma vertex vert
                #pragma fragment frag
    
                #include "UnityCG.cginc"
    
                struct appdata
                {
                    float4 vertex : POSITION;
                };
    
                struct v2f
                {
                    float4 vertex : SV_POSITION;
                };
    
                float4 _Color;
    
                v2f vert(appdata v)
                {
                    v2f o;
                    o.vertex = UnityObjectToClipPos(v.vertex);
                    return o;
                }
    
                fixed4 frag(v2f i) : SV_Target
                {
                    return -_Color;
                }
                ENDCG
            }
        }
    }


    Энергетические щиты можно сделать разными способами, обычно это комбинация шейдеров, скриптов, систем частиц и анимаций. Например в шейдере может быть массив точек, рядом с которыми в определённом радиусе рисуется кружок. Точки передаются в материал с помощью Material.SetVectorArray или в рендерер с помощью MaterialPropertyBlock.SetVectorArray и Renderer.SetPropertyBlock. Далее в скрипте с помощью функции или анимации меняется радиус рисуемого кружка и одновременно запускается система частиц. Всё это вместе выглядит как энергетический щит, но нельзя сказать, что дело только в шейдере.
    Ответ написан
  • Баг режима рендеринга Fade/Cutout в стандартном шейдере, как решить?

    BasmanovDaniil
    @BasmanovDaniil
    Геймдизайнер-телепат
    Предположу, что дело в мипмапах и при отдалении камеры на тонкие линии не хватает разрешения. Попробуйте их отключить и посмотрите что получится.
    Ответ написан
  • Ошибка CS0117. Что не так?

    BasmanovDaniil
    @BasmanovDaniil
    Геймдизайнер-телепат
    Обе ошибки из-за того, что у вас нету нормальной ссылки на камеру. В первом случае вы подсунули newcam, что совпадает с названием вашего класса, а посему компилятор пытается интерпретировать это как вызов статического метода. Во втором случае вызов метода у camera не срабатывает, потому что вы взяли туториал трёхгодичной давности, а Component.camera уже давным-давно выпилили. Решить это всё можно двумя способами: обращаться к камере через Camera.main, либо сделать публичное поле и в инспекторе перетащить туда камеру.
    Ответ написан
  • Можно ли "легко" повернуть объект "лицом" в сторону его движение?

    BasmanovDaniil
    @BasmanovDaniil
    Геймдизайнер-телепат
    Берёте Rigidbody.velocity и запихиваете его в Quaternion.LookRotation, получаете нужное вращение, которое можете применить к трансформу вашей графики.
    Ответ написан
  • Что лучше Unity vs UE4 (для 3D приложений)?

    BasmanovDaniil
    @BasmanovDaniil
    Геймдизайнер-телепат
    В Asset Store гораздо больше выбор по сравнению Marketplace, например можно купить готовые модельки планет. Документация у Unity и C# получше чем у Unreal и C++, а в остальном движки одинаковые. Если раньше на плюсах писали, то берите Unreal, не придётся одновременно изучать движок и язык.
    Ответ написан
  • Как выделить несколько галочек?

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

    BasmanovDaniil
    @BasmanovDaniil
    Геймдизайнер-телепат
    Всё сводится к поиску положения мышки в мировых координатах, после этого, зная положение игрока, можно делать всё, что душе угодно. Основные методы, которые вам нужны это Camera.ScreenPointToRay и Camera.ScreenToWorldPoint. Кроме того, на эту тему есть официальный туториал, рекомендую посмотреть.
    Ответ написан
  • Как создать 2d карту?

    BasmanovDaniil
    @BasmanovDaniil
    Геймдизайнер-телепат
    У тайлов нет стандартных размеров, какие пропорции нужны для художественного стиля, такие и берутся. Иногда берут числа кратные степеням двойки для оптимизации, но и это не обязательно.

    Для работы с тайлами вам нужно либо взять бету 2017.2, либо скачать плагин из магазина, руками расстанавливать тайлы очень неудобно, замучаетесь с позиционированием и заделкой щелей. Тайлы разного размера в одной игре редко делают, но если уж так вышло, то можно их разнести по разным слоям, главное, чтобы оба набора можно было уложить в сетку одной размерности.
    Ответ написан
  • Как работает ИИ в играх?

    BasmanovDaniil
    @BasmanovDaniil
    Геймдизайнер-телепат
    Подходов к разработке ИИ много, конкретная реализация зависит от конкретной игры, где-то достаточно двух правил, которые реагируют на события, где-то нужно городить поведенческие деревья. Начинают обычно с конечных автоматов, как самых простых в реализации, далее по степени сложности идут поведенческие деревья и Utility AI, про все три можно почитать в статье на гамасутре. Помимо этого, можете почитать pdf-ки со статьями на сайте Game AI Pro. Если больше любите смотреть презентации, то можете заглянуть на канал GDC.

    Выполняется код в отдельных потоках или нет к разработке ИИ не относится, это просто оптимизация, которая используется по ситуации.
    Ответ написан