Ответы пользователя по тегу Unity
  • Почему scroll rect перестает работать?

    BasmanovDaniil
    @BasmanovDaniil
    Геймдизайнер-телепат
    EventTrigger перехватывает все события, поэтому они не попадают в ScrollRect. Если хотите подписаться на какое-то событие, то нужно делать специальный класс и наследоваться от конкретного интерфейса, например IPointerDownHandler.
    Ответ написан
    Комментировать
  • Какое из решений более рациональное?

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

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

    BasmanovDaniil
    @BasmanovDaniil
    Геймдизайнер-телепат
    Если использовать ScreenCapture.CaptureScreenshot, то сложнее управлять процессом съёмки, в кадр могут попасть лишние слои, будут фризы при загрузке картинки обратно с диска, больше потребление памяти. Правильнее всего делать это с помощью Camera.Render и RenderTexture, при такой схеме можно включать/выключать постэффекты, проще управлять разрешением скриншота и отображать превью в интерфейсе. В нужный момент просто создаёте рендер-текстуру, втыкаете её в Camera.targetTexture, вызываете Render и возвращаете старое значение targetTexture. Всё, после этого у вас есть текстура, которую можно вывести на экран с помощью компонента RawImage.

    Чтобы сохранить текстуру на диск, её нужно сначала сконвертировать в Texture2D с помощью Texture2D.ReadPixels, а потом закодировать в нужный формат вызвав ImageConversion.EncodeToPNG или ImageConversion.EncodeToJPG. Из коробки Unity умеет сохранять картинки на мобилках только в Application.persistentDataPath, для доступа к галерее нужен плагин, в AssetStore их полно, некоторые умеют даже сохранять сразу рендер-текстуру.
    Ответ написан
    2 комментария
  • Как происходит автоматический Merge в Unity?

    BasmanovDaniil
    @BasmanovDaniil
    Геймдизайнер-телепат
    Unity ничего не выбирает, редактор про гит ничего не знает. После автоматического мерджа в гите у вас просто разламываются файлы, а юнити с этим живёт как может. Такие проблемы решаются либо грамотной организацией работы с общими файлами, либо с помощью stash и ручного разрешения конфликтов. Почитайте про гит здесь и здесь.
    Ответ написан
    Комментировать
  • Правильный путь для файла или как открыть PDF на iOS?

    BasmanovDaniil
    @BasmanovDaniil
    Геймдизайнер-телепат
    Папка StramingAssets вшивается в приложение, если вы в редакторе что-то туда положили, оно будет доступно в рантайме.
    Во-первых, вы уверены, что у вас на телефоне pdf нормально открывается? Попробуйте открыть его руками.
    Во-вторых, попробуйте вывести в консоль путь, по которому вы пытаетесь открыть файл, может быть он у вас неправильно склеился. Если это так, то попробуйте использовать вместо плюса Path.Combine.
    Ответ написан
    Комментировать
  • Можете помочь советом по создании игры на 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 комментария
  • Как плавно сместить объект на определенное расстояние в unity3d?

    BasmanovDaniil
    @BasmanovDaniil
    Геймдизайнер-телепат
    Вариантов несколько, например можете использовать Vector3.Lerp:
    using UnityEngine;
    
    public class Example : MonoBehaviour
    {
        public Vector3 fromPosition = Vector3.zero;
        public Vector3 toPosition = Vector3.one;
        public float speed = 1;
    
        private float progress;
    
        private void Update()
        {
            progress += Time.deltaTime*speed;
            transform.position = Vector3.Lerp(fromPosition, toPosition, progress);
        }
    }
    Ответ написан
    6 комментариев
  • Как в Unity3d сделать так, чтобы клон одного ассета не спавнился в корне другого?

    BasmanovDaniil
    @BasmanovDaniil
    Геймдизайнер-телепат
    На падающих объектах скорее всего есть коллайдеры, да? Используйте Physics.CheckSphere, если в случайно выбранной точке уже есть объект, то выкидываете её и выбираете новую. Делайте так в цикле, пока не найдёте свободное пространство, либо количество итераций не превысит какой-то порог, например сто циклов. В большинстве случаев этого будет достаточно.
    Ответ написан
    2 комментария
  • Дайте пожалуйста статью для настройки Unity под мобильную игру?

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

    BasmanovDaniil
    @BasmanovDaniil
    Геймдизайнер-телепат
    Стандартными средствами Unity - никак. Проще всего дорисовать её на спрайте кнопки, но если рисовать не хотите, то либо ищите плагин, либо пишите шейдер.
    Ответ написан
    Комментировать
  • Как не находить через тэг объекты у которых в названии "Preview Scene"?

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

    BasmanovDaniil
    @BasmanovDaniil
    Геймдизайнер-телепат
    Все новые версии юнити по умолчанию показывают окно выбора проекта, раз у вас не так, то, возможно, сломались настройки редактора, попробуйте включить-выключить галку "Load Previous Project on Startup". Если не помогает, то можете запускать редактор с зажатой кнопкой Alt, она покажет окно выбора проекта независимо от настроек.
    Ответ написан
    Комментировать
  • Как правильно деинтегрировать json в Unity, полученный с помощью SendMessage?

    BasmanovDaniil
    @BasmanovDaniil
    Геймдизайнер-телепат
    Нужно разобрать json в понятный для шарпа формат. Можно сделать это с помощью встроенного JsonUtility, либо можно скачать любой из миллиона json-парсеров, и использовать его. Что-то есть на Assett Store, но многие парсеры живут на гитхабе или собственном сайте.
    Ответ написан
  • Unity 3D NavMesh Как построить путь с изменяющейся траекторией?

    BasmanovDaniil
    @BasmanovDaniil
    Геймдизайнер-телепат
    Вариант первый: использовать NavMesh Link или Off Mesh Link и обновлять их динамически при движении платформы. Такой вариант подойдёт, если путь один и платформа будет притормаживать в крайних положениях, чтобы дождаться агентов. Агенты при этом должны будут постоянно обновлять свой путь.
    Вариант второй: использовать те же самые компоненты, но оставлять связи статическими и разруливать всё внутри агента. То есть просто прокидываете связь через пропасть вдоль пути платформы, а дальше агент найдёт этот путь, пойдёт по нему, увидит рейкастом дырку, остановится, потом дождётся момента пока дырка пропадёт и прыгнет или шагнёт на платформу. По той же логике он сможет и спрыгнуть с платформы.
    Ещё можно комбинировать оба варианта, но это скорее зависит от вашего геймплея, может быть вам не нужны слишком умные агенты.
    Ответ написан
    Комментировать
  • Что быстрее рендерится-спрайты или модели?

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

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