Интересно какая операция быстрее, для проверки урона от оружия по персонажам: 1) SendMessage (отправка сообщения столкнувшемуся объекту) 2) GetComponent (взять скрипт из столкнувшегося объекта, т.е. на старте один раз не инициализируешь этот компонент)
Ибо строю систему урона от оружия, и нужно при столкновении пули/оружия с NPC передавать ему данные урона, раньше я передавал только количество отнятия здоровья, но теперь нужно передать урон по дробящему/колющему/режущему/огню/льду факторам. Передавал урон через SendMessage, но через него грамотно не передашь сразу кучу параметров, вот и задумался об альтернативах.
Сообщение отредактировал alexsilent - Четверг, 07 Января 2016, 10:31
SendMessage сам по себе является каким-то костылем и работает всегда медленней, чем GetComponent. Лично я советую вообще его не использовать, т.к. рефакторинг с такими методами невыносим, да и отследить вызов в некоторых случаях достаточно проблематично.
Сообщение отредактировал Storm54 - Четверг, 07 Января 2016, 10:40
рефакторинг с такими методами невыносим, да и отследить вызов в некоторых случаях достаточно проблематично.
Нутызагнул!!! С уазвращением на гцуп )))))))))))
Цитатаalexsilent ()
Передавал урон через SendMessage, но через него грамотно не передашь сразу кучу параметров, в
Передашь )))
Код
public class AClass : MonoBehaviour {
// Use this for initialization void Start() { GameObject go = GameObject.Find("111"); go.SendMessage("ObjMethode", new AClassExt { a = 2, b = gameObject}); } public void ObjMethode(AClassExt _a) { Debug.Log(_a); Debug.Log(_a.a); Debug.Log(_a.b); } }
public class AClassExt { public int a; public GameObject b;
}
А Ваще мог бы самостоятельно стресс-тест сделать на 2 варианта и посмотреть, что для теб приемлемо.. Сильно врядли, что по урону счет будет идти на тысячи каждый кадр.
// Use this for initialization void Start() { GameObject go = GameObject.Find("111"); go.SendMessage("ObjMethode", new AClassExt { a = 2, b = gameObject}); } public void ObjMethode(AClassExt _a) { Debug.Log(_a); Debug.Log(_a.a); Debug.Log(_a.b); } }
public class AClassExt { public int a; public GameObject b;
}
Очень интересно, а на ЯваСкрипте такое можно сделать?
Ну с ивентами свои заморочки. броадкастить ими можно, главное не забывать отписываться, когда не нужны. Когда делаешь на ивентах нужно четко представлять архитектуру, иначе м.б. задвоения еще нек неприятные вещи, а sendmessage работает по принципу плюнул и забиыл. Если не злоупотреблять ими, то они вполне "аллё".
Кста... С Рождеством!
Добавлено (07 января 2016, 16:14) ---------------------------------------------
Цитатаalexsilent ()
1) SendMessage 2) GetComponent
Вот же самый простой способ ( Оливье дает о себе знать: ) я его у себя пользовал.
Код
public static Dictionary<GameObject,AllActiveObjectsScript> AllActiveObjects = new Dictionary<GameObject,AllActiveObjectsScript >();
по эвейку объекта засовывать инстанс его скрипта в пулл. Ключом ставить объект.. и вуаля... Дальше просто поиск по ключу.
Правда не знаю работает ли на юнити скрипт
Сообщение отредактировал Ranger - Четверг, 07 Января 2016, 13:26
:< Тлен, у меня больше половина скриптов замешано на SendMessage (а их около сотни), но судя по профайлу, больше всего жрёт всё равно графика. smile
Цитата
So, on my (rather old) machine, a loop of 5000000 SendMessage calls, using an empty function, takes 9.872 seconds. A loop of 5000000 direct calls (using a cached GetComponent) takes .024 seconds. Therefore, direct calling seems to be about 400 times faster, although considering that the loop itself takes up some time, it's probably more than that.
Цитата
Time for SendMessage 1000 times: 0.00137501955032349 Time for direct functon call 1000 times: 0.000117003917694092
iPhone, no stripping, "Slow and Safe" call optimization:
Time for SendMessage 1000 times: 0.0327930450439453 Time for direct functon call 1000 times: 0.00520801544189453
iPhone, micro mscorlib, "Fast but no exceptions":
Time for SendMessage 1000 times: 0.0356040000915527 Time for direct functon call 1000 times: 0.00104284286499023
Поговаривают еще, что на мобильных устройствах из за SendMessage могут быть фризы Если не в Update используешь , то думаю не сильно страшно, если платформа Пк. Но лучше присмотрись к альтернативам, та что выше система или в asset store есть бесплатные плагины