Прокачка персонажа / Повышение уровня
| |
drcrack | Дата: Четверг, 05 Октября 2017, 18:16 | Сообщение # 21 |
старожил
Сейчас нет на сайте
| Цитата но разве так сильно нагружает систему if который не проходит проверку ? нет, это вообще мелочь незначительная, можно еще тысячу таких if рядом поставить и ничего не изменится не знаю зачем afq вообще начал ее улучшать)
Цитата А что если сделать так? Зачем ты оптимизируешь искуственный пример Он тут нужен только чтобы показать тебе, что корутины выполняются каждый кадр в том же потоке что и Update (знаешь что такое yield return 0 (или null)? это значит "продолжить выполнение корутины в следующем кадре")
Цитата скрипт изменил и он щас стал некорректно работать..слайдер больше не удаляется, а встает на 0 и все... до этого метод death() был с Destroy(gameObject) и все корректно работало...кроме начисления XP А зачем изменил? Удалять надо именно gameObject, не компонент
Цитата у меня на сцене одновременно 5 врагов одного типа, может быть проблема в этом ? Ну так убери 4 лишних и посмотри что будет
|
|
| |
afq | Дата: Четверг, 05 Октября 2017, 18:22 | Сообщение # 22 |
Разработчик
Сейчас нет на сайте
| ArtemS, попробуй поменять так.
Код public void Death() {
Destroy(slider); //убить слайдер die = true; //объект мертв }
А то мало ли.
Ты знаешь название твоего объекта, к которому прикреплен PlayerExp? Сделай у врага так как написано ниже. Думаю ту поймешь что я хочу сказать.
Код GameObject player; EnemyHealth eh;
void Start ( ) { player = GameObject.Find ( "название объекта, к которому прикреплен PlayerExp" ); eh = player.GetComponent<PlayerExp>();
} ... /* там, где враг умирает, напиши */ eh.up_xp ( 10 ); ...
А в коде PlayerExp
Код public void up_xp ( int wow_xp ) { xp += wow_xp; }
И все. Тогда.
Добавлено (05 октября 2017, 18:21) --------------------------------------------- drcrack, но coroutine будет растягиваться на кадры, когда как в update придется в том же кадре ждать, пока выполнится все команды. А coroutine будет выполнятся, пока в update много обновлений уже пройдет. Как ты собираешься производить вычисления, если они не успевают за кадр выполниться?Добавлено (05 октября 2017, 18:22) --------------------------------------------- я там ошибку сделал и исправил, пересмотри еще раз текст.
Сообщение отредактировал afq - Четверг, 05 Октября 2017, 18:22 |
|
| |
ArtemS | Дата: Четверг, 05 Октября 2017, 18:41 | Сообщение # 23 |
почетный гость
Сейчас нет на сайте
| единственно мне не нравится что придется добавлять всех противников и под каждого прописывать скрипт... а может и не придется..ведь EnemyHealth у меня 1 для всех..надеюсь что он будет наследовать этот класс автоматически, просто придется добавлять врагов в этот класс для ссылки)
Добавлено (05 октября 2017, 18:29) --------------------------------------------- afq, drcrack, все! все! =)) я нашел решение, оно выше ваших ответов просто. спасибо, пацаны, за помощь))Добавлено (05 октября 2017, 18:41) ---------------------------------------------
Цитата afq ( ) Ты знаешь название твоего объекта, к которому прикреплен PlayerExp? Сделай у врага так как написано ниже. Думаю ту поймешь что я хочу сказать. Код
GameObject player; EnemyHealth eh;
void Start ( ) { player = GameObject.Find ( "название объекта, к которому прикреплен PlayerExp" ); eh = player.GetComponent<PlayerExp>();
} ... /* там, где враг умирает, напиши */ eh.up_xp ( 10 ); ...
А в коде PlayerExp Код
public void up_xp ( int wow_xp ) { xp += wow_xp; }
И все. Тогда.
попробую так сделать, мне кажется это будет менее затратно чем постоянно проверять статус жив/мертв на врагах...особенно если учесть что я их дахрена хочу сделать)
хуяк, хуяк и в продакшн
Сообщение отредактировал ArtemS - Четверг, 05 Октября 2017, 18:32 |
|
| |
afq | Дата: Четверг, 05 Октября 2017, 18:45 | Сообщение # 24 |
Разработчик
Сейчас нет на сайте
| ArtemS, ты знаешь как с помощью кода создать много врагов и добавить к каждому EnemyHealth?
Сообщение отредактировал afq - Четверг, 05 Октября 2017, 18:45 |
|
| |
drcrack | Дата: Четверг, 05 Октября 2017, 19:37 | Сообщение # 25 |
старожил
Сейчас нет на сайте
| Цитата drcrack, но coroutine будет растягиваться на кадры, когда как в update придется в том же кадре ждать, пока выполнится все команды. А coroutine будет выполнятся, пока в update много обновлений уже пройдет. Как ты собираешься производить вычисления, если они не успевают за кадр выполниться? Так, давай еще разок. Есть задача: вычислять каждый кадр 10 миллионов раз корень из X Не надо обсуждать, зачем и почему, просто представь что такое ТЗ Ты утверждаешь что корутины выполняются где-то в отдельном потоке и никак не влияют на частоту кадров Ну так напиши код который будет выполнять эту задачу и не влиять на фпс
Цитата А что если сделать так? Если сделать так, будет только одна итерация каждый кадр, этот код не соответсвует задаче
Сообщение отредактировал drcrack - Четверг, 05 Октября 2017, 19:39 |
|
| |
afq | Дата: Четверг, 05 Октября 2017, 20:18 | Сообщение # 26 |
Разработчик
Сейчас нет на сайте
| ArtemS, классы будут прикреплены к объекту, если ты сделаешь префаб с классом.
Добавлено (05 октября 2017, 20:04) --------------------------------------------- drcrack,
Код
IEnumerator w () { /* вычислить корень */ yield return null; }
void Update () { StartCoroutine ( w () );
}
Добавлено (05 октября 2017, 20:06) --------------------------------------------- drcrack, это может повлиять на fps, если будут затрачиваться процесорное время на вычисление, когда нужно затрачивать на отрисовку. Добавлено (05 октября 2017, 20:18) --------------------------------------------- drcrack,
Цитата Функция StartCoroutine всегда возвращает управление немедленно, однако вы можете получить результат.
Сообщение отредактировал afq - Четверг, 05 Октября 2017, 20:05 |
|
| |
drcrack | Дата: Четверг, 05 Октября 2017, 20:18 | Сообщение # 27 |
старожил
Сейчас нет на сайте
| Оно будет работать, но станет намного медленнее чем было, потому что запуск корутины это более затратная операция чем просто цикл, и делать это 100 раз в секунду ради 1 итерации это как-то глупо.
Цитата drcrack, это может повлиять на fps, если будут затрачиваться процесорное время на вычисление, когда нужно затрачивать на отрисовку. О, ты почти понял. Раньше ведь совсем по-другому говорил))
Код /* создай отдельный поток, чтобы он проверялся не в кадре, а в потоке, так он не будет замедлять покадровое обновление */ Тебе осталось понять совсем немного: 1) все активные корутины выполняются каждый кадр после всех Update 2) тяжелые вычисления в любом случае влияют на фпс 3) все что можно сделать корутинами, можно также сделать в update и фпс не изменится
|
|
| |
afq | Дата: Четверг, 05 Октября 2017, 20:22 | Сообщение # 28 |
Разработчик
Сейчас нет на сайте
| вызвать coroutine не накладно, потому как возвращает мгновенно результат. А вот вичислять все конечно затормозит. 60 кадров в секунду, создастся отдельный поток, который будет миллион раз вычислять корень. 60 потоков в секунду. Ты сам знаешь, от чего тормозить будет.
|
|
| |
drcrack | Дата: Четверг, 05 Октября 2017, 20:32 | Сообщение # 29 |
старожил
Сейчас нет на сайте
| Цитата вызвать coroutine не накладно, потому как возвращает мгновенно результат. Создается новый обьект (корутина) в куче, 60 раз в секунду, это не то чтобы накладно, это просто криво (хотя очевидно медленнее чем просто цикл)
Цитата А вот вичислять все конечно затормозит. 60 кадров в секунду, создастся отдельный поток, который будет миллион раз вычислять корень. 60 потоков в секунду Никаких потоков не создается, в моем варианте вообще 1 корутина для всего, это ты зачем-то запускаешь их каждый кадр
Цитата Ты сам знаешь, от чего тормозить будет. А вот ты не знаешь, но почему-то очень уверен что знаешь. Давай может на 50 баксов поспорим что корутины в основном потоке работают?
|
|
| |
afq | Дата: Четверг, 05 Октября 2017, 20:46 | Сообщение # 30 |
Разработчик
Сейчас нет на сайте
| drcrack, не может быть.
Цитата все активные корутины выполняются каждый кадр после всех Update
Откуда такая информация. Coroutine не начнётся выполнятся вновь, он один раз запускается, и только yield способен уступить поток. Я раньше читал про устройство ос и также помню, что в си можно написать для линукс pthread_yield, что значит, уступить другому потом выполнение. В программе, если несколько потоков, вот уже не помню точно, подзабыл, но вроде менеджер есть какой-то, который знает о потоках, которые есть в программе, и чтобы например не затрачивать время на один поток, когда в нем уже не нуждаются, делают yield. И тогда процессор другим занимается, если нужно.
А что если в update применяется процессор видеокарты, потому как покадровое обновление, а на coroutine применяется pc процессор.
Цитата Оно будет работать, но станет намного медленнее чем было, потому что запуск корутины это более затратная операция чем просто цикл, и делать это 100 раз в секунду ради 1 итерации это как-то глупо.
Ну ты тоже, ты так специально написал чтоли? Давай тогда я напишу. Предлогать вычислять каждый кадр квадратный корень миллион раз, это точно глупо. Зато вычисления уже будут не в обновлении кадров, а в отдельном потоке.
Да и вообще хочешь сказать, что ты бы в кадре выполнял проверку на какое нибудь действие и использовал свойства, как в той книге советуют? А в coroutine ты что тогда бы выполнял?
Добавлено (05 октября 2017, 20:41) ---------------------------------------------
Цитата Никаких потоков не создается, в моем варианте вообще 1 корутина для всего, это ты зачем-то запускаешь их каждый кадр
Цитата хочешь сказать, что начал выполнятся coroutine, и он не успел выполнится, и начнется заного выполнятся?
ты чего drcrack, ты сам попросил вычислить каждый кадр милион разДобавлено (05 октября 2017, 20:46) --------------------------------------------- drcrack, а точно, нашел инфу, где написано, что в основном потоке выполняется.
Сообщение отредактировал afq - Четверг, 05 Октября 2017, 20:42 |
|
| |
drcrack | Дата: Четверг, 05 Октября 2017, 20:48 | Сообщение # 31 |
старожил
Сейчас нет на сайте
| Цитата Откуда такая информация. Официальная документация, приколись? https://docs.unity3d.com/Manual/ExecutionOrder.html Normal coroutine updates are run after the Update function returns.
Цитата А что если в update применяется процессор видеокарты Не применяется Весь твой код включая Update (и корутины) выполняется на CPU в одном потоке Рендеринг идет самым последнием этапом после Update, LateUpdate и других вещей
Цитата и он не успел выполнится, и начнется заного выполнятся? Вообще-то там бесконечный цикл и каждый кадр выполняется одна его итерация
Цитата ты чего drcrack, ты сам попросил вычислить каждый кадр милион раз Ну так вычисли.) Что-то у тебя пока не получилось сделать корутину "в отдельном потоке" без снижения фпс) Вот когда получится тогда и поговорим
И вообще, мы спорим на полтос или как?
Сообщение отредактировал drcrack - Четверг, 05 Октября 2017, 20:50 |
|
| |
afq | Дата: Четверг, 05 Октября 2017, 20:51 | Сообщение # 32 |
Разработчик
Сейчас нет на сайте
| drcrack, https://habrahabr.ru/company/nixsolutions/blog/268781/ не зашел бы разговор, может быть так и думал бы, что coroutine в отдельном потоке выполняется.Добавлено (05 октября 2017, 20:51) --------------------------------------------- drcrack,
Цитата И вообще, мы спорим на полтос или как?
Ты что в покер никогда не играл? Кто ж делает ставки, когда все уже вскрылись.
|
|
| |
drcrack | Дата: Четверг, 05 Октября 2017, 20:53 | Сообщение # 33 |
старожил
Сейчас нет на сайте
| Цитата Кто ж делает ставки, когда все уже вскрылись. А ты тред читай сверху вниз, а не наоборот)
|
|
| |
ArtemS | Дата: Пятница, 06 Октября 2017, 04:17 | Сообщение # 34 |
почетный гость
Сейчас нет на сайте
| afq, Цитата afq ( ) ArtemS, ты знаешь как с помощью кода создать много врагов и добавить к каждому EnemyHealth? нет. у меня идет инстанциейд префаба врага, а на префабе все нужные мне классы висят
хуяк, хуяк и в продакшн
Сообщение отредактировал ArtemS - Пятница, 06 Октября 2017, 04:21 |
|
| |
afq | Дата: Пятница, 06 Октября 2017, 07:07 | Сообщение # 35 |
Разработчик
Сейчас нет на сайте
| ArtemS, вот на всякий случай.
Код GameObject[] enemy;
... /* где то в коде */ enemy = new GameObject [10];
/* в цикле */ foreach ( GameObject e in enemy ) {
/* также, вот у тебя класс есть, например называется enemy, я например храню сценарии в Scripts, но скорее всего их можно загрузить из любой другой папки, так вот как происходит добавление класса к объекту. */ e.AddComponent<enemy>(); /* легко да? */
}
Сообщение отредактировал afq - Пятница, 06 Октября 2017, 07:08 |
|
| |
ArtemS | Дата: Пятница, 06 Октября 2017, 07:44 | Сообщение # 36 |
почетный гость
Сейчас нет на сайте
| afq, спасибо) я просто пока плохо знаю с#, да и вообще программирование. вечерами после работы пару часиков сижу вот как год уже и понимаю что очень многое не знаю)
получается создаю пустой объект со скриптом, и префаб врага. а уже потом на префаб врага вешаю класс из пустого объекта. разве не получится, что в другом префабе врага будут точно такие же переменные(отвечающие за статы), что и в первом ? выходит нужно будет в префабе каждого enemy брать переменные и менять их вручную, либо задавать еще переменные которые будут уже менять стандартные статы.
Ладно, разберусь. Спасибо!)
хуяк, хуяк и в продакшн
|
|
| |
drcrack | Дата: Пятница, 06 Октября 2017, 09:32 | Сообщение # 37 |
старожил
Сейчас нет на сайте
| Цитата я просто пока плохо знаю с# он тоже
Цитата добавление класса к объекту компонента, а не класса
Цитата но скорее всего их можно загрузить из любой другой папки разумеется можно, юнити автоматом добавляет все .cs файлы в проект для компиляции (кроме тех что лежат в Plugins или Editor, у них отдельные проекты)
Цитата получается создаю пустой объект со скриптом, и префаб врага. а уже потом на префаб врага вешаю класс из пустого объекта. разве не получится, что в другом префабе врага будут точно такие же переменные(отвечающие за статы), что и в первом ? выходит нужно будет в префабе каждого enemy брать переменные и менять их вручную, либо задавать еще переменные которые будут уже менять стандартные статы. В твоем случае лучше просто сделать отдельный префаб для каждого врага (если их немного разных) и в нужный момент делать Instantiate, тогда ты сможешь настраивать все свойства (урон, экспу и тд) просто в инспекторе в префабе.
Сообщение отредактировал drcrack - Пятница, 06 Октября 2017, 09:36 |
|
| |
|