Ответы пользователя по тегу Unity
  • Что выбрать для создания логического квеста?

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

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

    BasmanovDaniil
    @BasmanovDaniil
    Геймдизайнер-телепат
    Что-то вы перемудрили, Gyroscope.attitude это кватернион, а не вектор, нельзя его компоненты брать и просто так использовать. Вы пример из документации пробовали, работает?
    using UnityEngine;
    
    public class GyroscopeExample : MonoBehaviour
    {
        private void Awake()
        {
            Input.gyro.enabled = true;
        }
    
        private void Update()
        {
            transform.rotation = Input.gyro.attitude;
        }
    }

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

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

    BasmanovDaniil
    @BasmanovDaniil
    Геймдизайнер-телепат
    Превращаете эйлеры в кватернион с помощью Quaternion.Euler, и умножаете на получившееся вращение:
    transform.rotation *= Quaternion.Euler(0, 90, 0);
    Ответ написан
    5 комментариев
  • Построение unity проекта под платформу android?

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

    BasmanovDaniil
    @BasmanovDaniil
    Геймдизайнер-телепат
    Почитайте документацию к MonoBehaviour.OnCollisionEnter и посмотрите официальный туториал. Для включения воды можете использовать Object.Instantiate.
    Ответ написан
    Комментировать
  • Почему треугольник хуже квадрата?

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

    BasmanovDaniil
    @BasmanovDaniil
    Геймдизайнер-телепат
    Код немножко странный, ну да ладно.
    Замените это:
    var settings = 0;
    foreach (var permission in permissionsArray)
    {
        settings += permission;
    }

    На это:
    var settings = 0;
    foreach (var permission in permissionsArray)
    {
        settings += (int) permission;
    }

    После этого должно скомпилироваться.
    Ответ написан
    Комментировать
  • Как попасть в game-dev и с чего начать карьеру в этой области если ты веб-разработчик?

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

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

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

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

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

    BasmanovDaniil
    @BasmanovDaniil
    Геймдизайнер-телепат
    Используйте метод SceneManager.LoadScene.
    Ответ написан
    Комментировать
  • Как из модели терреина сделать основной terrain?

    BasmanovDaniil
    @BasmanovDaniil
    Геймдизайнер-телепат
    Куда мешколлайдер вешали? Если на terrain_01, то не туда, у вас скорее всего нужный меш не подхватился, надо было вешать на terrain_far_01 и terrain_near_01, тогда всё заработало бы. Если даже с коллайдером не работает, то либо у вас на персонаже коллайдера нет, либо они с террейном в разных слоях, взаимодействие которых выключено в матрице в настройках физики.
    Ответ написан
    Комментировать
  • Как равномерно двигать объект (пуля)?

    BasmanovDaniil
    @BasmanovDaniil
    Геймдизайнер-телепат
    Проще всего такое делать физикой. Чтобы пули взаимодействовали с коллайдерами вам нужно повесить на них Rigidbody и отключить трение и гравитацию. Помимо этого на коллайдер пули нужно повесить физический материал с нулевым трением и единичной прыгучестью, чтобы при столкновении пули не тормозились. При выстреле запускаете пули с помощью Rigidbody.AddForce или Rigidbody.velocity, и после этого они будут вечно лететь и отскакивать от всех поверхностей.
    Ответ написан
    Комментировать
  • Шейдеры, реагирующие на объекты. Как такое создаётся?

    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. Далее в скрипте с помощью функции или анимации меняется радиус рисуемого кружка и одновременно запускается система частиц. Всё это вместе выглядит как энергетический щит, но нельзя сказать, что дело только в шейдере.
    Ответ написан
    3 комментария
  • Баг режима рендеринга Fade/Cutout в стандартном шейдере, как решить?

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

    BasmanovDaniil
    @BasmanovDaniil
    Геймдизайнер-телепат
    Для вашего случая хорошо подходит словарь, но в юнити не умеет их сериализовывать, поэтому лучше использовать список классов-контейнеров:
    using System;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.UI;
    
    public class Example : MonoBehaviour
    {
        public List<KeyboardKey> keyboardKeys = new List<KeyboardKey>();
    
        private void Update()
        {
            for (int i = 0; i < keyboardKeys.Count; i++)
            {
                var key = keyboardKeys[i];
                if (Input.GetKeyDown(key.code))
                {
                    // Делаем что-то с key.image
                }
            }
        }
    }
    
    [Serializable]
    public class KeyboardKey
    {
        public Image image;
        public KeyCode code;
    }

    При желании KeyboardKey можно сделать MonoBehaviour, тут уж как вам удобнее.
    Ответ написан
    Комментировать
  • Ошибка CS0117. Что не так?

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

    BasmanovDaniil
    @BasmanovDaniil
    Геймдизайнер-телепат
    Берёте Rigidbody.velocity и запихиваете его в Quaternion.LookRotation, получаете нужное вращение, которое можете применить к трансформу вашей графики.
    Ответ написан
    1 комментарий
  • Ошибка CS1061. Что не так?

    BasmanovDaniil
    @BasmanovDaniil
    Геймдизайнер-телепат
    Эта строчка меняет горизонтальную скорость, соответственно вам нужно rigidbody2D поменять на rb и взять текущую вертикальную скорость:
    rb.velocity = new Vector2(move*maxSpeed, rb.velocity.y);
    Ответ написан
  • Что лучше Unity vs UE4 (для 3D приложений)?

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