Ответы пользователя по тегу Unity
  • Почему не работает триггер в юнити 3д?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    Повесьте на движущийся объект Rigidbody и тогда всё будет работать.
    Ответ написан
  • Почему значение статической переменной не меняется?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    Если источник имеет коллайдер, результатом вы всегда будете получать источник. Только поэтому у вас не выпала NullPointerException. Метод Physics2D.Raycast всегда возвращает объект, но его поле collider может быть пустым (null), если луч ушёл в пустоту, тогда попытка вызвать метод collider.CompareTag вообще провалится.
    Если не хотите сильно заморачиваться, просто создайте слой, например, Player и повесьте его на игрока. Таким образом вы заодно избавитесь от необходимости проверять тег.
    https://docs.unity3d.com/ScriptReference/Physics2D...
    Как вы можете увидеть по ссылке выше, метод имеет перегрузку:
    // поле класса
    public LayerMask playerLayer;
    // метод из примера
    RaycastHit2D hitInfo = Physics2D.Raycast(ray2D.origin, ray2D.direction, 10, playerLayer);
    Ответ написан
    Комментировать
  • Почему нельзя выбрать continuous dynamic в collision detection?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    Потому что алгоритм Continuous Dynamic это изменённый Continuous с учётом трёхмерности объекта, а вы смотрите двухмерный компонент.
    Ответ написан
  • Почему игрок ходит по стенам?

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

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    1. Убираете Capsule Collider 2D, вешаете Box Collider 2D
    2. Делаете коллайдеру скругление (да, там есть такая опция), чисто чтобы за углы не цеплялся
    3. Делаете не одну большую точку, а маленьких штуки две (по краям) или три (одна в центре, если у вас есть узкие платформы)
    4. Ищете землю условием ИЛИ. Profit

    Важно, чтобы края поиска земли не доставали до левого и правого краёв коллайдера и при этом был включен режим Rigidbody2D collision detection = continuous. Тогда всё будет работать отлично.
    Ответ написан
    Комментировать
  • Как установить префаб по сетке?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    1. Зная размерность сетки, можно руками поправить координаты в Transform
    2. Можно перетащить префаб во вкладку Hierarchy, а затем перетащить на нужное место через Move Tool с зажатой Ctrl
    3. Можно поместить сразу как надо, и, держа открытой вкладку "Edit >> Grid and Snap Settings...", нажать кнопку "All Axes", и если оно неправильно округлило, то используя способ 2, дотянуть немного.
    4. Можно самому написать скрипт, типа такого:

    скрипт

    using UnityEngine;
    using UnityEditor;
    
    public class SnapPrefab : MonoBehaviour {
        public float cellSize = 0.5f;
    
    #if UNITY_EDITOR
        private void OnValidate() {
            Snap();
        }
    #endif
    
        public void Snap() {
            Vector3 position = transform.position;
            position.x = Mathf.Round(position.x / cellSize) * cellSize;
            position.y = Mathf.Round(position.y / cellSize) * cellSize;
            position.z = Mathf.Round(position.z / cellSize) * cellSize;
            transform.position = position;
        }
    }
    
    #if UNITY_EDITOR
    
    [CustomEditor(typeof(SnapPrefab))]
    public class SnapPrefabEditor : Editor {
        public override void OnInspectorGUI() {
            base.OnInspectorGUI();
    
            if (GUILayout.Button("Snap")) {
                SnapPrefab script = (SnapPrefab) target;
                script.Snap();
            }
        }
    }
    
    #endif

    Ответ написан
    Комментировать
  • Как отключить использование игрой webgl 2.0 в браузере?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    Никто не запрещает вам установить версию 2021 и делать там, пишут что в 2022 тоже можно сделать (2022 не проверял). А вот 2023 её просто нет. Пруф
    https://forum.unity.com/threads/webgl-1-deprecatio...
    Ответ написан
    Комментировать
  • Как достать код скрипта из собранного apk файла (il2cpp)?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    При сборке il2cpp точный исходный вид обратно восстановить уже 100% не получится, как минимум потому что теряются исходные наименования (да, я в курсе про global-metadata.dat и дампы ошибок, но их может не быть, а если и есть - это гемор для избранных). Да и задачка там сводится, по сути, к обратному преобразованию из низкоуровневого кода.

    Мне думается, что проще заново написать.. но если вам не влом, можете полазить по гитхабу, там китайцы несколько проектов ведут. Типа такого (не проверял) - https://github.com/Perfare/Il2CppDumper
    Ответ написан
    Комментировать
  • Как можно проверить какой скрипт создает объект?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    Если у вас нормальная IDE, можете запустить поиск по всем файлам метода Instantiate. А если не влом руками поковыряться, можете выключить все объекты сцены и понемногу их включать перед каждым перезапуском, проверяя, не прошёл ли спавн.
    Ответ написан
    3 комментария
  • При создании нового проекта в Unity вылазит Enter Safe Mode, что делать?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    Сложно сказать, какая тут конкретно проблема. Если у вас нет специфических запросов к Unity, требуюших новейшую версию, то можете просто удалить эту и установить последнюю 2020.* Несмотря на кажущуюся старость, она очень норм.

    Если хочется пободаться с ошибками, то тут может быть много вариантов. Сперва на ум приходит возможность проблем с установкой:
    1) Было мало памяти на диске и не всё установилось;
    2) Некоторые целевые папки были защищены от записи правами учётных записей и туда тоже ничего не установилось;
    3) В системе не найдена или недоступна требуемая DLL;
    4) Антивирус вмешался в процесс установки редактора или вмешивается в процессе работы.
    Но такие ошибки всегда показывают предупреждения и вы бы их не пропустили. Но я допускаю вероятность, что могут быть случаи и без видимых ошибок, поэтому лучше всё проверьте.

    Думая о запросе входа в безопасный режим, на ум приходит невозможность юнити скомпилировать пустой проект, что может быть вызвано:
    5) Недопустимыми символами в пути к проекту;
    6) Нехваткой оперативной памяти;
    7) Ошибкой настройки самого компилятора (например, неверный путь в переменных среды).
    Опять же, всё руками проверить.

    Не нулевая вероятность и проблем с самими пакетами, например:
    8) Пакеты установились с ошибками или имеют ошибки в процессе работы.
    Тут может помочь очистка кеша/реимпорт пакетов.

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

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    Способов много. Вот два неплохих - через Invoke и корутины соответсвенно. Плюсы и минусы обоих лучше погуглите, но для вашего запроса в данном случае всё равно какой брать:

    Invoke:
    using UnityEngine;
    
    public class TimerInvokeDemo : MonoBehaviour {
    
    	private void Start() {
    		Debug.Log("Заводим будильник...");
    		Invoke("Example", 5);
    	}
    
    	private void Example() {
    		Debug.Log("Пора на завод.");
    	}
    }


    Корутина:
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class TimerCoroutineDemo : MonoBehaviour {
    
    	private void Start() {
    		StartCoroutine(Example());
    	}
    
    	private IEnumerator Example() {
    		Debug.Log("Заводим будильник...");
    		yield return new WaitForSeconds(5);
    		Debug.Log("Пора на завод.");
    	}
    }
    Ответ написан
    1 комментарий
  • Как исправить ошибку с текстом в юнити3д?

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

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    Тот скайбокс, что вы поставили во вкладке Lightning, это стандартный общий. Переопределить настройки можно компонентой Skybox для каждой сцены, в которой он будет отдельно. Добавьте на сцену и перетащите туда нужный вам материал неба.
    Ответ написан
  • Хочу сделать типо босс файта, чтобы анимации которые я добавлю в список были рандомными, но у меня куча ошибок, что делать?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    1) Основа вашей идеи - это компонент Animator, на который у вас нет ссылки.
    2) Метод SetBool() имеет два аргумента: ключ и значение вида true или false.
    3) В блоках вида
    if (animText[1] == 1)
    Вы сравниваете элемент списка под номером 1, то есть строку, с числом. Строка это текст, не число.
    4) Ниже вы прописали корутину, которую никто не запускает
    5) Корутина не имеет паузы
    yield return new WaitForSeconds(нужное_время);
    6) В строке
    animText = Random.Range (1f,4f);
    Вы пробуете вставить в ссылку типа списка строк нецелое число.
    7) Допустим, у вас всё бы работало, но SetBool это такой переключатель, который обратно сам не возвращается, он остаётся в состоянии, в которое вы его поставили.

    Критикуя-предлагай, поэтому вот что я скажу.

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

    Как это будет выглядеть:
    using UnityEngine;
    
    public class BossAnimator : MonoBehaviour {
    
    	// Ссылка на аниматор босса
    	[SerializeField] Animator anim;
    
    	// перечень триггеров анимации
    	// убедитесь, что там нет null элементов
    	[SerializeField] string[] triggers;
    
    	// Метод, который начнёт весь движ
    	// Как и где его вызывать - решайте сами по ситуации
    	public void StartFight() {
    		OnAnimationEnded();
    	}
    
    	// Данный метод нужно привязать как событие
    	// к концу каждой анимации
    	public void OnAnimationEnded() {
    		// Выбираем случайный номер из списка - наш следующий триггер
    		int nextTriggerIndex = Random.Range(0, triggers.Length);
    		// Применяем
    		anim.SetTrigger(triggers[nextTriggerIndex]);
    	}
    }

    Разумеется, скрипт сырой и можно его доработать соответсвенно специфик игры, о которых я не знаю, но в целом он универсален, так как вы в инспекторе босса сами можете назначить перечень любых триггеров анимации в любом количестве.
    Ответ написан
    5 комментариев
  • Будет ли этот код работать некорректно при разной частоте обновления экрана?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    Заметный эффект будет при переворачивании огромных изображений. Проблемой в этом коде является отслеживание ввода в FixedUpdate. У вас поля ввода (horizontalInput и verticalInput) и так уже в контексте класса, просто перенесите считывание внутрь Update.

    Если вас волнуют микрооптимизации, то рекомендую для начала узнать, что в конструкции if-else может использоваться блок else if
    Ответ написан
    1 комментарий
  • Как исправить рендер камеры при её включении?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    Уверен на 90%, что дело в неправильной загрузке шейдеров. Скорее всего у вас они грузятся на сразу, а по мере необходимости. Иногда это норм, но обычно лучше сразу настроить.

    Посетите меню:
    Edit / Project Settings / Graphics
    Там самом низу есть "Preloaded Shaders", добавьте туда нужные.

    Ну и на добавку в меню
    Edit / Project Settings / Editor
    Проверьте, стоит ли галочка "Asynchronous Shader Compilation" (внизу раздел Shader Compilation).
    Ответ написан
    Комментировать
  • Почему камера после старта поварачивается на 180 градусов?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    Скорее всего, проблема в коде поворота камеры. Вангую у вас что-то такое (код ниже), а ваша камера лежит внутри персонажа
    if (xInput > 0)
    	transform.localEulerAngles = new Vector3(0, 0, 0);
    else
    	transform.localEulerAngles = new Vector3(0, 180, 0);

    Если я угадал, то просто измените else на else-if
    if (xInput > 0)
    	transform.localEulerAngles = new Vector3(0, 0, 0);
    else if (xInput < 0)
    	transform.localEulerAngles = new Vector3(0, 180, 0);
    Ответ написан
  • Unity 2D, Как убрать скольжение по наклонным поверхностям?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    1. Узнаёте что персонаж на земле, например через Physics2D.OverlapCircle
    2. Получаете нормаль поверхости под ногами персонажа, например через Physics2D.Raycast
    3. Вычисляете угол поверхности, через Vector2.Angle
    4. Угол меньше максимального (поле класса, например 70 градусов)
    5а. Да: двигаемся как обычно
    5б. Нет: Можно поменять физический материал (свойство friction), или, например, обнулить x часть вектора rigidbody2D.velocity
    Ответ написан
    2 комментария
  • Как в unity 3d (C#) сделать открытие панели при нажатии на кнопку клавиатуры?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    Что-то такое:
    using UnityEngine;
    
    public class ShowPanelDemo : MonoBehaviour {
    
    	// флаг состояния
    	bool isOpened;
    	// ссылка на панель
    	public GameObject panel;
    
    	void Update() {
    		if (Input.GetKeyDown(KeyCode.Escape)) {
    			// меняем состояние
    			isOpened = !isOpened;
    			// присваиваем
    			panel.SetActive(isOpened);
    		}
    	}
    }
    Ответ написан
    6 комментариев
  • Как запустить аудио и дать ему айди, чтобы по нему потом остановить его?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    В AudioSource есть несколько замечательных возможностей.
    // Запускаете
    myAudio.Start();
    
    // Проверяете статус
    if (myAudio.isPlaying) {
    	// Можно и остановить
    	myAudio.Stop();
    }


    Если вы хотите сделать как в аниматоре, просто передавая ключ и оно само влияет на всё, что надо, то можете создать нечто подобное для звука (структуру, описывающую состояние контроллера и класс со списком экземпляров этих структур и переходов между ними).
    Если же хочется что-то "из коробки", можете попробовать объединить звуки в группы Audio Mixer и переходить между состояниями, используя Audio Mixer Snapshot.
    Возможно вам также подойдёт это дополнение https://assetstore.unity.com/packages/tools/audio/...
    Ответ написан
    Комментировать