C# . — Проблема с работой в Unity3d метода OnTriggerEnter


Проблемы с OnTriggerStay2D Unity

Осваиваю Unity и столкнулся с недопониманием логики обработки событий.
Есть 2D объекты, один из них (игрок) двигается по оси х. Другие объекты (префабы) находятся на одном уровне по оси у с ним и недвижимы.
У префабов выставлен istrigger.
Мне нужно чтобы при входе игрока в префаб этот самый префаб запоминался и подвергался обработке другими методами.
Все работает ровно до тех пор пока не возникает ситуация, когда у нас два префаба накладываются при создании друг на друга.
Таким образом если ставить дебаглоги, то при входе в префаб срабатывает OnTriggerEnter столько раз сколько объектов наложено. Когда дестроим один из префабов то срабатывает OnTriggerExit. Но со вторым префабом после этого я работать не могу так как переменная объекта инициализируется в OnTriggerEnter.
Думал решить вопрос добавлением OnTriggerStay, но по какой-то причине он срабатывает только при движении игрока внутри префаба, а не при нахождении в нем.
Вопросы:
1. Есть ли незамороченный способ создавать префабы которые друг друга не касаются?
2. Что не так с OnTriggerStay
3. Если есть советы как правильно строить логику скрипта с моей задачей, я лучше перепишу все нафиг.

если проблема в том, что ящики триггерят друг друга: как на счёт проверить объект столкновения? если столкнулся с игроком — обрабатывай, если с другим ящиком, то забей.

если проблема в том, что при 10 ящиках друг в друге персонаж сталкивается сразу со всеми, то так-то оно так и должно работать — 2д ж. если хочешь, что б тригерились они как-нибудь хитро, то можешь попробовать поиграться с активацией/деактивацией коллайдеров.

онтриггерстей вроде так и задуман — движение без выхода. можешь онентер повесить флаг, онэкзит снимать его. обработку засунуть в апдейт.

JMcGill
> 2. Что не так с OnTriggerStay
С ним всё так, как надо. Он реагирует только на движение внутри.

JMcGill
> 1. Есть ли незамороченный способ создавать префабы которые друг друга не
> касаются?
> 3. Если есть советы как правильно строить логику скрипта с моей задачей, я
> лучше перепишу все нафиг.

Создайте слой, назначьте этот слой префабу. В настройках физики укажите , что этот слой не взаимодействует между собой (просто снимите галочку в чекбоксе на месте пересечения этого слоя с самим собой ).

Используйте OnTriggerEnter2D для манипуляций.

OnTriggerEnter не работает в Unity3D

Я пытаюсь обнаружить мяч, входящий в кольцо в баскетбольной игре. Я использую следующий скрипт на ринге

Кольцо имеет коробчатый коллайдер, установленный как триггер для обнаружения метода OnTriggerEnter. Он также имеет сетчатый коллайдер, чтобы обнаружить, когда мяч коснется его броска OnCollisionEnter. Моя проблема в том, что OnTriggerEnter не работает (используется точка останова внутри и не останавливается). На самом деле OnCollisionEnter отлично работает. Мой шар имеет сферический коллайдер, и оба используют жесткое тело. Есть идеи?

Изменение: я прикрепляю скриншоты с моего шара и кольца

это никогда не сработает. OnTriggerEnter нуждается в коллайдере, а не в конфликте. Попробуй это:

Вы должны добавить кинематическую жесткость в корзину. Статический триггер может обнаруживать жесткие тела, но он не обнаруживает движущиеся коллайдеры, даже если триггер имеет твердое тело.

Методы оптимизации при разработке в Unity 3D


Евгений Семушин, руководитель компании по разработке программного обеспечения EcmaSoft

Производительность имеет решающее значение для мобильных игр. Особенно если игра сочетает в себе физику, AI (искусственный интеллект) и полностью анимированных персонажей 3D-мира. Некоторое время назад мы сделали игру под названием «Spearfishing 3D — подводная охота» для iOS. За первые полгода после релиза игра была скачана около двух миллионов раз и попала в топ-10 в категории «Игры» в разных странах мира. Одна из основных проблем, которую нам понадобилось решить, — обеспечение работы игры с 60 fps. Это стало проще с выпуском iPad и iPhone 4, но мы по-прежнему должны поддерживать как минимум 30 fps для iPhone 3G/3GS. В этой статье я опишу подходы, которые мы использовали для оптимизации игр на основе Unity.

Использование Performance Profiler

Первое место, куда нужно смотреть, когда хочется улучшить производительность — это Unity Profiler. Эта функциональность доступна в Unity Pro и позволяет анализировать проблемные места. Профайлер — бесценный инструмент. С его помощью можно определить, где возникают проблемы с частотой кадров. Для его использования запустите игру на мобильном устройстве и профайлер на PC. Когда вы запускаете игру, профайлер начинает загружать данные о производительности.

Чтобы использовать профайлер на мобильных устройствах, сделайте билд в Developer mode. Из документации Unity:

Чтобы иметь возможность подключиться к плееру, плеер должен быть запущен с помощью опции Development Build, которая находится в диалоговом окне Build Settings.

Здесь также можно отметить флажок для автоматического соединения редактора и плеера. Профайлер показывает график использования CPU во время игры. Просто подключите мобильное устройство к машине для разработки и проходите игру. Профайлер покажет все проблемы в режиме реального времени. Он разбивает активности на Rendering, Scripts, Physics, GarbageCollector, VSync и другие. В мобильных играх часто бывают проблемы с рендерингом. Иногда скачки производительности возникают в скриптах при загрузке сцены, но в этом нет ничего необычного. Некоторые скачки связаны с физикой.

Цукерберг рекомендует:  Как отредактировать фид RSS WordPress

Физика и искусственный интеллект

Я опишу несколько основных идей оптимизации кода физики и перейду к графике.

  • Старайтесь, чтобы как можно меньше объектов двигалось одновременно. «Спящие» объекты намного дешевле.
  • То же самое касается искусственного интеллекта. Если объект находится далеко от главного героя или его не видно, не запускайте скрипты искусственного интеллекта.
  • Рейкасты очень дорогие. Не делайте рейкаст на каждый фрейм — попробуйте кэшировать результаты и пропустить некоторые фреймы.
  • Старайтесь избегать сложных меш коллайдеров.
  • Проверьте функции Update() . Они запускают каждый кадр и, следовательно, дорогие. Вместо этого используйте Coroutines .

Static batching

Это фича Unity, которая экономит много циклов CPU. Каждый раз, когда объект рендерится, происходит Draw Call — команда для CPU или GPU о том, что объект должен отрендериться. Unity запускает несколько вызовов отрисовки и накладывает их друг на друга, это и формирует сцену. Однако каждый Draw Call требует ресурсов CPU, поэтому мы хотим минимизировать их количество.

Тут и стоит использовать Batching. Он нужен для того, чтобы не делать лишние Draw Calls. Batching бывает двух видов: статический и динамический. Статический дает лучшую производительность, поэтому мы всегда стараемся использовать его.

Unity3d OnTriggerEnter2D не работает


В настоящее время я пытаюсь сделать Unity3d (или 2D в этом случае) демо-версию платформы Platformer. Во время работы над демо я столкнулся с некоторой проблемой, потому что хочу, чтобы объект моего игрока мог подниматься по склонам, но если я применил гравитацию, когда объект Player находится на земле, он не сможет подняться на склоны, даже если он может спуститься вниз. Мое решение состояло в том, чтобы отключить гравитацию, в то время как объект PLayer касался земли и снова включил его, когда это не было. Я сделал это, используя функции void OnCollisionEnter2D(Collision2D collision) чтобы отключить гравитацию, и void OnCollisionExit2D(Collision2D collision) чтобы включить его.

Это не сработало, поэтому я немного поиграл с ним и подумал о том, чтобы дать основание, а объект Player «Trigger Boxes» — невидимые дочерние объекты Cube, у которых есть коллайдер, отмеченный как триггер. Поэтому теперь я использую функцию void OnTriggerEnter2D(Collider2D collision) чтобы отключить гравитацию, и void OnTriggerExit2D(Collider2D collision) чтобы включить ее. Но это тоже не работает. Ниже мой код, сначала главный скрипт объекта Player, а затем объект Player «TriggerBox», после чего будут отображаться изображения, показывающие, как мои объекты настраиваются в Unity.

Результат: класс Player в настоящее время не сталкивается с землей и падает до бесконечности.

Что я хочу: Игрок сталкивается с землей, а игрок TriggerBox сталкивается с землей «TriggerBox» и отключает гравитацию игрока.

Примечания: Я попытался дать игрокам, и земля RigidBody2Ds. Игрок сталкивается с землей и нервничает и не вызывает гравитационного выключения, и земля падает на контакт с игроком, когда земля имеет RigidBody2D. Неизвестно, что срабатывает, поскольку земля падает прямо под игроком.

-As для изображений для моего setup-

Настройка проигрывателя: Настройка проигрывателя TriggerBox: Настройка заземления: Настройка наземной настройки TriggerBox:

Благодарим вас за то, что вы читаете это, и, надеюсь, за вашу помощь.

Unity3D: Несовместимость переменных скриптов с использованием OnTriggerEnter2D

0 Alex [2020-01-26 12:54:00]

У меня есть объект с компонентом скрипта.

Теперь, если я ищу объект и проверяю переменные скрипта

он отлично работает и GetReference() возвращает переменную, которую я сохранил.

Но теперь, если я использую его в OnTriggerEnter2D

GetReference() возвращает null (или другую переменную, которую я использовал во время Start() класса TeleportReference). Все остальные результаты тестирования остаются неизменными.


Может ли кто-нибудь намекнуть, почему это может произойти? Означает ли это, что GetComponent создал второй экземпляр TeleportReference во втором случае?

c# unity3d instances

2 ответа

0 Решение Alex [2020-01-27 03:56:00]

Нашел вопрос. Он был в порядке назначения переменных. То есть — изменения были сделаны заодно до вызова функции Start(). Таким образом, в какой-то момент кода сохраненное значение было переопределено до нуля.

Это прекрасно работает:

Спасибо всем за комментарии, которые действительно помогли мне в отладке.

GetComponent не создавал новый экземпляр TeleportReference во втором случае. У меня есть аналогичный код в одном из моих проектов, и у меня не было никаких проблем. Поэтому в этом случае я бы посмотрел, есть ли проблема где-то в другом месте. Вы уверены, что это тот же объект «Вода»? У вас есть несколько объектов с тегом «Вода»? Вы сталкиваетесь, прежде чем назначить ссылку? Там может быть множество вещей. Просто проверьте, чтобы сузить его.

Справочник: C#

Общее

Переменная — поименованная область памяти, адрес которой можно использовать для осуществления доступа к данным и изменять значение в ходе выполнения программы. Переменные хранят в себе информацию разного типа, эти данные называют значением переменной. Для каждого типа данных есть свой тип переменной. Например:

  1. Целочисленные: int (от –2 147 483 648 до 2 147 483 647), long (от –9 223 372 036 854 775 808 до 9 223 372 036 854 775 807).
  2. Символы и строки: char (элемент в кодировке UTF-16), string (последовательность элементов в кодировке UTF-16).
  3. С плавающей запятой (дробные): float (от 1,5 × 10–45 до 3,4 × 1038, с точностью до 7 цифр), double (от 5,0 × 10–324 до 1,7 × 10308, с точностью до 15 цифр).
  4. Логические: bool (значение true или false).
Цукерберг рекомендует:  C# юнити - построить окна редактора согласно схеме Unity

Инициализация переменной

Все переменные в C# должны быть объявлены (инициализированы) до их применения. Например:


Задать значение переменной можно, в частности, с помощью оператора присваивания — знак «=». Кроме того, при объявлении переменной можно сразу задать ее значение. Например:

Переменные численных типов можно складывать, вычитать, умножать и делить:

+ — операция сложения;

— операция вычитания;

* — операция умножения;

/ — операция деления.

Довольно часто при создании скриптов возникает необходимость сделать так, чтобы выполнение или невыполнение каких-то действий зависело от выполнения или невыполнения некоторого условия. Для решения подобных задач используется условный оператор if:

Чтобы сказать программе, что делать, если условие не выполняется, используйте блок else:

Бывает, что нужно проверить несколько вариантов условия. Для этого используется блок else if:

Для сравнения значений существуют следующие операторы:

> больше

>= больше или равно.

== равно.

!= не равно.

Функция — участок кода с собственными именем, который принимает на вход какие-то данные, что-то с ними делает и возвращает обратно результат (хотя возможен вариант когда функция ничего не принимает и не возвращает,а просто что-то делает).

Посмотри на пример:


У нас есть разные люди с данными в виде отдельных фамилии, имени, отчества, которые надо объединить и вывести на экран. Обрати внимание, что два раза повторяется один и тот же участок кода — склеивание трех строк в одну. Функция в нашем случае будет выглядеть вот так:

Слова public static отложим пока в сторону, string означает, что функция вернет назад строку, CreateFio(string surname, string name, string otchestvo) — название функции и описание того, что она принимает на вход три строки.

Теперь та же программа будет выглядеть таким образом:

Unity Engine

Эта функция клонирует объект и размещает клон в нужно тебе месте.

