본문 바로가기

프로젝트 231121

언리얼 유용한 함수들

1. 게임모드 함수 얻기

GetAuthGameMode() 사용

AMyShootingGameModeBase* myMode = Cast<AMyShootingGameModeBase>(GetWorld()->GetAuthGamemode())
2-1. 월드에서 특정한 객체를 찾는 방법

 UGameplayStatics::GetActorOfClass()

AActor* target = UGameplayStatics::GetActorOfClass(GetWorld(), APlayerFlight::StaticClass());
2-2. 월드에서 특정한 객체를 찾는 방법

for (TActorIterator<AEnemySpawningPool> pool(GetWorld()); pool; ++pool) { 구현 }

iterator를 통해 액터를 찾는다. 

#include "EngineUtils.h"

for (TActorIterator<AEnemySpawningPool> pool(GetWorld()); pool; ++pool) {
    pool->SetSpawn();
}


2-3 월드에서 존재하는 특정 모든 클래스 찾기

UGameplayStatics::GetAllActorsOfClass

UPROPERTY()
TArray<AActor*> waypoints;

// 레벨에 존재하는 WayPoints을 다 가져와서 내 목록에 다 저장하자.
UGameplayStatics::GetAllActorsOfClass(GetWorld(), AWayPoint::StaticClass(), waypoints);




3. TimeManager

GetWorld()->GetTimerManager().SetTimer()

&ABullet::함수명 

단 파라미터나 반환 자료형이 존재하는 함수는 사용하지 못한다.

FTimeHandle lifeTimer;
GetWorld()->GetTimerManager().SetTimer(lifeTimer, this, &ABullet::DestroyMySelf, 2.0f, false);
시간 초기화

GetWorld()->GetTimerManager().ClearTimer(fireTimerHandle);

FTimerHandle fireTimerHandle를 전역변수로 선언한 다음 새로 Timer를 작동시켜야 하는 곳에서 초기화를 진행한다. 

void ATPSPlayer::OnActionFirePressed()
{
GetWorld()->GetTimerManager().SetTimer(fireTimerHandle, this, &ATPSPlayer::DoFire, fireInterval,true);
}

void ATPSPlayer::OnActionFireReleased()
{
    // 시간 초기화
GetWorld()->GetTimerManager().ClearTimer(fireTimerHandle);
}


4. ActorSpawn , 액터 생성시키기

GetWorld()->SpawnActor<A생성시킬클래스>(선언한블루프린트변수,위치,방향);

GetWorld()->SpawnActor<ABossActor>(bossActor, FVector(0, 0, 700), FRotator::ZeroRotator);
5-1. Player 캐릭터 얻기

UGameplayStatics::GetPlayerController(GetWorld(), 0)

APlayerCharacter* player = Cast<APlayerCharacter>(UGameplayStatics::GetPlayerController(GetWorld(), 0));
5-2. Player 캐릭터 얻기

GetWorld()->GetFirstPlayerController()

APlayerController* player = GetWorld()->GetFirstPlayerController();


5-3 Player 캐릭터 얻기

UGameplayStatics::GetPlayerPawn(GetWorld(), 0)

// 1. 플레이어를 찾고 싶다.
target = Cast<ATPSPlayer>(UGameplayStatics::GetPlayerPawn(GetWorld(), 0));
5-4 Controller 얻기

auto controller = Cast<APlayerController>(GetController());


5-5 Player얻기

GetOwningPlayer()

Widget클래스에서 사용하는 플레이어 얻기

#include "MainWidget.h"
#include "Components/TextBlock.h"
#include "../NetworkProjectCharacter.h"

void UMainWidget::NativeConstruct()
{
Super::NativeConstruct();

player = Cast<ANetworkProjectCharacter>(GetOwningPlayerPawn());


}


6. 스켈레탈 데이터 메쉬 로드

ConstructorHelpers::FObjectFinder<USkeletalMesh> TempGunMesh(TEXT());

ConstructorHelpers::FObjectFinder<USkeletalMesh> TempGunMesh(TEXT("/Script/Engine.SkeletalMesh'/Game/MyResources/FPWeapon/Mesh/SK_FPGun.SK_FPGun'"));


7. 특정 주변 반경 충돌체 검사

Ex : 수류탄 

GetWorld()->OverlapMultiByObjectType();

