|
Общие вопросы вопросы не попадающие ни в один из доступных разделов |
25.02.2016, 14:36
|
#2296
|
Гигант индустрии
Регистрация: 13.09.2008
Сообщений: 2,893
Написано 1,185 полезных сообщений (для 3,298 пользователей)
|
Ответ: Вопросы от новичка
1. Можно создать список для проверяемых объектов. При событии OnCollisionEnter2D добавлять в этот список объект с которым столкнулись. При событии OnCollisionExit2D удалять объект с которым было столкновение из списка. И где нибудь в Update обрабатывать этот список с объектами.
Но тут возможно может получится так, что объект может записаться в список столкновений и тут же удалится, а функция обработки запустится после всего этого. Но можно вызывать функцию обработки прям из события OnCollisionEnter2D.
void OnCollisionEnter2D(GameObject obj) {
collidersList.Add(obj);
UpdateCollidersList();
}
void OnCollisionExit2D(GameObject obj) {
if (collidersList.Contains(obj)) {
collidersList.Remove(obj);
}
}
void UpdateCollidersList() {
// обработка списка столкновений и тд.
}
}
2. Можно использовать Physics2D.OverlapPointAll для получения массива рядом находящихся объектов.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
29.02.2016, 06:27
|
#2297
|
Дэвелопер
Регистрация: 04.09.2005
Адрес: Красноярск
Сообщений: 1,376
Написано 491 полезных сообщений (для 886 пользователей)
|
Ответ: Вопросы от новичка
Сообщение от RegIon
Как *епть* в Unity получить угол по оси X в диапазоне 0 - 360 ???
|
Вот это
Vector3 euler = transform.localRotation.eulerAngles;
возвращает углы в 0..360.
Пробовал такое?
|
(Offline)
|
|
29.02.2016, 06:38
|
#2298
|
Дэвелопер
Регистрация: 04.09.2005
Адрес: Красноярск
Сообщений: 1,376
Написано 491 полезных сообщений (для 886 пользователей)
|
Ответ: Вопросы от новичка
Сообщение от Владимир
Как я понимаю функции OnCollisionEnter2D и OnCollisionStay2D обрабатываются для каждой коллизии отдельно.
|
1. Полагаю, что при нескольких столкновениях ты получишь несколько вызовов этих функций, в каждой из которых информация об одном объекте столкновения.
2. Collision2D.contacts - это точки столкновения, т.е. части одного объекта, с которым столкнулись.
Сообщение от Владимир
1. Мне собственно нужно получить количество объектов с которыми столкнулся объект игрока.
|
Зачем тебе количество? Спрашиваю потому, что возможно это и не требуется, и можно сделать иначе.
Сообщение от Владимир
2. OnCollisionExit2D срабатывает при любом выходе из коллизии даже в случае множественных коллизий(т.е. если из нескольких действующих коллизий одна прервалась)?
|
Срабатывает для каждого объекта, который ранее был в состоянии коллизии.
|
(Offline)
|
|
29.02.2016, 07:54
|
#2299
|
AnyKey`щик
Регистрация: 19.02.2016
Сообщений: 4
Написано 0 полезных сообщений (для 0 пользователей)
|
Ответ: Вопросы от новичка
Сообщение от Nex
1. Можно создать список для проверяемых объектов. При событии OnCollisionEnter2D добавлять в этот список объект с которым столкнулись. При событии OnCollisionExit2D удалять объект с которым было столкновение из списка. И где нибудь в Update обрабатывать этот список с объектами.
Но тут возможно может получится так, что объект может записаться в список столкновений и тут же удалится, а функция обработки запустится после всего этого. Но можно вызывать функцию обработки прям из события OnCollisionEnter2D.
|
Про реализацию через массивы думал, но решил пробовать реализацию которую привел выше, поскольку она проще, но к сожалению она не работает Про то, что коллизия может быть очень скоротечной, то так скорей всего и будет, но в этом случае я просто сделаю проверку перед основной обработкой коллизии и при необходимости корректировку массива, по ресурсам будет не затратно поскольку буду делать это где-то раз в секунду.
Сообщение от Nex
|
Спасибо за совет, мануал почитал, но не совсем понял как она работает, чуть позже ее попробую, чтобы разобраться с ее работой.
Сообщение от Жека
1. Полагаю, что при нескольких столкновениях ты получишь несколько вызовов этих функций, в каждой из которых информация об одном объекте столкновения.
2. Collision2D.contacts - это точки столкновения, т.е. части одного объекта, с которым столкнулись.
|
Собственно это и пронаблюдал.
Сообщение от Жека
Зачем тебе количество? Спрашиваю потому, что возможно это и не требуется, и можно сделать иначе.
|
Моя цель выбрать из всех объектов с которыми я столкнулся один, с минимальным значением одной из переменных экземпляра объекта, например с минимальным значением переменной hp и его уже атаковать. Если есть идеи как сделать это не через массив буду рад выслушать
Последний раз редактировалось Владимир, 29.02.2016 в 10:15.
|
(Offline)
|
|
29.02.2016, 11:09
|
#2300
|
Дэвелопер
Регистрация: 04.09.2005
Адрес: Красноярск
Сообщений: 1,376
Написано 491 полезных сообщений (для 886 пользователей)
|
Ответ: Вопросы от новичка
Можно сделать функцию RefineTargetObject(GameObject obj), которая будет определять очередную цель по каким-то параметрам.
Вызываешь эту функцию в методе OnCollisionEnter2D() и передаёшь туда объект столкновения.
Можно завести переменные под те параметры, по которым ты проверяешь, например minHp.
В функции RefineTargetObject делаешь сравнение
if (obj.hp < minHp) { minHp = obj.hp; target = obj; // наша новая цель }
Таким образом, при каждой коллизии мы имеем возможность переключаться на другую цель, если у неё hp меньше. В функции атаки используем эту переменную target - кого атаковать.
Начальное значение для minHp можно сделать int.MaxValue.
obj.hp - это упрощённо, на самом деле hp ты получишь из своего obj.GetComponet<...>
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо Жека за это полезное сообщение:
|
|
29.02.2016, 12:06
|
#2301
|
AnyKey`щик
Регистрация: 19.02.2016
Сообщений: 4
Написано 0 полезных сообщений (для 0 пользователей)
|
Ответ: Вопросы от новичка
Сообщение от Жека
Можно сделать функцию RefineTargetObject(GameObject obj), которая будет определять очередную цель по каким-то параметрам.
Вызываешь эту функцию в методе OnCollisionEnter2D() и передаёшь туда объект столкновения.
|
Тоже хороший вариант и действительно простой, спасибо! Но так же придется делать проверку на наличие коллизии при обработке этой коллизии. В общем буду думать и пробовать
|
(Offline)
|
|
29.02.2016, 14:38
|
#2302
|
Дэвелопер
Регистрация: 04.09.2005
Адрес: Красноярск
Сообщений: 1,376
Написано 491 полезных сообщений (для 886 пользователей)
|
Ответ: Вопросы от новичка
Сообщение от Владимир
Но так же придется делать проверку на наличие коллизии при обработке этой коллизии.
|
О чём это ты?
|
(Offline)
|
|
29.02.2016, 17:06
|
#2303
|
AnyKey`щик
Регистрация: 19.02.2016
Сообщений: 4
Написано 0 полезных сообщений (для 0 пользователей)
|
Ответ: Вопросы от новичка
Сообщение от Жека
О чём это ты?
|
О том, что урон я планирую наносить раз в секунду, за это время между объектами может появиться расстояние и коллизия как таковая пропадет между ними, а target у нас уже определен. Вообще еще подумаю над реализацией переопределения target в случае если предыдущий target вышел из коллизии. Может все таки будет проще это сделать с массивом, поскольку в нем будут все коллизии и ими будет можно свободно оперировать.
|
(Offline)
|
|
01.03.2016, 05:46
|
#2304
|
Гигант индустрии
Регистрация: 13.09.2008
Сообщений: 2,893
Написано 1,185 полезных сообщений (для 3,298 пользователей)
|
Ответ: Вопросы от новичка
Сообщение от Владимир
О том, что урон я планирую наносить раз в секунду, за это время между объектами может появиться расстояние и коллизия как таковая пропадет между ними, а target у нас уже определен.
|
Используй список List<>. При коллизии добавляешь в список объект, а потом уже можно как угодно обрабатывать, удалять и тд.
|
(Offline)
|
|
01.03.2016, 06:17
|
#2305
|
Дэвелопер
Регистрация: 04.09.2005
Адрес: Красноярск
Сообщений: 1,376
Написано 491 полезных сообщений (для 886 пользователей)
|
Ответ: Вопросы от новичка
Сообщение от Владимир
между объектами может появиться расстояние и коллизия как таковая пропадет между ними, а target у нас уже определен.
|
Сбросить таргет можно в функции OnCollisionExit2D
void OnCollisionExit2D(Collision2D collision) { if (collision.gameObject == target) { target = null; } }
|
(Offline)
|
|
01.03.2016, 15:58
|
#2306
|
ПроЭктировщик
Регистрация: 02.10.2014
Сообщений: 102
Написано 5 полезных сообщений (для 25 пользователей)
|
Ответ: Вопросы от новичка
Доброго времени.
Подскажите, пожалуйста, вот эта штука выгружает всё что связано со сценой в которой она запущена: SceneManager.LoadSceneAsync(LevelName) ?
Мне нужно чтобы сцена '0' полностью выгрузилась из памяти перед передачей управления LevelName (смущает существование UnloadScene).
Также хочется узнать как обнулить на дефолт все static ?
UPD: обнулить на дефолт все static - только ручками?
|
(Offline)
|
|
01.03.2016, 20:17
|
#2307
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Вопросы от новичка
1. Выгружает, unload для выгрузки аддитивно загруженных сцен (методы additive).
2. Ручками, да. Возможно тебе подойдет паттерн Синглтон.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
01.03.2016, 23:26
|
#2308
|
Элита
Регистрация: 16.01.2010
Адрес: Новосибирск
Сообщений: 2,157
Написано 502 полезных сообщений (для 1,012 пользователей)
|
Ответ: Вопросы от новичка
Сообщение от pax
1. Выгружает, unload для выгрузки аддитивно загруженных сцен (методы additive).
|
Не, не только. Сейчас сцены не выгружаются при смене до какого-то момента. Словил баг, при вторичном переходе на сцену, где должно было все переинициализоваться, но этого не случилось.
Помогоает флаг LoadMethod.Single в таких случаях.
Так же можно менять сцены, которые уже загружены.
PS. Может из-за того что у меня сцены мелкие, и прыгает часто.
Unity 5.3.1
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
02.03.2016, 19:27
|
#2309
|
ПроЭктировщик
Регистрация: 02.10.2014
Сообщений: 102
Написано 5 полезных сообщений (для 25 пользователей)
|
Ответ: Вопросы от новичка
Подскажите, с чем может быть связана такая штуковина:
Ошибок напрямую связанных с моим кодом вроде нет. Это что-то юнити внутреннее?
|
(Offline)
|
|
02.03.2016, 20:03
|
#2310
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Вопросы от новичка
Вероятно баг, не парься.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 16:22.
|