Самый простой вариант - сделать это одной длинной анимацией. А вот если кодить, то придётся заморочиться. Проще перейти на сорс, там NPC умеют пятиться и даже одновременно атаковать. Собсно, неделю назад я принял такое решение на основе того, что на моём железе игры на сорс 2013 летают. Оригинальные компиляторы собирают карты для сорса раза в 3 дольше, чем Дядьмишины паранойевские для голдсорса (кастомные для сорса пока не пробовал), но это ещё и мой косяк, просто перенёс карты без причёсывания. Впечатления пока положительные, хл2 еп2 вполне знает многие энтити для первой халфы: функ_валлы, функ_доры, монстер_генерик, лайты. Буду попробовать, может что из этого выйдет.
Смотришь вектор куда игрок смотрит, отслеживаешь удар, если удар нанесён то отбрасываешь монстра назад по вектору взгляда игрока (задаешь велосити или импульс на время проигрывания анимации) и включаешь собственно саму анимацию. Можно ещё развернуть самого монстра мордой в направлении игрока, чтобы он потом не тупил когда сам разворачивался. Так же можно кинуть трассу из спины монстра чтобы считать дистанцию насколько далеко он должен отойти, чтобы не пятился в стенки.
__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!
FiEctro писал: Смотришь вектор куда игрок смотрит, отслеживаешь удар, если удар нанесён то отбрасываешь монстра назад по вектору взгляда игрока (задаешь велосити или импульс на время проигрывания анимации) и включаешь собственно саму анимацию. Можно ещё развернуть самого монстра мордой в направлении игрока, чтобы он потом не тупил когда сам разворачивался. Так же можно кинуть трассу из спины монстра чтобы считать дистанцию насколько далеко он должен отойти, чтобы не пятился в стенки.
хм, попробую сколхозить в упрощённом виде, после удара просто вызвать импульс назад, и в анимации удара добавить анимацию движения ног назад без передвижения рут-кости
Почему бы не сделать анимацию удара с подшагом и последующим отскоком? Вроде, когда дерешься несподручно нос в нос стоять. Теоретически. Сам не дерусь, я только на форуме смелый.
ZGreen писал: Почему бы не сделать анимацию удара с подшагом и последующим отскоком? Вроде, когда дерешься несподручно нос в нос стоять. Теоретически. Сам не дерусь, я только на форуме смелый.
так я так делал, при анимации нпс может сквозь стены проходить
ZGreen писал: Почему бы не сделать анимацию удара с подшагом и последующим отскоком?
Мудрить с анимациями не надо (если только хочется сделать быстро и просто), у ИИ в халфе есть система щедъюлей, где можно переключать активности, типа: шаг вперёд, удар, шаг назад, тремя разными анимациями. Оно не работает как хочется по двум причинам: первая - затупы при переключении активностей, из-за того, что серверный фпс плавает и эвенты плохо отлавливаются (привет ковыряния с DispatchAnimEvents), вторая - монстры не умеют ходить назад, им надо повернуться лицом по направлению движения. И если второе можно победить, невозбранно модифицировав код перемещения с оглядкой на летающих монстров, то первое очень геморно, и корень проблемы сидит в движке, как объяснял Дядя Миша, ЕМНИП.
Добавлено 27-08-2025 в 00:34:
Там даже в коде flInterval фиксированный - 0.1, чтобы срабатывания DispatchAnimEvents совпадали с интервалами тчинка монстра gpGlobals->time + 0.1. Я уже точно не помню, но вроде это нужно для того, чтобы клиентский и серверный эвенты срабатывали одновременно. В этой теме я экспериментировал, и в разных вариациях было так, что либо клиентский эвент опаздывает на один pev->frame за серверным, либо серверный не срабатывает. ДМ в этой же теме упоминал, что интервал в IEngineStudio.ClientEvents - сотые доли секунды, а в CBaseAnimating::DispatchAnimEvents - десятые. Соответственно, клиент в любом случае воспроизведёт эвент, например маззлфлеш при стрельбе. А вот сервер может пропустить. Отсюда все затупы со сменой активностей, например, при попытках монстра выйти из боя и найти укрытие. Мой вариант в теме вполне рабочий, но не на моделях, где эвент стоит на последнем кадре. Я забил на это всё, не стал дальше копаться в теме. Хотя очень хотел сделать НПС подвижнее. Если анимаций нет, незачем и код для них писать.
Добавлено 27-08-2025 в 00:50:
Есть ещё один вариант, но он, на мой взгляд, лишает всей прелести использования студио эвентов на сервере. Это полностью выкинуть эту замечательную систему, и писать фиксированные тайминги в коде, что де на такой-то секунде такой-то анимации монстр наносит урон, делает выстрел, или что-то ещё. Такое себе, потому что опять же, фпс всегда разный, и попасть в эти тайминги нереально. В таком случае монстры должны быть анимированы как игрок. А ведь через эвенты можно не только вызывать функции из кода монстров, но и активировать энтити на карте и ещё много чего.
JPEG ну конечно говнокод. По-хорошему должно быть что-то такое:
C++ Source Code:
1
// primary melee attack
2
Task_t tlPrimaryMeleeAttack1[] =
3
{
4
{ TASK_STOP_MOVING, 0 },
5
{ TASK_FACE_ENEMY, (float)0 },
6
{ TASK_MELEE_ATTACK1, (float)0 },
7
{ TASK_FALL_BACK, (float)0 }, // грамотнее будет TASK_RETREAT
8
};
9
10
case TASK_FALL_BACK:
11
{
12
m_IdealActivity = ACT_WALK_BACK;
13
break;
14
}
Хотя, если работает, то почему не использовать?
Добавлено 28-08-2025 в 21:38:
Почему таски с щедъюлями лучше? Потому что не надо заводить какие-то сомнительные переменные типа m_fFallback. Тайминги можно задавать прям в массиве тасков, поставив вместо нуля другое число.