-
240320 언리얼엔진5 트리거박스 C++코딩기록 2024. 3. 20. 18:22
트리거 박스는 overlap이 가능하게 설정하였다.
해당 액터에 테스트용 박스를 추가하여 사용하였다.
해당 소스 코드
// ARasorTriggerBox.h // Fill out your copyright notice in the Description page of Project Settings. #pragma once #include "CoreMinimal.h" #include "GameFramework/Actor.h" #include "Components/BoxComponent.h" #include "RasorTriggerBox.generated.h" UCLASS() class UE5_ITT_API ARasorTriggerBox : public AActor { GENERATED_BODY() public: // Sets default values for this actor's properties ARasorTriggerBox(); protected: // Called when the game starts or when spawned virtual void BeginPlay() override; public: // Called every frame virtual void Tick(float DeltaTime) override; UPROPERTY(VisibleAnywhere) UBoxComponent* TriggerVolume; UFUNCTION() void OnOverlapBegin(class UPrimitiveComponent* OverlappedComp, class AActor* OtherActor, class UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult); UFUNCTION() void OnOverlapEnd(class UPrimitiveComponent* OverlappedComp, class AActor* OtherActor, class UPrimitiveComponent* OtherComp, int32 OtherBodyIndex); UPROPERTY(EditAnywhere) FVector DestFar = FVector(0, 0, 0); FVector StartPos = FVector(1, 1, 1); FVector DestPos = FVector(0, 0, 0); float UnitTime = 0.0f; bool bIsTouch = false; };
// RasorTriggerBox.cpp // Fill out your copyright notice in the Description page of Project Settings. #include "RasorTriggerBox.h" // Sets default values ARasorTriggerBox::ARasorTriggerBox() { // 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; // Create trigger volume TriggerVolume = CreateDefaultSubobject<UBoxComponent>(TEXT("TriggerVolume")); RootComponent = TriggerVolume; // Set collision profile and size TriggerVolume->SetCollisionProfileName("Trigger"); TriggerVolume->SetBoxExtent(FVector(50.0f, 50.0f, 50.0f)); // Bind overlap events TriggerVolume->OnComponentBeginOverlap.AddDynamic(this, &ARasorTriggerBox::OnOverlapBegin); TriggerVolume->OnComponentEndOverlap.AddDynamic(this, &ARasorTriggerBox::OnOverlapEnd); } // Called when the game starts or when spawned void ARasorTriggerBox::BeginPlay() { Super::BeginPlay(); StartPos = GetActorLocation(); DestPos = StartPos + DestFar; UnitTime = 0.0f; bIsTouch = false; } // Called every frame void ARasorTriggerBox::Tick(float DeltaTime) { Super::Tick(DeltaTime); if (true == bIsTouch) { //print("Overlap Begin"); UnitTime += DeltaTime * 0.5f; } else { UnitTime -= DeltaTime * 0.5f; //print("Overlap Ended"); } if (UnitTime < 0) { UnitTime = 0.0f; } else if (UnitTime > 1.0f) { UnitTime = 1.0f; } FVector NextPos = FMath::Lerp(StartPos, DestPos, UnitTime); SetActorLocation(NextPos); } void ARasorTriggerBox::OnOverlapBegin(class UPrimitiveComponent* OverlappedComp, class AActor* OtherActor, class UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult) { // Code to execute when overlap starts if (OtherActor && (OtherActor != this)) { UE_LOG(LogTemp, Warning, TEXT("Overlap started with actor: %s"), *OtherActor->GetName()); // print to screen using above defined method when actor enters trigger box //print("Overlap Begin"); //printFString("Overlapped Actor = %s", *OtherActor->GetName()); bIsTouch = true; } } void ARasorTriggerBox::OnOverlapEnd(class UPrimitiveComponent* OverlappedComp, class AActor* OtherActor, class UPrimitiveComponent* OtherComp, int32 OtherBodyIndex) { // Code to execute when overlap ends if (OtherActor && (OtherActor != this)) { UE_LOG(LogTemp, Warning, TEXT("Overlap ended with actor: %s"), *OtherComp->GetName()); // print to screen using above defined method when actor leaves trigger box //print("Overlap Ended"); //printFString("%s has left the Trigger Box", *OtherComp->GetName()); bIsTouch = false; } }
'기록' 카테고리의 다른 글
240401 umg 리플리케이트 (0) 2024.04.01 240328 UE5 Replicate 적용 문제 (0) 2024.03.28 240203 BSP 랜덤맵 통로 생성 (0) 2024.02.03 240201 BSP 알고리즘을 이용한 랜덤맵 생성 (1) 2024.02.02 240113 [IOCP] thread 작동 방식 이해하기 (0) 2024.01.13