Ты можешь клонировать GameObject или компонент. Если ты клонируешь компонент, то GameObject, к которому он присоединен, также будет клонирован. В обоих случаях все дочерние объекты также будут клонированы. Все свойства при этом будут соответствовать оригинальному объекту.

Ты можешь клонировать объект, который размещен на сцене или prefab.

OnTriggerEnter(Collider) — это функция событий.

OnTriggerEnter вызывается, когда Collider other входит в триггер. Код, который будет размещен в этой функции, будет выполнен один раз.

OnTriggerExit(Collider) — это функция событий.

OnTriggerEnter вызывается, когда Collider other выходит из триггер. Код, который будет размещен в этой функции, будет выполнен один раз.

OnTriggerStay(Collider) — это функция событий.

OnTriggerStay вызывается почти каждый кадр, пока Collider other находится в триггере. Код, который будет размещен в этой функции, будет выполнятся до тех пор, пока Collider other не выйдет за пределы триггера.

Start — это функция событий.

Функция Start вызывается до обновления первого кадра(first frame) только если скрипт включен.


Для объектов добавленных на сцену, функция Start будет вызываться во всех скриптах до функции Update. Естественно, это не может быть обеспечено при создании объекта непосредственно во время игры.

Каждый объект в сцене имеет Transform. Компонент Transform содержит в себе следующие свойства: позиция (position), поворот (rotation) и масштаб объекта (scale).

Значения положения, вращения и масштаба Transform’а измеряются относительно его родителя. Если у Transform’а нет родителя, тогда все эти свойства измеряются в мировом пространстве.

Игра — это что-то вроде анимации, в которой кадры генерируются на ходу. Ключевой концепт в программировании игр заключается в изменении позиции, состояния и поведения объектов в игре прямо перед отрисовкой кадра. Такой код в Unity обычно размещают в функции Update. Update вызывается перед отрисовкой кадра и перед расчётом анимаций.

Этот справочник постоянно дополняется. Если у тебя есть, что добавить, тебе хочется что-то убрать или изменить, а может просто сказать «спасибо» — пиши Администратору сайта.

C# . — Проблема с работой в Unity3d метода OnTriggerEnter

Ситуация следующая, мой персонаж определяет то, что он находится на земле средствами onTriggerStay и onTriggerEnter
Оба этих события после обновления версии до 5.2 перестали отрабатывать.

Как результат персонаж всё время думает, что он падает.

добавить вывод в консоль сообщение о столкновении, и насильно сталкивал его и террейном и с другими объектами, консоль пустая.
То ли это просто баг, то ли они поменяли принцип работы этих событий, вот хотелось бы узнать, сталкивался ли ещё кто-нибудь с этой проблемой? И как её решить, если она всё таки есть.

Сообщение Доброго всем времени суток!

Ситуация следующая, мой персонаж определяет то, что он находится на земле средствами onTriggerStay и onTriggerEnter
Оба этих события после обновления версии до 5.2 перестали отрабатывать.

Как результат персонаж всё время думает, что он падает.

добавить вывод в консоль сообщение о столкновении, и насильно сталкивал его и террейном и с другими объектами, консоль пустая.
То ли это просто баг, то ли они поменяли принцип работы этих событий, вот хотелось бы узнать, сталкивался ли ещё кто-нибудь с этой проблемой? И как её решить, если она всё таки есть. Автор — NapalmRain
Дата добавления — 11 Сен 2015 в 08:22

Цукерберг рекомендует:  Идея семантические анимации

Unity3D C #: OnTriggerEnter, устанавливающий только один тег?

Сегодня я создавал простую сцену в Unity3D, где игрок мог бы выбрать свой цвет, столкнувшись со стеной, который поменял бы тег игрока на «RedPlayer», «BluePlayer» и т. Д .; И распечатайте в журнале отладки надпись «Он красный мальчик!» Или что-то еще, выбранное игроком. Однако все работало нормально, пока я не добавил последнюю стену в (WhitePlayer), и каждая стена не изменила тег игрока на WhitePlayer, однако он по-прежнему печатает цвет стены, с которой они сталкиваются.


Я включил код здесь, надеясь, что кто-то может понять это. Если бы я мог получить объяснение того, как это исправить, это было бы здорово.

3 ответа

Ваш код был уже плох, прежде чем вы добавили WhiteCollision тега WhiteCollision . Это типичная ошибка новых программистов.

