Unity oncollisionstay не работает

Unity oncollisionstay не работает

alex_ey 07 янв 2012, 09:12

Создал в редакторе два объекта, повешал на оба объекта Sphere Collider, на одном из объекте добавил скрипт из примера: http://unity3d.com/support/documentatio . =Collision

при столкновении этих объектов ничего не происходит. т.е. входа в функцию OnCollisionEnter вообще не происходит.

Re: OnCollisionEnter не работает.

Order 07 янв 2012, 10:05

OnCollisionEnter is called when this collider/rigidbody has begun touching another rigidbody/collider.

на одном из объектов должен быть ригид боди

Re: OnCollisionEnter не работает.

alex_ey 07 янв 2012, 10:14

Re: OnCollisionEnter не работает.

trololoid 07 янв 2012, 10:22

Re: OnCollisionEnter не работает.

alex_ey 07 янв 2012, 10:36

Re: OnCollisionEnter не работает.

trololoid 07 янв 2012, 10:45

Re: OnCollisionEnter не работает.

alex_ey 07 янв 2012, 11:00

теперь перемещаю объект таким способом:

function FixedUpdate () <
gameObject.rigidbody.AddForce(Vector3.back * 30);
>

и опять же ничего не работает.

Re: OnCollisionEnter не работает.

trololoid 07 янв 2012, 11:30

Re: OnCollisionEnter не работает.

alex_ey 07 янв 2012, 20:05

Все понятно, все эти заморочки с настройкой колизией были нужны для просчета физики столкновения. Т.е. при столкновении объектов они отскакивают друг от друга.

Мне же совсем не это нужно было. мне нужно тупо знать пересекаются у меня две сферы или нет. Может для этого другая какая-нибудь функция есть? вместо OnCollisionEnter?

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

Re: OnCollisionEnter не работает.

wormik358 07 янв 2012, 22:24

нужно чтоб был включен isTrigger у цели

Re: OnCollisionEnter не работает.

alex_ey 08 янв 2012, 19:27

Re: OnCollisionEnter не работает. [РЕШЕНО]

Order 08 янв 2012, 20:30

Re: OnCollisionEnter не работает. [РЕШЕНО]

Andrew_00001 10 июл 2014, 23:36

А вот и не решено, автору то на его вопрос «Почему OnCollisionEnter не работает?» так и не ответили, а предложили пользоваться другим методом.

У меня только что было подобное, битый час пробился, не реагирует и все тут.
А оказалось: написал OnCollisionEnter с маленькой буквы и Unity восприняла эту функцию, как мою собственную, новую, а не статическую.

Может кому пригодится.

Re: OnCollisionEnter не работает. [РЕШЕНО]

1Nsane 28 сен 2019, 10:41

Re: OnCollisionEnter не работает. [РЕШЕНО]

Saltant 28 сен 2019, 12:17

Кто сейчас на конференции

Сейчас этот форум просматривают: GoGo.Ru [Bot] и гости: 28

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB

Источник

Функции событий столкновений: OnCollisionEnter, OnCollisionEnter2D, OnCollisionStay, OnTriggerEnter

Этот пост содержит в себе ответы на такие частые вопросы, как:

  • Для чего предназначены и как работают функции: OnCollisionEnter, OnTriggerEnter, OnCollisionEnter2D, OnTriggerStay, OnCollisionExit и подобные;
  • Как их правильно вызывать; (спойлер: никак)
  • Как настроить объект для использования этих функций;
  • Почему они не вызываются;
  • Что они принимают и возвращают;
  • Почему функции OnCollisionStay/OnTriggerStay/. перестают работать спустя несколько кадров при том, что изначально работали, а объект даже не передвигался.

1 ответ 1

Список функций:

В первую очередь перечислим все подобные функции. Всего их 12:

События Collider Trigger
Enter OnCollisionEnter(Collision) OnTriggerEnter(Collider)
Stay OnCollisionStay(Collision) OnTriggerStay(Collider)
Exit OnCollisionExit(Collision) OnTriggerExit(Collider)

Те же функции, но для 2D объектов:

События Collider Trigger
Enter OnCollisionEnter2D(Collision) OnTriggerEnter2D(Collider)
Stay OnCollisionStay2D(Collision) OnTriggerStay2D(Collider)
Exit OnCollisionExit2D(Collision) OnTriggerExit2D(Collider)

! Все ссылки рабочие и направляют на страницу своей функции

О функциях OnCollision. и их 2D версиях

Из документации:

  • OnCollisionEnter вызывается, когда этот Collider 1 /Rigidbody начал соприкосновение с другим Rigidbody/Collider.
  • OnCollisionStay вызывается один раз в кадр для каждого Collider/Rigidbody, который касается другого Rigidbody/Collider.
  • OnCollisionExit вызывается, когда Collider/Rigidbody прекращает контакт с другим Rigidbody/Collider.

