forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Общие вопросы (http://forum.boolean.name/forumdisplay.php?f=166)
-   -   Вопросы от новичка (http://forum.boolean.name/showthread.php?t=15809)

Nex 25.02.2016 14:36

Ответ: Вопросы от новичка
 
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 для получения массива рядом находящихся объектов.

Жека 29.02.2016 06:27

Ответ: Вопросы от новичка
 
Цитата:

Сообщение от RegIon (Сообщение 304037)
Как *епть* в Unity получить угол по оси X в диапазоне 0 - 360 ???

Вот это
PHP код:

Vector3 euler transform.localRotation.eulerAngles

возвращает углы в 0..360.
Пробовал такое?

Жека 29.02.2016 06:38

Ответ: Вопросы от новичка
 
Цитата:

Сообщение от Владимир (Сообщение 304273)
Как я понимаю функции OnCollisionEnter2D и OnCollisionStay2D обрабатываются для каждой коллизии отдельно.

1. Полагаю, что при нескольких столкновениях ты получишь несколько вызовов этих функций, в каждой из которых информация об одном объекте столкновения.
2. Collision2D.contacts - это точки столкновения, т.е. части одного объекта, с которым столкнулись.

Цитата:

Сообщение от Владимир (Сообщение 304273)
1. Мне собственно нужно получить количество объектов с которыми столкнулся объект игрока.

Зачем тебе количество? Спрашиваю потому, что возможно это и не требуется, и можно сделать иначе.

Цитата:

Сообщение от Владимир (Сообщение 304273)
2. OnCollisionExit2D срабатывает при любом выходе из коллизии даже в случае множественных коллизий(т.е. если из нескольких действующих коллизий одна прервалась)?

Срабатывает для каждого объекта, который ранее был в состоянии коллизии.

Владимир 29.02.2016 07:54

Ответ: Вопросы от новичка
 
Цитата:

Сообщение от Nex (Сообщение 304274)
1. Можно создать список для проверяемых объектов. При событии OnCollisionEnter2D добавлять в этот список объект с которым столкнулись. При событии OnCollisionExit2D удалять объект с которым было столкновение из списка. И где нибудь в Update обрабатывать этот список с объектами.
Но тут возможно может получится так, что объект может записаться в список столкновений и тут же удалится, а функция обработки запустится после всего этого. Но можно вызывать функцию обработки прям из события OnCollisionEnter2D.

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

Цитата:

Сообщение от Nex (Сообщение 304274)
2. Можно использовать Physics2D.OverlapPointAll для получения массива рядом находящихся объектов.

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

Цитата:

Сообщение от Жека (Сообщение 304326)
1. Полагаю, что при нескольких столкновениях ты получишь несколько вызовов этих функций, в каждой из которых информация об одном объекте столкновения.
2. Collision2D.contacts - это точки столкновения, т.е. части одного объекта, с которым столкнулись.

Собственно это и пронаблюдал.

Цитата:

Сообщение от Жека (Сообщение 304326)
Зачем тебе количество? Спрашиваю потому, что возможно это и не требуется, и можно сделать иначе.

Моя цель выбрать из всех объектов с которыми я столкнулся один, с минимальным значением одной из переменных экземпляра объекта, например с минимальным значением переменной hp и его уже атаковать. Если есть идеи как сделать это не через массив буду рад выслушать :)

Жека 29.02.2016 11:09

Ответ: Вопросы от новичка
 
Можно сделать функцию RefineTargetObject(GameObject obj), которая будет определять очередную цель по каким-то параметрам.
Вызываешь эту функцию в методе OnCollisionEnter2D() и передаёшь туда объект столкновения.
Можно завести переменные под те параметры, по которым ты проверяешь, например minHp.
В функции RefineTargetObject делаешь сравнение
PHP код:

if (obj.hp minHp) {
  
minHp obj.hp;
  
target obj// наша новая цель


Таким образом, при каждой коллизии мы имеем возможность переключаться на другую цель, если у неё hp меньше. В функции атаки используем эту переменную target - кого атаковать.
Начальное значение для minHp можно сделать int.MaxValue.
obj.hp - это упрощённо, на самом деле hp ты получишь из своего obj.GetComponet<...>

Владимир 29.02.2016 12:06

Ответ: Вопросы от новичка
 
Цитата:

Сообщение от Жека (Сообщение 304332)
Можно сделать функцию RefineTargetObject(GameObject obj), которая будет определять очередную цель по каким-то параметрам.
Вызываешь эту функцию в методе OnCollisionEnter2D() и передаёшь туда объект столкновения.

Тоже хороший вариант и действительно простой, спасибо! Но так же придется делать проверку на наличие коллизии при обработке этой коллизии. В общем буду думать и пробовать :)

Жека 29.02.2016 14:38

Ответ: Вопросы от новичка
 
Цитата:

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

О чём это ты?

Владимир 29.02.2016 17:06

Ответ: Вопросы от новичка
 
Цитата:

Сообщение от Жека (Сообщение 304348)
О чём это ты?

О том, что урон я планирую наносить раз в секунду, за это время между объектами может появиться расстояние и коллизия как таковая пропадет между ними, а target у нас уже определен. Вообще еще подумаю над реализацией переопределения target в случае если предыдущий target вышел из коллизии. Может все таки будет проще это сделать с массивом, поскольку в нем будут все коллизии и ими будет можно свободно оперировать.

Nex 01.03.2016 05:46

Ответ: Вопросы от новичка
 
Цитата:

Сообщение от Владимир (Сообщение 304350)
О том, что урон я планирую наносить раз в секунду, за это время между объектами может появиться расстояние и коллизия как таковая пропадет между ними, а target у нас уже определен.

Используй список List<>. При коллизии добавляешь в список объект, а потом уже можно как угодно обрабатывать, удалять и тд.

Жека 01.03.2016 06:17

Ответ: Вопросы от новичка
 
Цитата:

Сообщение от Владимир (Сообщение 304350)
между объектами может появиться расстояние и коллизия как таковая пропадет между ними, а target у нас уже определен.

Сбросить таргет можно в функции OnCollisionExit2D
PHP код:

void OnCollisionExit2D(Collision2D collision) {
  if (
collision.gameObject == target) {
    
target null;
  }



ILonion 01.03.2016 15:58

Ответ: Вопросы от новичка
 
Доброго времени.
Подскажите, пожалуйста, вот эта штука выгружает всё что связано со сценой в которой она запущена: SceneManager.LoadSceneAsync(LevelName) ?
Мне нужно чтобы сцена '0' полностью выгрузилась из памяти перед передачей управления LevelName (смущает существование UnloadScene).
Также хочется узнать как обнулить на дефолт все static ?

UPD: обнулить на дефолт все static - только ручками?

pax 01.03.2016 20:17

Ответ: Вопросы от новичка
 
1. Выгружает, unload для выгрузки аддитивно загруженных сцен (методы additive).
2. Ручками, да. Возможно тебе подойдет паттерн Синглтон.

RegIon 01.03.2016 23:26

Ответ: Вопросы от новичка
 
Цитата:

Сообщение от pax (Сообщение 304408)
1. Выгружает, unload для выгрузки аддитивно загруженных сцен (методы additive).

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

Так же можно менять сцены, которые уже загружены.


PS. Может из-за того что у меня сцены мелкие, и прыгает часто.
Unity 5.3.1

ILonion 02.03.2016 19:27

Ответ: Вопросы от новичка
 
Подскажите, с чем может быть связана такая штуковина:

Ошибок напрямую связанных с моим кодом вроде нет. Это что-то юнити внутреннее?

pax 02.03.2016 20:03

Ответ: Вопросы от новичка
 
Вероятно баг, не парься.


Часовой пояс GMT +4, время: 20:45.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot