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. Вопросы и ответы

Как работает код с переопределением GetMaxSpeed

Я не понимаю, как в вашей реализации получается, что мы переписываем геттер GetMaxSpeed(), который просто возвращает значение и при этом в игре меняется MaxWalkSpeed. Мы даже не вызываем этот геттер в своих классах. Я так подозреваю, что наш новый GetMaxSpeed() используется где-то в AddMovementInput(), но подтверждения я в референсах не нашёл. Не могли бы вы внести ясность?

AddMovementInput устанавливает вектор направления в компоненте движения (если он существует):

void APawn::AddMovementInput(FVector WorldDirection, float ScaleValue, bool bForce /*=false*/)
{
    UPawnMovementComponent* MovementComponent = GetMovementComponent();
    if (MovementComponent)
    {
        MovementComponent->AddInputVector(WorldDirection * ScaleValue, bForce);
    }
    else
    {
        Internal_AddMovementInput(WorldDirection * ScaleValue, bForce);
    }
}

Сам компонент отвечает за то, как положение персонажа будет изменяться в зависимости от разных параметров и условий.

Функция GetMaxSpeed используется во многиx функциях внутри компонента. Например, в CalcVelocity (код не полный, функция большая, понимать код не обязательно, это детали реализации):

void UCharacterMovementComponent::CalcVelocity(float DeltaTime, float Friction, bool bFluid, float BrakingDeceleration)
{
   // Do not update velocity when using root motion or when SimulatedProxy and not simulating root motion - SimulatedProxy are repped their Velocity
   if (!HasValidData() || HasAnimRootMotion() || DeltaTime < MIN_TICK_TIME || (CharacterOwner && CharacterOwner->GetLocalRole() == ROLE_SimulatedProxy && !bWasSimulatingRootMotion))
   {
       return;
   }
 
   Friction = FMath::Max(0.f, Friction);
   const float MaxAccel = GetMaxAcceleration();
   float MaxSpeed = GetMaxSpeed();
	
   // Check if path following requested movement
   bool bZeroRequestedAcceleration = true;
   FVector RequestedAcceleration = FVector::ZeroVector;
   float RequestedSpeed = 0.0f;
   if (ApplyRequestedMove(DeltaTime, MaxAccel, MaxSpeed, Friction, BrakingDeceleration, RequestedAcceleration, RequestedSpeed))
   {
       bZeroRequestedAcceleration = false;
    }
...
}

Таким образом, переопределяя данную функцию, мы изменяем максимальную скорость персонажа.

Более того, сама функция имеет вид:

float UCharacterMovementComponent::GetMaxSpeed() const
{
   switch(MovementMode)
   {
    case MOVE_Walking:
    case MOVE_NavWalking:
        return IsCrouching() ? MaxWalkSpeedCrouched : MaxWalkSpeed;
    case MOVE_Falling:
        return MaxWalkSpeed;
    case MOVE_Swimming:
        return MaxSwimSpeed;
    case MOVE_Flying:
        return MaxFlySpeed;
    case MOVE_Custom:
        return MaxCustomMovementSpeed;
    case MOVE_None:
    default:
        return 0.f;
    }
}

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

PreviousЧто такое интерфейсыNextHit Reaction Animation

Last updated 3 years ago

Was this helpful?