[РЕШЕНО]Состыковка анимации с нанесением урона

Форум для самых маленьких, а так же тех, кому недосуг читать справку самостоятельно.

[РЕШЕНО]Состыковка анимации с нанесением урона

Сообщение alebaster 28 ноя 2011, 10:59

Здравствуйте.
Пытаюсь сделать так, чтобы при ударе уменьшалось количество энергии у объекта. Один удар - минус 10 энергии. Если делать все последовательно - то энергия убывает очень быстро.
делаю:
Синтаксис:
Используется csharp
if(dist > 27)
                        rigidbody.AddForce(-myTransform.forward*moveSpeed);
                else
                {
                        StartCoroutine(AttackAnimation());     
                }


Синтаксис:
Используется csharp
 IEnumerator AttackAnimation()
        {
                animation.Play("attack1");
                       
                yield return new WaitForSeconds(animation.clip.length);
                       
                rigidbody.Sleep();
                rigidbody.WakeUp();
                _curMana -= 10;
        }


И все равно за один удар энергия уменьшается на 20, за второй - на 60 и дальше очень падает еще быстрее.

Пытался сделать через
Синтаксис:
Используется csharp
if(!animation.IsPlaying("attack1"))
                           {
                        rigidbody.Sleep();
                        rigidbody.WakeUp();
                        _curMana -= 10;
                        }

Тут энергия вообще не убавляется.
Что делать?
Последний раз редактировалось alebaster 28 ноя 2011, 20:06, всего редактировалось 2 раз(а).
alebaster
UNец
 
Сообщения: 36
Зарегистрирован: 10 ноя 2011, 22:24

Re: Состыковка анимации и нанесением урона

Сообщение Rip 28 ноя 2011, 13:22

Я не совсем понял, да и если честно не знаю как на самом деле делается, но ИМХО надо разделять логику и анимацию. Вот посмотри любую онлайн игру, удар, и скил некоторое время не доступен, потом он восстанавливается и подсвечивается как доступный.
Изображение
Реальность существует независимо от вас, до тех пор пока вы с этим согласны.
Изображение
Аватара пользователя
Rip
UNIт
 
Сообщения: 103
Зарегистрирован: 30 янв 2010, 14:11
Откуда: Оренбугская обл. г.Орск
  • ICQ

Re: Состыковка анимации и нанесением урона

Сообщение Belfegnar_ 28 ноя 2011, 13:32

Надо ввести переменную, которая будет обозначать начался или нет удар, и проверять ее, прежде чем запускать корутину. До yield'а эту переменную делаем true, после - false.
п.с. А код из первой портянки у вас не в Update случайно?
Belfegnar_
UNIт
 
Сообщения: 112
Зарегистрирован: 22 ноя 2010, 14:08

Re: Состыковка анимации и нанесением урона

Сообщение alebaster 28 ноя 2011, 14:14

Ну практически в Update (в функции, что вызывается из Update). Понимаю, что если бы не в каждом кадре вызывалось - было бы все легче, но понятия не имею куда еще засунуть.
Про переменную совсем не понял.
alebaster
UNец
 
Сообщения: 36
Зарегистрирован: 10 ноя 2011, 22:24

Re: Состыковка анимации с нанесением урона

Сообщение Sality 28 ноя 2011, 17:26

Я сам токо пару дней как открыл для себя унити, но мне кажется тебе скрипт повреждения нужно переместить на событие вызова удара. Тоесть если мышкой происходит удар, то на события мыши и нужно прицепить анимацию и повреждение. А вобще управление и логика должны быть в разных потоках.
Аватара пользователя
Sality
Старожил
 
Сообщения: 771
Зарегистрирован: 26 ноя 2011, 15:31
Откуда: Украина

Re: Состыковка анимации с нанесением урона

Сообщение alebaster 28 ноя 2011, 17:44

Это битва двух ИИ, не получится обрабатывать такие события.
alebaster
UNец
 
Сообщения: 36
Зарегистрирован: 10 ноя 2011, 22:24

Re: Состыковка анимации с нанесением урона

Сообщение seaman 28 ноя 2011, 18:16

Дело в том, что корутина у Вас вызывается каждый кадр. А т.к. она вызывается независимо ,то получается, то запущены одновременно несколько корутин. Как это стыкуется с проигрыванием анимации не знаю. Но решается вводом булевой переменно, которая устанавливается при запуске корутины и проверяется перед ее запуском, типа:

Синтаксис:
Используется csharp
bool flag;
....

if(dist > 27) rigidbody.AddForce(-myTransform.forward*moveSpeed);
else
{
    if(flag) return;
    StartCoroutine(AttackAnimation());    
}
....

 IEnumerator AttackAnimation()
{
    flag = true;
    animation.Play("attack1");
    yield return new WaitForSeconds(animation.clip.length);
   
    flag = false;    
    rigidbody.Sleep();
    rigidbody.WakeUp();
    _curMana -= 10;
}


Т.о. корутина будет запускаться только в том случае, если она уже не запущена.
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Состыковка анимации с нанесением урона

Сообщение alebaster 28 ноя 2011, 20:05

seaman писал(а):Дело в том, что корутина у Вас вызывается каждый кадр. А т.к. она вызывается независимо ,то получается, то запущены одновременно несколько корутин. Как это стыкуется с проигрыванием анимации не знаю. Но решается вводом булевой переменно, которая устанавливается при запуске корутины и проверяется перед ее запуском, типа:

...

Т.о. корутина будет запускаться только в том случае, если она уже не запущена.


Спасибо! Первый раз сталкиваюсь с сопрограммами, наконец понял их. Все отлично.

Belfegnar_ писал(а):Надо ввести переменную, которая будет обозначать начался или нет удар, и проверять ее, прежде чем запускать корутину. До yield'а эту переменную делаем true, после - false.
п.с. А код из первой портянки у вас не в Update случайно?

И конечно вам спасибо, жаль не додумался сразу о чем вы говорите).
alebaster
UNец
 
Сообщения: 36
Зарегистрирован: 10 ноя 2011, 22:24


Вернуться в Почемучка

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 20