void APlayerFlight::CheckEnemies()
{
UE_LOG(LogTemp, Warning, TEXT("UTL"));
// 반경 5m 이내에 있는 모든 AEnemy 액터들을 감지한다.
// 감지된 Enemy들의 정보를 담을 변수의 배열
TArray<FOverlapResult> enemiesInfo;

FVector centerLoc = GetActorLocation() + GetActorUpVector() * 700;

FQuat centerRot = GetActorRotation().Quaternion();

FCollisionObjectQueryParams params = ECC_GameTraceChannel2;

FCollisionShape checkShape = FCollisionShape::MakeSphere(500);

GetWorld()->OverlapMultiByObjectType(enemiesInfo, centerLoc, centerRot, params, checkShape);
UE_LOG(LogTemp, Warning, TEXT("%d"), enemiesInfo.Num());

// 체크된 모든 에너미의 이름을 출력한다.
for (FOverlapResult enemyinfo : enemiesInfo) {
// 충돌 체크를 위한 출력
UE_LOG(LogTemp, Warning, TEXT("Hited : %s"), *enemyinfo.GetActor()->GetName());

enemyinfo.GetActor()->Destroy();
}

// 마지막 파라미터에 입력하는 segments의 수에 따라 원이 부드러워지거나 각지게된다. (변의 개수)
DrawDebugSphere(GetWorld(),centerLoc, 500,20,FColor::Yellow, false, 2);


}


8. DrawDebug

Debug를 위한 방법

#include "DrawDebugHelpers.h"

// 마지막 파라미터에 입력하는 segments의 수에 따라 원이 부드러워지거나 각지게된다. (변의 개수)
DrawDebugSphere(GetWorld(),centerLoc, 500,20,FColor::Yellow, false, 2);


9. 생성자에서 Assets 적용법

ConstructorHelpers : 생성자에서만 사용가능한 함수

FObjectFinder : 모델링 파일을 불러오기 위해 사용

FClassFinder : 블루프린트를 읽을 때

// tempMesh 전까지는 자료형 tempMesh는 변수명일뿐이다.
ConstructorHelpers::FObjectFinder<USkeletalMesh> tempMesh (TEXT("/Script/Engine.SkeletalMesh'/Game/Characters/Mannequins/Meshes/SKM_Quinn.SKM_Quinn'"));

// Null 체크
if (tempMesh.Succeeded()) {
        GetMesh()->SetSkeletalMesh(tempMesh.Object);
}


10. Animation Tick 함수

Event Blueprint Update Animation 노드 == NativeUpdateAnimation()

virtual void NativeUpdateAnimation(float DeltaSeconds) override;
11. 내적

FVector::DotProduct()

float result = FVector::DotProduct(FVector A, FVector B);
11- 1 내적을 통한 플레이어 캐릭터 전후방 스칼라 구하기

애니메이션을 조작하기 위해서는 전 후방 벡터의 스칼라값을 알아야한다. 내적을 통해 뒤로 갈때 - , 앞으로갈때는 + , 음수 양수 스칼라값을 구할 수 있다.

if (player) {
FVector velocity = player->GetVelocity();

FVector forwardVector = player->GetActorForwardVector();

speed = FVector::DotProduct(forwardVector, velocity);
}


12. ActorComponent를 소유한 클래스 검색(has a 관계)

ActorComponent뿐만이 아닌 Has a 관계에 대해 주어 클래스 반환받기

// me를 찾아주자.
class AEnemy*me = Cast<AEnemy>(GetOwner());




13. 거리구하기

다른 액터와의 거리를 float으로 구하고 싶을때..

 target->GetDistanceTo(me)

float dist = FVector::Dist(target->GetActorLocation(), me->GetActorLocation());

float dist = target->GetDistanceTo(me);
float dist = FVector::Dist(target->GetActorLocation(), me->GetActorLocation());


14. 소리재생

FireSound 자료형의 경우 USoundBase* 이다.

UPROPERTY(EditDefaultsOnly, Category = PlayerSettings)
class USoundBase* fireSoundFactory;
UGameplayStatics::PlaySoundAtLocation(GetWorld(),fireSound, GetActorLocation());




15. ConstructHelper

생성자에서 파일 Path 설정

블루프린트를 삭제했다가 다시 생성해도 파일 경로가 바뀌지 않는한 계속 적용된다.

ConstructorHelpers::FObjectFinder<USoundBase>tempFireSound(TEXT("/Script/Engine.SoundWave'/Game/SniperGun/Rifle.Rifle'"));
if (tempFireSound.Succeeded()) {
fireSound = tempFireSound.Object;
}


16. Camera 얻기

// 카메라를 흔들고 싶다.
APlayerCameraManager* cameraManager  = UGameplayStatics::GetPlayerCameraManager(GetWorld(), 0);

cameraManager->StartCameraShake(camShakeFactory);


17. DeltaSeconds 얻기

GetWorld()->DeltaTimeSeconds;

Tick이 아닌곳에서 DeltaTime을 사용해야할때

currentTime += GetWorld()->DeltaTimeSeconds;




18. Player 방향 바라보기

UKismetMathLibrary::FindLookAtRotation

FRotator LookRot = UKismetMathLibrary::FindLookAtRotation(this->GetActorLocation(), player->GetActorLocation());
SetActorRotation(LookRot);




