💭회고
오늘은 프로젝트 캐릭터 구현과 함께 팀원 분이 만들어주신 C++ 코드 리팩토링과 블루프린트 디버깅에 집중한 하루였다.
📒학습 내용
⛵ 판옥선 맵의 배 블루프린트 ― 끝없이 상승하던 이유 찾기
1️⃣ 현상
Tick 노드에서 Set Actor Location 실행 시, 배가 점점 Z+ 방향으로 밀려 올라감.
2️⃣ 재현 코드 (문제 버전)
// Tick
DeltaZ = Sin(GameTime * Speed) * Amplitude
Current = GetActorLocation
SetActorLocation(Current + (0,0,DeltaZ))
- Current 값에 증분을 계속 더해 무한 상승.
🔵 최종 블루프린트 요약
BeginPlay
→ InitialLocation = GetActorLocation
→ StartTimeline(FloatCurve)
Timeline(Update)
→ OffsetZ = CurveValue * Amplitude
→ SetActorLocation(InitialLocation + (0,0,OffsetZ))
- Tip: CurveTime을 TotalTime % CurveLength 로 래핑하면 무한 루프 구현 가능.
🐯 호랑이 기사 ― W 스킬 로직 전면 점검
🎆 나이아가라(Niagara) 이펙트 설정 및 활용법
🔗참고링크
1. NiagaraSystem 준비 및 블루프린트 설정
- 헤더 파일에 나이아가라 시스템 선언:
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = WeaponVars)
UNiagaraSystem* TracerNS;
- 블루프린트에서 TracerNS를 원하는 나이아가라 시스템으로 설정한다.
2. NiagaraComponent 생성 및 부착
- 특정 메시의 소켓에 부착하여 이펙트를 발생시킨다.
UNiagaraComponent* tempTracer = UNiagaraFunctionLibrary::SpawnSystemAttached(
TracerNS, weaponMeshComp, TEXT("Muzzle"),
FVector(0, 0, 0), FRotator(0, 0, 0),
EAttachLocation::KeepWorldPosition, true);
- weaponMeshComp의 "Muzzle" 소켓에 부착된다.
3. 나이아가라 User 파라미터 설정
- 동적으로 나이아가라의 파라미터를 설정하여 이펙트를 제어할 수 있다.
- bool 파라미터 설정 예시:
tempTracer->SetNiagaraVariableBool(FString("User.Trigger"), true);
4. Array(Vector) 파라미터 설정
- 충돌 지점의 배열을 전달하여 이펙트를 다수 지점에서 표현할 수 있다.
TArray<FVector> TraceImpactPosArr;
TraceImpactPosArr.Add(pHitResult.bBlockingHit ? pHitResult.ImpactPoint : pHitResult.TraceEnd);
UNiagaraDataInterfaceArrayFunctionLibrary::SetNiagaraArrayVector(
tempTracer, TEXT("User.ImpactPositions"), TraceImpactPosArr);
5. 위치(Position) 파라미터 설정
- 이펙트의 특정 위치를 동적으로 전달하여 더 정확한 효과를 구현한다.
tempTracer->SetNiagaraVariablePosition(
FString("User.MuzzlePostion"), weaponMeshComp->GetSocketLocation("Muzzle"));
더보기
이펙트가 타겟을 따라다니게 하려면,
UNiagaraFunctionLibrary::SpawnSystemAtLocation() 대신,
타겟의 컴포넌트(예: RootComponent)에 부착할 수 있는 SpawnSystemAttached() 함수를 사용해야 한다.
🔹 수정 전 (현재 코드)
if (TigerBleedNiagaraEffect)
{
UNiagaraFunctionLibrary::SpawnSystemAtLocation(
GetWorld(),
TigerBleedNiagaraEffect,
Target->GetActorLocation(),
Target->GetActorRotation()
);
}
🔹수정 후 (타겟에 부착하여 따라다니게)
⬇️TigerKnight의 Ultimate 함수 내에서 독(또는 출혈) 이펙트를 타겟에 부착하여 타겟을 따라다니도록 수정한 예시.
if (TigerBleedNiagaraEffect && Target)
{
// 타겟의 RootComponent에 효과를 부착합니다.
UNiagaraFunctionLibrary::SpawnSystemAttached(
TigerBleedNiagaraEffect, // 스폰할 Niagara 시스템
Target->GetRootComponent(), // 부착 대상 컴포넌트 (예: RootComponent)
NAME_None, // 소켓 이름 (필요하면 지정)
FVector::ZeroVector, // 상대적 위치 오프셋 (필요에 따라 조정)
FRotator::ZeroRotator, // 상대적 회전 오프셋 (필요에 따라 조정)
EAttachLocation::KeepRelativeOffset,// 부착 위치 규칙
true // auto destroy (효과가 끝나면 자동 삭제 여부)
);
}
- SpawnSystemAttached() 사용:
이 함수는 Niagara 시스템을 특정 컴포넌트에 부착시키므로, 부착된 컴포넌트(여기서는 타겟의 RootComponent)가 이동하면 이펙트도 함께 이동. - 부착 대상:
Target->GetRootComponent()를 사용하여 타겟 전체에 부착하지만, 만약 타겟 캐릭터의 특정 소켓(예: "EffectSocket")에 부착하고 싶다면, 해당 소켓 이름을 지정. - 오프셋 및 회전:
FVector::ZeroVector와 FRotator::ZeroRotator를 지정하면 부착 대상의 기본 위치와 회전에 따라 이펙트가 설정됩니다. 필요에 따라 원하는 오프셋으로 조정할 수 있다. - Auto Destroy:
마지막 인자인 true는 이펙트가 끝나면 자동으로 삭제되도록 하는 옵션.
🛠️ UE_LOG 매크로 깊이 파기
타겟의 값을 확인하는 디버깅 함수 ::
// .h
public:
UFUNCTION(BlueprintCallable, Category = "Debug")
void DebugPrintBuffs(APlayerCharacter* Target) const;
// .cpp
void ARatKnight::DebugPrintBuffs(APlayerCharacter* Target) const
{
if (Target)
{
if (UBuffComponent* TargetBuffComp = Target->FindComponentByClass<UBuffComponent>())
{
float MoveSpeedMult = TargetBuffComp->GetMoveSpeedMultiplier();
if (GEngine)
{
FString DebugMsg = FString::Printf(TEXT("Target %s MoveSpeed: %.2f"), *Target->GetName(), MoveSpeedMult);
GEngine->AddOnScreenDebugMessage(-1, 3.0f, FColor::Green, DebugMsg);
}
}
else
{
UE_LOG(LogTemp, Warning, TEXT("Target %s has no BuffComponent"), *Target->GetName());
}
}
else
{
UE_LOG(LogTemp, Warning, TEXT("Target is nullptr"));
}
}
자신의 값을 확인하는 디버깅 함수 ::
//.h
public:
UFUNCTION(BlueprintCallable, Category = "Debug")
void DebugPrintBuffs() const;
//.cpp
void ATigerKnight::DebugPrintBuffs() const
{
if (UBuffComponent* BuffComp = const_cast<ATigerKnight*>(this)->FindComponentByClass<UBuffComponent>())
{
float CurrentAttackMult = BuffComp->GetAttackMultiplier();
float CurrentMoveSpeedMult = BuffComp->GetMoveSpeedMultiplier();
if (GEngine)
{
FString DebugMsg = FString::Printf(TEXT("Attack: %.2f, MoveSpeed: %.2f"), CurrentAttackMult, CurrentMoveSpeedMult);
GEngine->AddOnScreenDebugMessage(-1, 3.0f, FColor::Blue, DebugMsg);
}
}
else
{
UE_LOG(LogTemp, Warning, TEXT("BuffComponent not found on %s"), *GetName());
}
}
'Dev. > UE 언리얼 엔진' 카테고리의 다른 글
[TIL_250421] UE5 AI 시스템 : Behavior Tree ~ Navigation Invoker (1) | 2025.04.21 |
---|---|
[TIL_250417] 액터 이동 블루프린트 로직 (0) | 2025.04.17 |
[TIL_250410] 프로젝트 진행 상황 정리 (0) | 2025.04.10 |
캐릭터 스킬, 스텟 로직 컴포넌트 구조로 만들기 (응용) (0) | 2025.04.09 |
[ActorComponent] 캐릭터 스킬, 스텟 로직 컴포넌트 구조로 만들기 (0) | 2025.04.08 |