본문 바로가기

Unreal Engine 4/C++

<Unreal C++> 12 - DrawDebug

 

필요한 개념


컴파일될 때 해당 매크로가 소속되어 있는 정보를 나타남
__FUNCTION__ : 함수 이름(현재 실행중인 함수명이 나타남)
__FILE__ : 파일의 경로(현재 소스의 파일명을 나타냄)
__LINE__ : 해당 라인(현재 소스가 실행중인 라인 나타냄)
CLog::Log(__FUNCTION__, __LINE__);


출력 로그를 보면
GameProject: Display: 10
GameProject: Display: 3.141593
GameProject: Display: Unreal GamePlay
GameProject: Display: X=990.000 Y=-1680.000 Z=50.000
GameProject: Display: P=0.000000 Y=39.999985 R=0.000000
GameProject: Display: BP_C01_Log_2Not Null
GameProject: Display: AC01_Log::BeginPlay, 37
잘 나옴

라이트 같은 것도 켜졌다 꺼졌다 하는 것도 Sin,Cos 이용

DrawDebug
- DrawDebugBox
- DrawDebugSolidBox
- DrawDebugPoint
- DrawDebugSphere
- DrawDebugCircle
- DrawDebugLine
- DrawDebugDirectionalArrow

 

 

 

 

 

C02_DrawDebug.h


더보기
// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "C02_DrawDebug.generated.h"

UCLASS()
class UONLINE_03_CPP_API AC02_DrawDebug : public AActor
{
	GENERATED_BODY()
	
private:
	UPROPERTY(EditAnywhere, Category = "DrawDebug")
		FVector InitLocation[5];

	UPROPERTY(EditAnywhere, Category = "DrawDebug")
		FBox Box;

	UPROPERTY(EditAnywhere, Category = "DrawDebug")
		FTransform Transform;

public:
	AC02_DrawDebug();

protected:
	virtual void BeginPlay() override;

public:
	virtual void Tick(float DeltaTime) override;

private:
	FVector Location[5];

};

 

 

 

 

 

 

 

C02_DrawDebug.cpp


더보기
#include "C02_DrawDebug.h"
#include "Global.h"

AC02_DrawDebug::AC02_DrawDebug()
{
	PrimaryActorTick.bCanEverTick = true;
	
	// FVector::ZeroVector가 FVector(0, 0, 0)와 같다.
	// 배치하는 기준으로 옮길려고(보기 편하게)
	InitLocation[0] = FVector::ZeroVector;
	InitLocation[1] = FVector(0, 1000, 0);
	InitLocation[2] = FVector(0, 400, 0);
	InitLocation[3] = FVector(0, 1600, 0);
	InitLocation[4] = FVector(300, 1000, 0);
	
	// FBox 맨 앞의 왼쪽 하단과 맨 뒤의 우측 상단의 크기를 지정해 박스를 정의
	// 맨 아래 지점, 맨 뒷지점
	// 밑의 경우는 크기가 앞으로 100이고 양옆으로 200이고 위, 아래로 100이됨
	Box = FBox(FVector(-50, -100, -50), FVector(50, 100, 50));
	Transform.SetLocation(FVector(200, 1600, 0));
}

void AC02_DrawDebug::BeginPlay()
{
	Super::BeginPlay();
	
	// 현재 위치에서 그 만큼 이동
	for (int32 i = 0; i < 5; i++)
		Location[i] = InitLocation[i] + GetActorLocation();
	
	// BP와 동일
	// 어느 월드에다 그릴지, 중심점 만큼 이동하란 얘기, 부피를 넣어줌, 빨간색으로그림, 유지 상태로 그림(BeginPlay에서 퍼시스턴트, BeginPlay에서는 유지성을 위해서 켜줘야함, Tick에서는 꺼줌)
	//DrawDebugBox(GetWorld(), Location[0] + Box.GetCenter(), Box.GetExtent(), FColor::Red, true);
}

void AC02_DrawDebug::Tick(float DeltaTime)
{
	Super::Tick(DeltaTime);

	// 틱에다가 그려야 이동한 위치 반영이 된다. Debug 객체도 같이 움직일 것이다.
	for (int32 i = 0; i < 5; i++)
		Location[i] = InitLocation[i] + GetActorLocation();

	// 꽉찬 박스 생성
	// 퍼시스턴트는 false를 줘서 유지시키지 않음(tick이니깐)
	// GetExtent() : 부피
	// Tick에 두면 매 프레임마다 그려짐
	DrawDebugSolidBox(GetWorld(), Location[0] + Box.GetCenter(), Box.GetExtent(), FColor::Red);

	// 사각형 점
	// 3 : 점의 크기
	DrawDebugPoint(GetWorld(), Location[1], 100, FColor::Red);

	// Sphere
	// 3 : 크기
	// 4 : 얼마만큼 선을 동원해서 정교하게 그릴지(Slice와 동일) -> 정밀도
	// 정밀도를 떨어트리면 각져 보임
	DrawDebugSphere(GetWorld(), Location[2], 100, 50, FColor::Green);

	// 원
	// 4 : 정밀도
	// 정밀도를 떨어트리면 각져 보임
	DrawDebugCircle(GetWorld(), Location[3], 100, 60, FColor::Blue);

	// 선
	// 2 : 시작 지점
	// 3 : 끝 지점
	// 5 : 퍼시스턴트
	// 6 : 시간(매 프레임마다 그리니까 시간이 의미가 없어서 -1)
	// 7 : 깊이
	// 8 : 두께
	DrawDebugLine(GetWorld(), Location[2], Location[3], FColor::Magenta, false, -1, 0, 2);


	// Sin, Cos : -1 ~ 1까지의 값이 반복되는 삼각함수 그래프
	// 이걸 이용해서 반복되는 것을 만들 수 있음
	FVector location = Location[1];
	location.X += 100;
	location.Z += 100;
	// Y는 좌우
	// GetTimeSeconds() : 델타타임 누적한 것과 똑 같음
	// 속도는 안에다가 3 곱함
	// 느려서 300 곱함
	location.Y += sin(GetWorld()->GetTimeSeconds() * 3.0f) * 300.0f;

	// 시간에 따라 이동(-1 ~ 1)
	// Emerald : 에메랄드
	DrawDebugPoint(GetWorld(), location, 100, FColor::Emerald);
	
	
	// 방향이 있는 화살표를 그려줌
	// 2 ~ 3번까지 4 : 화살표 꼭다리 크기, 6 : 퍼시스턴트 7 : LifeTime(매프레임이라 시간이 의미가 없다.)  8 : 깊이(0 주면 됨) 7 : 두께
	DrawDebugDirectionalArrow(GetWorld(), location, Location[3], 360, FColor::Yellow, false, -1, 0, 10);
}

 

 

Global.h


더보기
...

#include "DrawDebugHelpers.h //DrawDebug 함수 모두 여기 있음

 

 

 

 

 

 

결과