Unreal Engine C++ Course
PatreonBoostyTelegramYoutube
  • О курсе
  • Ссылки
    • Git
    • Visual Studio
    • Unreal Engine
  • Глоссарий
    • Общие понятия
    • Код / C++
      • Const correctness
      • Использование auto
    • Код / Best practices
    • Анимации
    • UI
    • VFX
    • AI
  • Unreal Editor Hotkeys
  • Visual Studio Hotkeys
  • Console commands
  • Проблемы и решения
    • IntelliSense тормозит
    • Проект не компилируется
    • Не вижу репозиторий ShootThemUp
    • Класс не отображается в Solution Explorer
    • Не работает Apply Damage
    • Где взять текстуры интерфейса
    • Нет контекстного меню UE при клике правой кнопкой мыши на файле .uproject
    • Ошибка Unable to start program
  • Вопросы и ответы
    • Зачем вступать в организацию EpicGames на Github
    • Можно ли проходить курс на UE5
    • Как перегенерировать файлы проекта
    • Насколько сильно влияет кол-во инклюдов на работу кода
    • На сколько большие могут быть структуры и таблицы
    • Медленный ли Cast
    • Что такое интерфейсы
    • Как работает код с переопределением GetMaxSpeed
    • Hit Reaction Animation
  • Дополнения к урокам
    • Лекция 065
      • Additive animation при приземлении
      • Блокировка стрельбы при беге
    • Лекция 079
      • Пикап видим после начисления патронов
      • Пикап не подбирается, если боекомплект расходуется в точке респауна пикапа
    • Лекция 089
      • NiagaraSystem не аттачится к дулу
    • Лекция 148
    • Лекция 155
  • Как задавать вопрос
  • Что почитать
  • UE5
  • Automation
    • Форматирование кода
  • VPN
  • 👨‍🎓мои курсы
    • 🧪Автоматизация и тестирование в Unreal Engine
    • 🐍Snake game
  • 🔗lifeexe сообщество
    • Поддержать проект
    • Ресурсы
    • Проекты участников сообщества
    • Code review участников сообщества
Powered by GitBook
On this page

Was this helpful?

  1. Вопросы и ответы

Hit Reaction Animation

PreviousКак работает код с переопределением GetMaxSpeedNextДополнения к урокам

Last updated 4 years ago

Was this helpful?

Я хочу найти пример где реализовано Hit Reaction Animation System, который будет отвечать за определение в какую часть тела попала пуля, взрыв и т.д и проигрывалась определенная анимация или запускалась physic animation.

Рекомендую досмотреть до . В ней мы рассматриваем как наносить различный ущерб для различных частей тела. Это первый шаг.

Чтобы получить эффект физической реакции при попадании патрона, можно включить физическую симуляцию относительно кости в скелетe и установить блендинг по кости в какое-нибудь значение (например, в 0.7 и на таймере вернуть блендинг в 0.0 ). В финальный код нашего проекта в USTUHealthComponent нужно добавить следующее (указатели не проверяю в данном коде, чтобы не усложнять):

.h файл

private:
    float CurrentHitBlend = 0.0f;
    FTimerHandle HitReactTimer;
    FName CurrentBoneName;
 
    void StartPhysReaction(const FName& BoneName, const FVector& ShotFromDirection);
    void UpdateSimulation();
    void StopCurrentBoneSimulation();

.cpp файл

void USTUHealthComponent::OnTakePointDamage(AActor* DamagedActor, float Damage, class AController* InstigatedBy, FVector HitLocation,
    class UPrimitiveComponent* FHitComponent, FName BoneName, FVector ShotFromDirection, const class UDamageType* DamageType,
    AActor* DamageCauser)
{
    const auto FinalDamage = Damage * GetPointDamageModifier(DamagedActor, BoneName);
    ApplyDamage(FinalDamage, InstigatedBy);
    StartPhysReaction(BoneName, ShotFromDirection);
}
 
void USTUHealthComponent::StartPhysReaction(const FName& BoneName, const FVector& ShotFromDirection)
{
    const auto Character = Cast<ACharacter>(GetOwner());
 
    if (!CurrentBoneName.IsNone())
    {
        StopCurrentBoneSimulation();
    }
 
    CurrentHitBlend = 0.7f;  // how much 0..1
    CurrentBoneName = BoneName;
 
    const float ImpulseMagnitude = 500.0f;
    Character->GetMesh()->SetAllBodiesBelowSimulatePhysics(CurrentBoneName, true);
    Character->GetMesh()->SetAllBodiesBelowPhysicsBlendWeight(CurrentBoneName, CurrentHitBlend);
    Character->GetMesh()->AddImpulseToAllBodiesBelow( ImpulseMagnitude * ShotFromDirection, CurrentBoneName, true);
 
    const float TimerRate = 0.003f;
    GetWorld()->GetTimerManager().ClearTimer(HitReactTimer);
    GetWorld()->GetTimerManager().SetTimer(HitReactTimer, this, &USTUHealthComponent::UpdateSimulation, TimerRate, true);
}
 
void USTUHealthComponent::UpdateSimulation()
{
    CurrentHitBlend -= 0.01f;
 
    if (CurrentHitBlend <= 0.0f)
    {
        GetWorld()->GetTimerManager().ClearTimer(HitReactTimer);
        StopCurrentBoneSimulation();
    }
    else
    {
        const auto Character = Cast<ACharacter>(GetOwner());
        Character->GetMesh()->SetAllBodiesBelowPhysicsBlendWeight(CurrentBoneName, CurrentHitBlend);
    }
}
 
void USTUHealthComponent::StopCurrentBoneSimulation()
{
    CurrentBoneName = NAME_None;
    const auto Character = Cast<ACharacter>(GetOwner());
    Character->GetMesh()->SetAllBodiesBelowSimulatePhysics(CurrentBoneName, false);
    Character->GetMesh()->SetAllBodiesBelowPhysicsBlendWeight(CurrentBoneName, 0.0f);
}

Также мешу через функцию SetCollisionEnabled или в блюпринте необходимо указать ECollisionEnabled::QueryAndPhysics

лекции 155