Без открывающих и закрывающих фигурных скобок после каждого оператора Debug.Log будет запускаться, только если оператор if равен true . Другой код в Debug.Log будет выполняться независимо от того, является ли оператор if поверх него истинным или нет.

Вы должны поместить код оператора if который будет выполняться, если что-то true в фигурные скобки <> если вы хотите, чтобы выполнялось несколько строк кода.

Сделайте это для каждого оператора if в вашем коде.

Чтобы улучшить свой код, используйте if (other.gameObject.CompareTag(«RedCollision»)) для сравнения tags .

Проблема в том, что у вас нет фигурных скобок ( <> ) для ваших if . Последняя строка кода, которая выполняется в функции gameObject.tag = «WhitePlayer»; — gameObject.tag = «WhitePlayer»;

Каким бы невероятно чистым вы ни были, вы не можете написать две строки кода в «коротком выражении», if

Заметьте, что у вас нет <> заключающих в себе две линии ? Я не могу этого сделать. Сокращенная или короткая выписка только для одной строки и одной строки. Быть фантазией в большинстве случаев хорошо, но невероятно расточительно, если вы получаете ошибку и не заключаете ее в «правильный» оператор if при отладке этих ошибок.

Чтобы ответить на ваш вопрос, измените:

И ВСЕГДА правильно делайте отступы, если вы когда-нибудь возитесь с короткой рукой.

Сделайте тест на это:

Обратите внимание на разницу в одном месте

Благодаря этому типу отступа Python-ian, если ваш X равен двум, в верхнем примере будет записано «1» затем «2» а в нижнем будет «3»


Как остановить движение AI с OnTriggerEnter2D в Unity?

Я создаю базовый сценарий AI для моих врагов в единстве и у меня есть большая часть его работать так , как я хочу его. Путь у меня есть враги создал они содержат 2 коллайдеров, многоугольник коллайдер , который разрушает игрок при прикосновении, и пустой объект игры , что это ребенок врага , который представляет собой круг коллайдер , который действует в качестве триггера. Там в объект игры , который помечен Straight Road и когда круг коллайдер вступает в контакт с ним, он должен запустить функцию с именем , StopMovement(); который задает движение врагов 0. Раньше я , Debug.Log(); чтобы проверить, если коллайдер признает , что это трогательное Straight Road и не , Это мой код ниже. Я надеюсь , что кто — то есть предложение.

Общий сценарий контроллера ниже содержащая SetMovement() функцию.

MonoBehaviour.OnTriggerEnter2D (Collider2D)

Отправляется, когда другой объект входит триггер коллайдер, подключенный к этому объекту (2D физика только).

Ключевое слово здесь входит . Другими словами, триггер, когда что — то идет в области коллайдера, как игрок вступает в область карты, где область является триггером коллайдер. Если вы хотите что — то должно произойти , когда коллайдер сталкивается с дорогой, то есть , когда ваш CircleCollider вступает в контакт с дорогой, то вы хотите коллайдер , чтобы не быть триггером, и вы хотите функциональность быть внутри OnCollisionEnter2D .

OnTriggerEnter с пользовательским вводом в Unity

Я пытаюсь создать простую атаку ближнего боя в Unity, но у меня проблемы с кодом. У меня есть следующее:

Тем не менее, это работает отлично, однако я хочу сделать так, чтобы сообщение всплывало, когда игрок нажимает клавишу. Я попытался добавить следующее к методу OnTriggerEnter:

Проблема в том, что теперь сообщение больше не будет отображаться, даже если я нажимаю клавишу F. Есть ли способ включить этот код для вызова сообщения только тогда, когда игрок нажимает клавишу F и находится в контакте с gameObject?

Ответов: 2

Вам нужно будет сделать GetKeyUp в цикле обновлений и установить флаг boolean, который затем проверяется в OnTriggerEnter.

Или наоборот — в зависимости от ваших требований времени (т. Е. Установите логический флаг в OnTriggerEnter и проверьте его в цикле обновления). [Я, вероятно, сделаю это так, учитывая ваше описание]

Проблема, с которой вы столкнулись, — OnTriggerEnter, будет срабатывать только один раз, и поэтому она не будет проверять клавиатуру на предмет изменения состояния ключа, поэтому вам нужно проверить цикл обновления.

Вы можете использовать OnTrigggerStay вместо onTriggerEnter, и вы можете избежать специального bool в событии Update.

OnTriggerStay называется почти всеми кадрами для каждого другого коллайдера, который касается триггера

Понравилась статья? Поделиться с друзьями:
Все языки программирования для начинающих