Ответы пользователя по тегу Unity
  • Как в unity 2d сделать прыжок по траектории?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    У вас есть позиция персонажа. Джойстиком вы задаёте угол и, возможно, силу прыжка. Далее используйте формулу
    x = x0 + v*t + 1/2*a*t^2.

    Киньте этот скрипт на объект с LineRenderer и посмотрите как он устроен.
    using UnityEngine;
    
    public class TrajectoryRenderer : MonoBehaviour {
    
    	public LineRenderer lineRenderer; // Ссылка на LineRenderer, который будет отображать траекторию
    	public Transform launchPoint; // Точка запуска
    	public float launchForce = 10f; // Сила запуска
    	public int resolution = 30; // Разрешение линии (количество точек)
    
    	private void Update() {
    		Vector3[] points = new Vector3[resolution];
    		lineRenderer.positionCount = resolution;
    
    		float launchAngle = Mathf.Deg2Rad * launchPoint.eulerAngles.z; // Угол запуска в радианах
    		Vector2 launchVelocity = launchForce * new Vector2(Mathf.Cos(launchAngle), Mathf.Sin(launchAngle)); // Начальная скорость
    
    		for (int i = 0; i < resolution; i++) {
    			float time = i / (float) resolution;
    			points[i] = CalculatePosition(time, launchVelocity);
    		}
    
    		lineRenderer.SetPositions(points);
    	}
    
    	Vector3 CalculatePosition(float time, Vector2 launchVelocity) {
    		// Вычисляем текущее положение с учётом гравитации
    		// Формула: P = P0 + V0*t + 1/2*a*t^2
    		// где P0 - начальное положение, V0 - начальная скорость, a - ускорение (гравитация), t - время
    		Vector2 position = (Vector2) launchPoint.position + launchVelocity * time + 0.5f * Physics2D.gravity * time * time;
    		return new Vector3(position.x, position.y, 0);
    	}
    }
    
    * поворот задаётся поворотом самой точки запуска
    Ответ написан
    Комментировать
  • Как составить роудмап обучения рендеру в целом и Unity SRP в частности на 2 месяца?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    Общее направление примерно такое:
    Неделя 1: Введение в компьютерную графику. Изучение основ векторной и матричной алгебры, применяемой в графике. Основы OpenGL. Работа с буферами, шейдерами, текстурами. Создание простейшей сцены.
    Неделя 2: Продолжение изучения OpenGL. Реализация освещения, теней и других базовых эффектов.
    Неделя 3: Основы работы в Unity. Создание проектов, изучение интерфейса, базовые компоненты и скриптинг на C#.
    Неделя 4: Введение в Scriptable Render Pipeline. Различия между Built-in, URP, и HDRP. Создание простого кастомного рендерера в SRP.
    Неделя 5: Глубокое погружение в URP. Настройка освещения, теней, post-processing эффектов.
    Неделя 6: Работа с шейдерами в Unity. Изучение Shader Graph и написание кастомных шейдеров с использованием HLSL.
    Неделя 7: Разработка собственного рендерера - планирование, определение ключевых компонентов и функций с дальнейшей их реализацией. Работа над освещением, материалами и камерой.
    Неделя 8: Завершение проекта и оптимизация. Добавление продвинутых эффектов (тени, отражения, post-processing). Оптимизация проекта. Профилирование, устранение узких мест производительности, тестирование на различных устройствах.

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

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    Если вы не видите шейдер в папке Assets, то забейте. Гораздо проще просто включить Shader Stripping в настройках сборки. На основе используемых материалов, он добавит в сборку только используемые шейдеры.
    Ответ написан
    Комментировать
  • Как реализовать трансформацию прицела в Unity?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    Вы можете вручную модифицировать текстуру. Зная X/Y пикселя, вы можете вызвать SetPixel (https://docs.unity3d.com/ScriptReference/Texture2D...) и указать ему нужный цвет. Делая это цикле в корутине, вы можете сделать эффект плавным.
    Ответ написан
    Комментировать
  • Как реализовать автоматическую самонаводящуюся стрельбу в unity 3d?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    Вам нужна точка выстрела и позиция цели. Далее вам нужно получить направление к цели, а значит из координат игрока вычтите координаты прицела. Чтобы скорость была удобной и контролируемой, нормализуйте получившийся вектор, после чего умножьте на скорость. Если вы хотите стрелять по параболе вверх, то придётся высчитать {y} угол выстрела. Дальше вам осталось добавить снаряду Rigidbody и либо тащить его в FixedUpdate с помощью velocity, либо дать пинок через AddForce.

    Если на снаряде будет коллайдер, то вы сможете регистрировать попадания коллайдерами.
    Ответ написан
    Комментировать
  • Куда щас вообще стоит влезать: Unity3D или Unreal Engine?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    Если вы начинаете - берите что угодно. Ни ценообразование, ни детали оптимизации вас не касаются, пока вы только начинаете. Навыки и понимание процессов, полученные в одной программе, по большей части, актуальны и для другой. Unity проще для старта, но это не значит что он проще, чем UE в принципе.
    Ответ написан
    Комментировать
  • Как создать текстуру и поместить ее на объект в unity2d?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    Текстура представлена классом Texture2D. Для начала вы создаёте экземпляр класса, указывая его целочисленные высоту и ширину. Затем используйте метод SetPixel(x, y, color), чтобы перекрасить пиксель в нужный цвет. В конце вызываете Apply, чтобы применить. Например, вот так можно создать белый круг:

    using UnityEngine;
    
    public class DynamicCircle : MonoBehaviour {
    
    	public SpriteRenderer spriteRenderer;
    	[Min(1)] public int textureWidth = 100;
    	[Min(1)] public int textureHeight = 100;
    	public Color defaultColor = Color.white;
    
    	private Texture2D _circleTexture;
    
    	private void Start() {
    		CreateCircleTexture();
    	}
    
    	private void CreateCircleTexture() {
    		_circleTexture = new Texture2D(textureWidth, textureHeight);
    
    		var center = new Vector2(textureWidth / 2, textureHeight / 2);
    		var radius = textureWidth / 2;
    
    		for (int y = 0; y < _circleTexture.height; y++) {
    			for (int x = 0; x < _circleTexture.width; x++) {
    				float distanceToCenter = Vector2.Distance(new Vector2(x, y), center);
    
    				if (distanceToCenter <= radius) {
    					_circleTexture.SetPixel(x, y, defaultColor);
    				} else {
    					_circleTexture.SetPixel(x, y, Color.clear);
    				}
    			}
    		}
    
    		_circleTexture.Apply();
    
    		spriteRenderer.sprite = Sprite.Create(_circleTexture, new Rect(0.0f, 0.0f, textureWidth, textureHeight), new Vector2(0.5f, 0.5f), 100.0f);
    	}
    }
    Ответ написан
    Комментировать
  • Что добавить в код, чтобы музыка воспроизводилась согласно требованиям?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    Вы можете использовать таймер, который будет отсчитывать время с последнего "быстрого" клика. Если это время превышает определенный порог, музыка останавливается. Проверку можно организовать, например, в Update.
    Ответ написан
    1 комментарий
  • Как повернуть спрайт к камере Unity 3D?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    Вам достаточно использовать Transform.LookAt и передать ему Vector3. Чтобы он крутился только по горизонтали, целевой точке нужно указать Y такое же как у объекта, который вы крутите. Если нужен и наклон, тогда можно передать прямо позицию игрока.
    Ответ написан
    Комментировать
  • Как оптимизировать события с большим количеством вещей?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    То, о чём вы говорите - не столько оптимизация игры, сколько рефакторинг проекта. Для начала можете попробовать обобщить логику насколько это возможно, используя ООП. Например, если у вас есть помидор, который можно взять и кнопка, на которую можно нажать, то вам достаточно всего одного скрипта с рейкастом, 'Interactor', который будет по рейкасту искать 'Interactable' цель. Но на самом деле целью будет Tomato или Button, которые наследуют Interactable и его базовые методы, например, Interact(), который будет вообще по-разному реализован, но запускаться будет одинаково. А если вы захотите добавить возможность садиться в автомобиль, то сделаете всё через тот же скрипт.

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

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    Можно экспортировать проект в Android Studio (или XCode, смотря какая у вас целевая платформа) и там запустить на встроенных виртуальных устройствах.

    Главный вопрос в том, есть ли у вас доступ к коду? Если да, не мучайте себя и сделайте более сложное условие. Например, комбинируя вызов Application.isMobilePlatform с директивами. Типа такого:
    public static class PlatformChecker
    {
        public static bool IsMobilePlatform()
        {
            #if UNITY_EDITOR
                return true;
            #else
                return Application.isMobilePlatform;
            #endif
        }
    }
    Ответ написан
    Комментировать
  • Как использовать несколько коллайдеров и Righitbody?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    Задачу можно упростить, сделав коллайдеры в отдельных дочерних объектах. Они отдельно друг от друга будут вас оповещать, а вы уже дальше легко разберётесь что делать, видя откуда пришло сообщение.
    Ответ написан
    Комментировать
  • Что делать, если шейдер деформирует спрайт PNG?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    Убедитесь, что ваш шейдер корректно обрабатывает UV-координаты спрайта. Проверьте, нет ли в вашем шейдере лишних или некорректных трансформаций вершин. Если спрайт использует alpha-канал для прозрачности, убедитесь, что шейдер корректно его интерпретирует и не изменяет значения прозрачности там, где это не требуется. Также проверьте настройки самого спрайта.
    Более конкретный ответ сложно дать не видя кода и скриншотов.
    Ответ написан
    Комментировать
  • Почему вылетает apk файл unity при запуске?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    Установить Android Studio, эмулятор, экспортировать проект Unity как проект Android Studio, запустить его оттуда на в эмуляторе и ловить логи.
    Ответ написан
    Комментировать
  • Как убрать курсор в браузере в unity?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    Вопрос в том, курсор просто не скрывается или он остаётся полнофункциональным?

    Вы можете начать с того, что допишете код сокрытия:
    Cursor.lockState = CursorLockMode.Locked;
    Cursor.visible = false;


    Если же проблема не решилась, то возможно два варианта:
    1. Можно написать javascript класс для нативного управления курсором и работать через него
    2. Также можно в самой игре добавить флаги типа "IsCursorLocked", через который прокинуть всю логику, которая должна открываться с блоком курсора.
    Ответ написан
  • Ресурсы где можно изучать Unity после среднего уровня?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    Вопрос не имеет информации о вашем текущем уровне, поэтому я дам два ответа.

    Самообучение имеет границы, связанные с человеческим фактором. Если вы хотите серьёзно повысить свои скиллы, задумайтесь о профессиональной занятости. Даже если вам не повезёт попасть на скам галеру, вы как минимум приобретёте новые навыки и полезный опыт. Если вам сейчас невозможно найти работу по одной из сотен возможных причин, то можете начать с геймджемов (game jams). Они хорошо приводят в форму.

    Если вы уже в индустрии, то расширьте свой стек. Возьмите на вооружение инструменты смежных областей, например, можете заняться написанием процедурных шейдеров или разработкой VFX эффектов. Если же хочется именно в сторону кода, то можете попробовать свои силы в создании нативных плагинов для мобилок.
    Ответ написан
    Комментировать
  • Почему объект на сцене пропадает если приблизить?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    Одно из трёх:
    1) Моделька слишком большая, на что намекает установленный скейл. Решить это можно как пофиксив модельку в любом 3д редакторе, так и сделав это в настройках импорта:
    65491de2adfa1104330584.png
    2) У камеры редактора есть фокус и вы периодически можете замечать как он делает некоторые объекты невидимыми. Чтобы это исправить, можете в иерархии сделать даблклик по нужному объекту.
    3) У вас могли сбиться настройки сценической камеры
    65491e86abb25100643962.png
    Ответ написан
    Комментировать
  • Что делать если объект покрывает другой объект. но перемещение в 3D не помогает?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    В 2д лучше не меняйте position Z. Вместо этого используйте приоритет отрисовки. Представьте, что вы стоите в очереди на кассу в магазине. Все клиенты по очереди обсуживаются в том порядке, в котором пришли - вот тут аналогичная ситуация.
    Вы используете совместно две системы - обычные спрайты (компонент UnityEngine.SpriteRenderer) и картинки интерфейса (компонент UnityEngine.UI.Image).

    В настройках компонент SpriteRenderer вы можете заметить настройки "Sorting Layer" и "Sorting Order".
    Первый обозначает очередь очереди. То есть чем меньше номер очереди, тем раньше она отрисуется. В нашем примере на кассе - это толпа пенсионеров, которых обычно пропускают вперёд по правилам многих магазинов.

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

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    Если речь идёт о выставлении заранее созданных картинок, копайте в сторону декалей. А если речь идёт именно о рисовании, то ваш вопрос слишком общий, но в общем всё сводится к тому, чтобы просчитать рейкастом позицию рисования, высчитать позицию на изображении, которое данный материал показывает и, либо это изображение модифицировать, либо поверх существующего создать прозрачный материал с текстурой, которую вы опять же рисуете. Короче говоря, гуглите текстурную модификацию.

    Ну или не изобретайте велосипед и просто возьмите готовое решение.. например вот такое
    https://assetstore.unity.com/packages/templates/tu...
    Ответ написан
    Комментировать
  • Есть ли у геймобжетков в юнити идинтификатор, который не меняется при перезапуске игры?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    Вы можете создать собственный маленький класс, который будет хранить уникальный сгенеренный UUID идентификатор, по которому вы и будете объекты отличать.
    Ответ написан