Полезное

Мы Вконтакте

Discord канал

#
Аватара пользователя
Пользователь
Сообщения: 4
Здравствуйте всем.

Решил осваивать C++ в Unreal, но застрял на мелочи.
Подскажите пожалуйста, что я делаю не так?
Делаю вот по этой статье https://habr.com/post/348600/

Функция OnOverlap никаким образом не выполняется.
Сейчас уже пытаюсь просто вывести лог, без какого-либо удаления.

Вот что имею в BaseCoin.h:
Код:
public:
    UPROPERTY(VisibleAnywhere, BlueprintReadOnly)
    USceneComponent* Root;
 
    UPROPERTY(VisibleAnywhere, BlueprintReadOnly)
    UStaticMeshComponent* CoinMesh;
 
    UFUNCTION()
    void OnOverlap(AActor* OverlappedActor, AActor* OtherActor);


А это в BaseCoin.cpp:
Код:
ABaseCoin::ABaseCoin()
{
    // Set this actor to call Tick() every frame.  You can turn this off to improve performance if you don't need it.
   PrimaryActorTick.bCanEverTick = true;

   Root = CreateDefaultSubobject<USceneComponent>("Root");
   RootComponent = Root;
   CoinMesh = CreateDefaultSubobject<UStaticMeshComponent>("CoinMesh");
   CoinMesh->SetupAttachment(Root);
   CoinMesh->SetCollisionResponseToAllChannels(ECollisionResponse::ECR_Overlap);
   RotationRate = 100;
   OnActorBeginOverlap.AddDynamic(this, &ABaseCoin::OnOverlap);
}

void ABaseCoin::OnOverlap(AActor* OverlappedActor, AActor* OtherActor)
{
   UE_LOG(LogTemp, Warning, TEXT("Overlap!"));
}


bGenerateOverlapEvents стоит true у CoinMesh в самом редакторе.
У мешей сетки коллизий есть, но правда не пойму, нужны ли они, в статье про это нету ничего вроде.

Я уже перепробовал разные комбинации, не пойму, что не так может быть.

И вот ещё не совсем понимаю, что за функция SetCollisionResponseToAllChannels(ECollisionResponse::ECR_Overlap)?
Может быть в этом ECR_Overlap что-то? Я должен где-то указать что-нибудь?
Аватара пользователя
Пользователь
Сообщения: 195
может быть потому что это не происходит ? если у тебя есть StaticMesh, то в него ничего не может проникнуть. он вытолкнет колизию.попробуй использовать у CoinMesh эвент OnHit. можешь в блюпринте вывести эти эвенты и посмотреть, будут ли они приходить.
Аватара пользователя
Пользователь
Сообщения: 4
Создаю Blueprint BP_Coin и наследую его от BaseCoin.cpp.
В этом блюпринте добавляю Event OnActorBeginOverlap и он работает без проблем.
Не пойму, почему не срабатывает для C++.
Аватара пользователя
Пользователь
Сообщения: 195
в коде движка ставь breakpoint и смотри почему не вызывается. Код вызыва делегата в одном места PrimitiveComponent.cpp(2352)

Код:
// then execute actor notification if this is a new actor touch
if (bNotifyActorTouch)
{
    // First actor virtuals
    if (IsActorValidToNotify(MyActor))
    {
        MyActor->NotifyActorBeginOverlap(OtherActor);
    }

    if (IsActorValidToNotify(OtherActor))
    {
        OtherActor->NotifyActorBeginOverlap(MyActor);
    }
    // Then level-script delegates
    if (IsActorValidToNotify(MyActor))
    {
        MyActor->OnActorBeginOverlap.Broadcast(MyActor, OtherActor);
    }

    if (IsActorValidToNotify(OtherActor))
    {
   OtherActor->OnActorBeginOverlap.Broadcast(OtherActor, MyActor);
    }
}
Аватара пользователя
Пользователь
Сообщения: 4
По той статье не получилось, не понял в чём проблема.
Но сделал по этому видео https://youtu.be/W-vP-tCQcDY
Исходники там есть в описании: https://github.com/Harrison1/unrealcpp/tree/master/DestroyActorOnOverlap
Но конечно сигнатура у проверки столкновения какая-то сложноватая, думаю придётся долго разбираться и запоминать для чего нужен каждый аргумент. В первой статье было попроще.

По тому видео почти всё понятно, за исключением MyCollisionSphere->SetCollisionProfileName("Trigger");
Не совсем понятно для чего оно нужно, даже с прочтением документации.
Также и в первой статье говорилось о CoinMesh->SetCollisionResponseToAllChannels(ECollisionResponse::ECR_Overlap);
Не пойму зачем он там был нужен.
Но надеюсь разберусь по ходу изучения.

Тем не менее, gary_cho, спасибо.
Аватара пользователя
Пользователь
Сообщения: 195
Если ты в блюпринте выделишь компонент( например StaticMesh ) во вкледке Collision->Collision Presets можно выбирать разные настройки коллизий, в том числе Trigger. Это настройки по каналам коллизий. Тока в коде это делается так:
MyCollisionSphere->SetCollisionProfileName("Trigger");
Переключение каналов делается функциями:
CoinMesh->SetCollisionResponseToAllChannels(ECollisionResponse::ECR_Overlap);
ECR_Ignore UMETA(DisplayName="Ignore"),
ECR_Overlap UMETA(DisplayName="Overlap"),
ECR_Block UMETA(DisplayName="Block"),

Ты код посмотри, там к каждой функии есть описание.
Аватара пользователя
Пользователь
Сообщения: 4
А, вот, что это такое! Спасибо, теперь понятно стало.


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

UEngine.ru © 2017
Все права защищены. При копировании материалов с сайта, ссылка на первоисточник обязательна.
Яндекс.Метрика
Главная страница