Пятница, 19 Апреля 2024, 03:42

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 2 из 2
  • «
  • 1
  • 2
Форум игроделов » Движки для разработки игр и сложные системы разработки » Unity » Прокачка персонажа / Повышение уровня
Прокачка персонажа / Повышение уровня
drcrackДата: Четверг, 05 Октября 2017, 18:16 | Сообщение # 21
старожил
Сейчас нет на сайте
Цитата
но разве так сильно нагружает систему if который не проходит проверку ?

нет, это вообще мелочь незначительная, можно еще тысячу таких if рядом поставить и ничего не изменится
не знаю зачем afq вообще начал ее улучшать)

Цитата
А что если сделать так?

Зачем ты оптимизируешь искуственный пример blink
Он тут нужен только чтобы показать тебе, что корутины выполняются каждый кадр в том же потоке что и 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
старожил
Сейчас нет на сайте
Цитата
я просто пока плохо знаю с#

он тоже crazy :D

Цитата
добавление класса к объекту

компонента, а не класса

Цитата
но скорее всего их можно загрузить из любой другой папки

разумеется можно, юнити автоматом добавляет все .cs файлы в проект для компиляции (кроме тех что лежат в Plugins или Editor, у них отдельные проекты)

Цитата
получается создаю пустой объект со скриптом, и префаб врага. а уже потом на префаб врага вешаю класс из пустого объекта. разве не получится, что в другом префабе врага будут точно такие же переменные(отвечающие за статы), что и в первом ? выходит нужно будет в префабе каждого enemy брать переменные и менять их вручную, либо задавать еще переменные которые будут уже менять стандартные статы.

В твоем случае лучше просто сделать отдельный префаб для каждого врага (если их немного разных) и в нужный момент делать Instantiate, тогда ты сможешь настраивать все свойства (урон, экспу и тд) просто в инспекторе в префабе.


Сообщение отредактировал drcrack - Пятница, 06 Октября 2017, 09:36
Форум игроделов » Движки для разработки игр и сложные системы разработки » Unity » Прокачка персонажа / Повышение уровня
  • Страница 2 из 2
  • «
  • 1
  • 2
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг