- Unity oncollisionstay не работает
- Re: OnCollisionEnter не работает.
- Re: OnCollisionEnter не работает.
- Re: OnCollisionEnter не работает.
- Re: OnCollisionEnter не работает.
- Re: OnCollisionEnter не работает.
- Re: OnCollisionEnter не работает.
- Re: OnCollisionEnter не работает.
- Re: OnCollisionEnter не работает.
- Re: OnCollisionEnter не работает.
- Re: OnCollisionEnter не работает.
- Re: OnCollisionEnter не работает. [РЕШЕНО]
- Re: OnCollisionEnter не работает. [РЕШЕНО]
- Re: OnCollisionEnter не работает. [РЕШЕНО]
- Re: OnCollisionEnter не работает. [РЕШЕНО]
- Кто сейчас на конференции
- Функции событий столкновений: OnCollisionEnter, OnCollisionEnter2D, OnCollisionStay, OnTriggerEnter
- 1 ответ 1
- Список функций:
- О функциях OnCollision. и их 2D версиях
- О функциях-триггерах OnTrigger. и их 2D версиях
- О переводе в «спящее» состояние
- Unity oncollisionstay не работает
- Непонятки с void OnCollisionEnter2D(Collision2D collision)
- Решение
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 .
Важно:
- События столкновений отправляются даже на неактивные компоненты.
- События столкновений НЕ отправляются на объекты с отключенным или временно неактивным компонентом 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.
Важно:
- Функции-триггеры вызываются в FixedUpdate после непосредственного входа в триггер/выхода из триггера и т.д., поэтому объекты, участвующие в столкновении, в момент вызова функции-триггера могут уже находиться не той позиции, где были в момент столкновения.
- Функции-триггеры не являются непосредственной частью столкновений, а лишь функцией MonoBehaviour’a.
- Функция 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*)
Подскажите пожалуйста как избавиться от ошибки? Есть ещё какой-либо способ, кроме как объявить.
Источник