Все вышеперечисленные тезисы верны в том числе и для 2D версий функций.

Аргумент:
Все они принимают в качестве первого аргумента — Collision (не путать с Collider ). Класс Collision содержит информацию о точках соприкосновения, скорости воздействия и т.д.

Требования:

  • Оба объекта должны иметь на себе компонент Collider.
  • У обоих объектов в компоненте Collider должно быть ОТКЛЮЧЕНО свойство isTrigger .
  • Хотя бы один из двух объектов должен иметь компонент Rigidbody.
  • У объекта(-ов) с компонентом Rigidbody должно быть ОТКЛЮЧЕНО свойство isKinematic .

Важно:

  1. События столкновений отправляются даже на неактивные компоненты.
  2. События столкновений НЕ отправляются на объекты с отключенным или временно неактивным компонентом Rigidbody.

О функциях-триггерах OnTrigger. и их 2D версиях

англ. trigger [ˈtrɪgə] — спусковой крючок, пусковой сигнал, триггер\

Collider с свойством триггера не является телесным и ни с кем не сталкивается (физически).

Триггер используется как зона, которая способна реагировать на события входа/выхода/нахождения в ней чего-либо и запуска неких сценариев.

Из документации:

  • OnTriggerEnter вызывается, когда Collider other входит в триггер.
  • OnTriggerStay вызывается практически 2 каждый кадр для каждого Collider other, которые соприкасаются с триггером.
  • OnTriggerExit вызывается, когда Collider other перестает соприкасаться с триггером.

Все вышеперечисленные тезисы верны в том числе и для 2D версий функций.

Аргумент:
Все они принимают в качестве первого аргумента — Collider (не путать с Collision ), то есть ссылку на компонент объекта, с которым произошло триггерное столкновение.

Требования:

  • Оба объекта должны иметь на себе компонент Collider.
  • РОВНО один объект (НЕ два) должен быть помечен как триггер (то есть свойство isTrigger должно быть равно true) в компоненте Collider.
  • Хотя бы один из двух объектов должен иметь компонент Rigidbody.

Важно:

  1. Функции-триггеры вызываются в FixedUpdate после непосредственного входа в триггер/выхода из триггера и т.д., поэтому объекты, участвующие в столкновении, в момент вызова функции-триггера могут уже находиться не той позиции, где были в момент столкновения.
  2. Функции-триггеры не являются непосредственной частью столкновений, а лишь функцией MonoBehaviour’a.
  3. Функция OnTriggerStay зависит от физического таймера, поэтому нет необходимости вызывать ее каждый кадр — она может вызываться НЕ в каждом кадре.

Помните также о том, что если вы не используете аргументы, указываемые в функциях (Collision other, Collider collider. ), вам следует их опустить: в таком случае ненужные расчеты не будут производиться. Например:

О переводе в «спящее» состояние

Многие могли сталкиваться с такой ситуацией: на объекте висит Collider, Rigidbody, всё настроено как надо, на объект повешен скрипт с функцией OnCollisionStay, OnTriggerStay или их 2D версиями. Однако при нахождении объекта в коллайдере, эти функции вдруг перестают работать! А если в них поместить Debug.Log для дебага, оказывается, что спустя несколько десятков кадров, объект просто перестает выполнять свою функцию, выводы в консоль прекращаются, и объект, который даже не двигался, будто засыпает! Почему такое происходит?

Дело в том, что Rigidbody действительно может засыпать!

Когда Rigidbody двигается медленнее определенной скорости, считается, что он остановился. После этого объект будет переведен в «спящий» режим. Это сделано для оптимизации: ресурсы процессора не будут расходоваться на обновление Rigidbody, пока он не «проснется» (т.е. снова придет в движение)

В некоторых случаях (например, когда передвижение физического объекта производится через т.н. «телепортацию»), объект может не проснуться, хотя должен. В таком случае его можно принудительно разбудить функцией WakeUp.

Сноски:
1 Здесь и далее под компонентом Collider понимается любой тип коллайдера, любой его наследник. То есть вы можете использовать BoxCollider, SphereCollider, CapsuleCollider, любые 2D коллайдеры: BoxCollider2D, CircleCollider2D — или любой другой коллайдер, соответствующий вашим нуждам.

2 OnTriggerStay вызывается практически каждый кадр, потому что она зависит от физического таймера, и нет необходимости вызывать ее каждый кадр.

Источник

Unity oncollisionstay не работает

barskep 20 мар 2016, 10:51

public class Kzird1Script : MonoBehaviour
<
public float delta ;
public Text hpText ;
public int health ;
public int attack ;
private int attackEnemy ;
public Collider2D nearAttack ;
private UnitScript peopleNear ;
private GameObject enemy ;

void Start ( )
<
transform . position = new Vector3 ( 4, — 0.6f, 0 ) ; //начальная координата
>

void Update ( )
<
transform . Translate ( new Vector3 ( delta, 0, 0 ) * Time. deltaTime ) ; //движение объекта по крате
hpText. text = health. ToString ( ) ; //отображение здоровья персонажа в Text UI над ним
if ( health 0 ) // если здоровье объекта меньше ноля или ноль, то
<
attack = 0 ; // атака объекта = 0
Destroy ( gameObject ) ; //уничтожить объект
>

void OnCollisionEnter2D ( Collision2D nearAttack ) //определение соприкосновения
<
delta = 0 ; //переменной движения присваиваем 0, чтобы объект остановился
if ( ( nearAttack. gameObject . tag == «people» ) ) //Если тег встретившегося объекта — people, то
<
enemy = nearAttack. gameObject ; // объекту enemy присваимваем столкнувшийся объект
peopleNear = enemy. GetComponent UnitScript > ( ) ; // экземпляру скрипта UnitScript(он же скрипт для человеческих юнитов) присвоить скрипт объекта enemy
attackEnemy = peopleNear. attack ; //переменной attackEnemy присвоить поле attack объекта peopleNear (то есть мы присвоили значение атаки соприкоснувшегося объекта)
>
>

void OnCollisionStay2D ( Collision2D nearAttack ) //объекты касаются друг друга
<
if ( ( nearAttack. gameObject . tag == «people» ) ) //если соприкоснувшиеся объекты
<
if ( ( health > 0 ) && ( attackEnemy > 0 ) ) // если здоровье персонажа больше 0 и атака соприкоснувшегося объекта больше 0, то
<
health = health — attackEnemy ; // здоровье = здоровье — атака соприкоснувшегося объекта
>
peopleNear = enemy. GetComponent UnitScript > ( ) ; // обновляем данные объекта, чтобы узнать не стала ли атака врага = 0 (она становится нулевой при смерти)
attackEnemy = peopleNear. attack ;
>
if ( attackEnemy == 0 ) // если атака врага = 0, то начинаем движение (НЕ РАБОТАЕТ! Пробовал через OnCollisionExit2D — тоже не работало.)
<
delta = — 2f ;
>
>

Итак, у скрипта есть три проблемы:
1) Как вы уже, наверное заметили (если читали комментарии), то после уничтожения вражеского объекта (переменная attack которого стала = 0) переменная delta должна получить значение -2, чтобы персонаж опять начал двигаться, но этого не происходит (что-то смутно мне подсказывает, что вместо кода я опять чушь написал, но не могу понять где).
2) Уменьшение хп персонажей происходит слишком быстро (вернее сказать каждый кадр), и как тут сделать временную задержку я не знаю.
3) Я пробовал увеличивать количество хп у персонажей до 30 000, чтобы проследить их взаимодействие, и заметил, что после небольшого временного промежутка, они перестают «атаковать» друг друга, и значение их здоровье остается константой.

Надеюсь, кто-то все же дочитал до этого момента . Заранее спасибо!

Источник

Непонятки с void OnCollisionEnter2D(Collision2D collision)

Доброго времени суток, форумчане!

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

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Не работает Collision в Unity — This message parameter has to be of type: Collision
Добрый вечер! Имеем 2D игру. Нужно, чтобы при столкновении главного объекта со вторичным выводилось.

Непонятки с указателем типа void*
Всем привет. Имеем следующий, редко используемый в быту нормальных программистов, код: #include.

System.Void из C# использоваться не может — для получения объекта типа void используйте typeof (void)
Изучаю с# по «Шилдт Г. — C# 4.0 полное руководство» При изучении конструктора возникла проблема.

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

Проверяй теги, или смотри как убиваешь врага, так-как всё работает исправно.

Либо выкладывай полный код.

Добавлено через 20 секунд
Скрипт на герое висит?

Добавлено через 2 минуты
Ради интереса, сделай так:

Решение

А поэкспериментировать? Ещё поискать варианты?

Реализовать аналог `void *memmove(void *to, void *from, size_t n)`
Добрый день, подскажите пожалуйста, как реализовать такой метод самостоятельно? который копирует.

OnCollisionEnter2D
Обязательно на объекте, для которого нужно проверять коллизию должен висеть непосредственно на.

OnCollisionEnter2D
Помогите разобраться. В начале главной сцены когда игрок подходит к сундуку он открываеться.

Void menu(void); что это ? почему не void menu();
void menu(void); что это ? почему не void menu(); void naprimer(void); и это идет в классе это.

Ошибка cannot convert from type void*(classname::) () to type void*(*)(void*)
Подскажите пожалуйста как избавиться от ошибки? Есть ещё какой-либо способ, кроме как объявить.

Источник

Читайте также:  Xiaomi не работает сенсорный экран
Оцените статью