Unreal Engine 4 http://uengine.ru/forum/ |
|
Не работает OnOverlapBegin http://uengine.ru/forum/viewtopic.php?f=19&t=13945 |
Страница 1 из 1 |
Автор: | Riur [ 03 июл 2018, 21:31 ] |
Заголовок сообщения: | Не работает OnOverlapBegin |
Здравствуйте всем. Решил осваивать 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 что-то? Я должен где-то указать что-нибудь? |
Автор: | gary_cho [ 04 июл 2018, 13:47 ] |
Заголовок сообщения: | |
может быть потому что это не происходит ? если у тебя есть StaticMesh, то в него ничего не может проникнуть. он вытолкнет колизию.попробуй использовать у CoinMesh эвент OnHit. можешь в блюпринте вывести эти эвенты и посмотреть, будут ли они приходить. |
Автор: | Riur [ 05 июл 2018, 06:48 ] |
Заголовок сообщения: | |
Создаю Blueprint BP_Coin и наследую его от BaseCoin.cpp. В этом блюпринте добавляю Event OnActorBeginOverlap и он работает без проблем. Не пойму, почему не срабатывает для C++. |
Автор: | gary_cho [ 05 июл 2018, 09:53 ] |
Заголовок сообщения: | |
в коде движка ставь 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); } } |
Автор: | Riur [ 06 июл 2018, 06:55 ] |
Заголовок сообщения: | |
По той статье не получилось, не понял в чём проблема. Но сделал по этому видео https://youtu.be/W-vP-tCQcDY Исходники там есть в описании: https://github.com/Harrison1/unrealcpp/tree/master/DestroyActorOnOverlap Но конечно сигнатура у проверки столкновения какая-то сложноватая, думаю придётся долго разбираться и запоминать для чего нужен каждый аргумент. В первой статье было попроще. По тому видео почти всё понятно, за исключением MyCollisionSphere->SetCollisionProfileName("Trigger"); Не совсем понятно для чего оно нужно, даже с прочтением документации. Также и в первой статье говорилось о CoinMesh->SetCollisionResponseToAllChannels(ECollisionResponse::ECR_Overlap); Не пойму зачем он там был нужен. Но надеюсь разберусь по ходу изучения. Тем не менее, gary_cho, спасибо. |
Автор: | gary_cho [ 06 июл 2018, 09:03 ] |
Заголовок сообщения: | |
Если ты в блюпринте выделишь компонент( например 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"), Ты код посмотри, там к каждой функии есть описание. |
Автор: | Riur [ 06 июл 2018, 22:27 ] |
Заголовок сообщения: | |
А, вот, что это такое! Спасибо, теперь понятно стало. |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |