ВерховныйНоуНейм писал(а):Спасибо за совет, засунул деление в Start(), что бы не переписывать все значения для оружий.
Да не в делении проблема, а в наличии самого апдейта и самого способа вызова метода. Используй хотя бы
https://docs.unity3d.com/ScriptReferenc ... ating.htmlЧто-то вроде
Используется csharp
void BeginShoot()
{
if(current_weapon.ammo>0 && !IsInvoking("Shoot"))
InvokeRepeating("Shoot", current_weapon.attack_speed, current_weapon.attack_speed);
}
void EndShoot()
{
CancelInvoke("Shoot");
}
void Shoot()
{
if(current_weapon.ammo<=0)
{
CancelInvoke("Shoot");
return;
}
...
}
Ну и дальше можешь подписывать на System.Action или делать как-то иначе. Т.е. происходит событие: игрок нажимает на кнопку выстрела и вызывается 1 раз BeginShoot(), отжимает кнопку или заканчиваются патроны - вызывается EndShoot().
Суть в том, что любые игровые события должны выполнятся в момент вызова, а не ожидать момента вызова и проверять постоянно не вызвал ли их кто.В идеальном варианте у тебя в проекте вообще не будет Update(), кроме как для Input, но и тот не обязателен, если у тебя управление чем кнопки интерфейса и проект для смартфонов.
Любая структура с логикой
Используется csharp
Update()
{
if(...) DoSomething()
}
В 99.999% случаях ошибочна и её можно заменить.
Допускаются только Input и Ray.
Для анимаций и похожего лучше использовать короутину с колбеком.
Используется csharp
void Play()
{
StartCoroutine(PlayInternal(..., delegate {Example(); } ) );
}
void Example()
{
}
IEnumerator PlayInternal(..., System.Action deleg)
{
...
yield...
if (deleg != null)
{
deleg();
}
}