19. 나이아가라를 이용한 선그리기

UNiagaraDataInterfaceArrayFunctionLibrary::SetNiagaraArrayVector(나이아가라컴포넌트, 나이아가라시스템에 존재하는 유저 파라미터, 저장된 배열)

// 나이아가라를 이용해 선그리기
if (TeleportCurveComp) {
UNiagaraDataInterfaceArrayFunctionLibrary::SetNiagaraArrayVector(TeleportCurveComp, FName("User.PointArray"), LinePoints);
}


20. Socket을 통한 발사

void AEnemy::GunFire()
{
UE_LOG(LogTemp, Warning, TEXT("Enemy Fire"));

if (GetEnemyWeapon() == EEnemyWeapon::Gun) {
FTransform socketTrans = GunMesh->GetSocketTransform(TEXT("FireSocket"));
FVector fireLoc = socketTrans.GetLocation();
FRotator fireRot = socketTrans.GetRotation().Rotator();
FTransform fireTrans = UKismetMathLibrary::MakeTransform(fireLoc,fireRot);
GetWorld()->SpawnActor<AActor>(bulletFactory, fireTrans);
}
}




21. 서버액터

블루프린트 Details 패널에서  Replication 설정을 해줬다면



// Called when the game starts or when spawned
void AOwnershipActor::BeginPlay()
{
Super::BeginPlay();

// 만일 서버 액터라면..
// GetLocalRole()== ROLE_Authority or HasAuthority() 사용
if(HasAuthority())
{
// 랜덤한 방향을 설정한다.
moveDirection = FMath::VRand();
moveDirection.Z = FMath::Abs(moveDirection.Z);
}

}




22. 로그출력

GEngine->AddOnScreenDebugMessage(-1,3,FColor::Green, FString("Query Fire!"), true, FVector2d(1.2f));


23. AnimClass에서 owner가져오기

TryGetPawnOwner

현재 AnimInstance의 클래스를 가지고 있는 Pawn 클래스를 가져온다.

auto pawn = TryGetPawnOwner();


24. Health Bar Setting

Setpercent()

float calcHP = (float)player->GetHealth()/(float)player->maxHP;
pb_HP->SetPercent(calcHP);


25. 플레이어의 AnimInstance 가져오기

GetMesh()->GetAnimInstance()

playerAnim = Cast<UPlayerAnimInstance>(GetMesh()->GetAnimInstance());


26. 플레이어가 죽었을때 해야할 처리

GetCharacterMovement()->DisableMovement() : 움직임 막기

FollowCamera->PostProcessSettings.ColorSaturation = FVector4(0,0,0,1) : 화면 흑백으로 만들기

bIsDead = true;
GetCharacterMovement()->DisableMovement();
GetMesh()->SetCollisionEnabled(ECollisionEnabled::NoCollision);
GetCapsuleComponent()->SetCollisionEnabled(ECollisionEnabled::NoCollision);
bUseControllerRotationYaw = false;
FollowCamera->PostProcessSettings.ColorSaturation = FVector4(0,0,0,1);




27. 네트워크에서 내가 조작하는 플레이어만 동작하게 만들기.

GetController()

GetController()->IsLocalController()

// 내가 조작하는 캐릭터
if(GetController() != nullptr && GetController()->IsLocalController())
{
ServerSetName(gameInstance->sessionID.ToString());
}




28. 컴포넌트 부착 Component Attach

AttachToComponent()

player의 mesh에 존재하는 Socket에 부착하는 코드

FAttachmentTransformRules::SnapToTargetNotIncludingScale

플레이어의 소켓의 위치에는 여향을 받지만 Scale은 영향받지 않겠다는 뜻.

AttachToComponent(player->GetMesh(),FAttachmentTransformRules::SnapToTargetNotIncludingScale, FName("WeaponSocket"));
DetachFromActor

DetachFromActor(FDetachmentTransformRules::KeepWorldTransform);






29. 나이아가라 시스템 Niagarasystem

나이아가람 시스템 재생하기

#include "NiagaraFunctionLibrary.h"

void AHealthItem::Destroyed()
{
if(NiagraDestroyComp)
{
UNiagaraFunctionLibrary::SpawnSystemAtLocation(GetWorld(),NiagraDestroyComp,GetActorLocation());
}
}




30. 나이아가라 시스템 소켓 재생하기 (Niagara socek, 나이아가라 소켓)

SpawnSystemAttached

UNiagaraFunctionLibrary::SpawnSystemAttached(muzzleFlash,MeshComponent,FName("MuzzleFlash"),MeshComponent->GetSocketLocation(FName("MuzzleFlash")),MeshComponent->GetSocketRotation(FName("MuzzleFlash")),EAttachLocation::KeepWorldPosition,true);

[출처] 함수정리|작성자 audtjrauddn