Ответы пользователя по тегу Разработка игр
  • Как издать игру?

    BasmanovDaniil
    @BasmanovDaniil
    Геймдизайнер-телепат
    Можно, но не совсем бесплатно, какую-то денюжку всё равно придётся заплатить, как минимум за взнос, возможно за создание юрлица. Открывайте страницу Steam Direct и читайте.

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

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

    BasmanovDaniil
    @BasmanovDaniil
    Геймдизайнер-телепат
    Сам HingeJoint2D в себе никаких поворотов не хранит, только ограничения, сбрасывать надо Rigidbody2D. Раз у вас есть пул, значит должна быть ссылка на префаб, из которого этот пул пополняется, просто берите его свойства и копируйте в сбрасываемые объекты.
    Ответ написан
    Комментировать
  • С чего начать создание игры?

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

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

    BasmanovDaniil
    @BasmanovDaniil
    Геймдизайнер-телепат
    Вам глупый MonoDevelop совершенно не то подсвечивает, поставьте лучше Visual Studio. У вас ошибка в том, что вы используете старую переменную MonoBehaviour.rigidbody2D, которая уже пару лет как не поддерживается, вам нужно самостоятельно создать ссылку на компонент, тогда всё заработает:
    private Rigidbody2D rigidbody2D;
    
    private void Awake()
    {
        rigidbody2D = GetComponent<Rigidbody2D>();
    }
    Ответ написан
    Комментировать
  • На каком движке разработана CR?

    BasmanovDaniil
    @BasmanovDaniil
    Геймдизайнер-телепат
    У них свой самописный движок, только какой вам от этого прок? Там же функционала с гулькин нос, такую игру можно на чём угодно сделать.
    Ответ написан
    Комментировать
  • Чем отличаеться GameMaker от GameMaker:stydio? И что лучше?

    BasmanovDaniil
    @BasmanovDaniil
    Геймдизайнер-телепат
    Это одно и то же, просто раньше называлось просто GameMaker, а потом студию в конце прилепили.
    Ответ написан
    3 комментария
  • Как избежать наложения текста друг на друга в pygame?

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

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

    BasmanovDaniil
    @BasmanovDaniil
    Геймдизайнер-телепат
    Хреново искали, на официальном сайте есть ссылка на все поддерживаемые движки
    download?id=ezhrKzgmOPTrOnL2LWNUcRw6CxrK
    Оттуда можно перейти на GitHub, где есть все нужные инструкции.
    Ответ написан
    Комментировать
  • Насколько полезен опыт работы тестером в программировании 3д или игр?

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

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

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

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

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

    2. Можно, просто объявляете тип переменной как List<GameObject>[], но, скорее всего, удобнее будет работать с List<List<GameObject>>. Если и так не удобно, то можете сделать класс-обёртку и будет у вас что-нибудь вроде List<Pool>.
    Ответ написан
  • Можете помочь советом по создании игры на unity3d?

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

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

    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);
        }
    }
    Ответ написан
    2 комментария
  • Как умножить текстуры в шейдере 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);
    }
    Ответ написан
    1 комментарий
  • В каком порядке изучать математические дисциплины?

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

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

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

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

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