К основному контенту

Обработка событий Unreal Engine через виртуальные функции.

Пример взят из книги "Unreal Engine scripting with C++ Cookbook".

Некоторые классы Actor и Component поддерживают обработчики событий в виде виртуальных функций. Здесь будет показано как реализовать собственный обработчик события столкновения.

Как это сделать...

  1. Создать в редакторе Unreal Engine пустой С++ класс Actor и назвать его MyTriggerVolume.
  2. Добавить в заголовочный файл этого класса следующий код:
    UPROPERTY()
    UBoxComponent* TriggerZone;
    UFUNCTION()
    virtual void NotifyActorBeginOverlap(AActor* OtherActor) override;
    UFUNCTION()
    virtual void NotifyActorEndOverlap(AActor* OtherActor) override;
    
  3. А в файл cpp реализацию функций:
    void AMyTriggerVolume::NotifyActorBeginOverlap(AActor * OtherActor)
    {
        GEngine->AddOnScreenDebugMessage(-1, 1, FColor::Red, FString::Printf(TEXT("%s entered me"), *(OtherActor->GetName())));
    }
    
    void AMyTriggerVolume::NotifyActorEndOverlap(AActor * OtherActor)
    {
        GEngine->AddOnScreenDebugMessage(-1, 1, FColor::Red, FString::Printf(TEXT("%s left me"), *(OtherActor->GetName())));
    }
    
  4. В конструктор класса надо добавить создание компоненты коллизии:
    TriggerZone = CreateDefaultSubobject<UBoxComponent>("BoxComponent");
    RootComponent = TriggerZone;
    
  5. Скомпилировать и разместить MyTriggerActor на уровне.

Как это работает...

  1. Прежде всего был добавлен UPROPERTY, чтобы сборщик мусора не уничтожил ссылку на компонент. Затем было объявлено две функции UFUNCTION. Эти две функции являются реализацией виртуальных функций из родительского класса AActor. Это события, которые срабатывают во время пересечения коллизии объекта.
  2. В реализации используется FString::printf, чтобы создать одну строку из заданного текста и данных из параметра, т.е. имя объекта, который пересек коллизию.
  3. OtherActor->GetName() возвращает ссылку на строку с именем объекта и перед тем как его использовать в FString::Format, его необходимо разыменовывать через (*). 
  4. После того как строка готова, она передается в глобальную функцию движка для вывода на экран в виде сообщения.
  5. Первый параметр AddOnScreenDebugMessage() говорит движку, что можно дублировать строки, второй параметр указывает сколько времени должно сообщение оставаться на экране. Третий - это цвет, а четвертый сама строка.
  6. Теперь при пересечении компоненты актера чем-либо, происходит UpdateOverlaps, который вызывает NotifyActorBeginOverlap и соответственно мою реализацию этой виртуальной функции.

Комментарии

Популярные сообщения из этого блога

Привет миру из Unreal Engine 4 на C++. Часть 2.

В прошлой части был создан класс актера для представления в игровом мире шара и надписи, в него добавлены  компоненты коллизии и меша. В этой части к классу актера будет добавлены компонент с эффектом огня и компонент для вывода текста. Также будут реализован делегат и события, чтобы добавить интерактивности огненному шару. А для того, чтобы шар выглядел как металлический, ему будет назначен соответствующий материал. Все эти шаги будет проделаны на С++. Добавление компонента с эффектом огня  UParticleSystemComponent . Добавления этого компонента происходит подобно  UStaticMeshComponent . Запишу в конструктор моего объекта следующий код: // Create the fire particle system UParticleSystemComponent* FireParticles = CreateDefaultSubobject<UParticleSystemComponent>(TEXT("FireParticles")); FireParticles->SetupAttachment(SphereVisual); FireParticles->bAutoActivate = true; // Assign fire particle system to component ConstructorHelpers::FObjectFinder<UPartic...

Blueprints и C++. Часть 3.

После того как в прошлых частях , с помощью языка программирования С++, был создан класс актера с задуманным внешним видом и функционалом, настала пора разобраться как его использовать в блупринтах Unreal Engine 4. Создам класс блупринта, который будет расширять мой ранее созданный С++ класс. Назову его  BrokenBP . Так как я не добавлял никакие функции или свойства, через которые в блупритах можно было бы изменять объект, то доступ к настройкам закрыть. Зато в панели компонентов есть список всех добавленных в С++ компонентов. Они с пометкой ( Inherited ), что означает, что они были созданы в С++, а не добавлены через редактор в движке. В целом лучше и быстрее будет создавать указатели на компоненты в классе С++, и назначать их в редакторе или блупринтах. Т.е. не искать меш по строке в конструкторе класса, а выбрать его вручную в редакторе из специального списка. Но весь проект был создан только на С++ для того чтобы научиться работать с игровым движком через код. ...