본문 바로가기
프로그래밍/Unreal Engine 4

C++ & Blueprint

by neive 2020. 4. 16.
728x90

기본예제

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

#pragma once

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

UCLASS()
class ZS2020_API AMyActor : public AActor
{
	GENERATED_BODY()
	
public:	
	// Sets default values for this actor's properties
	AMyActor();

	// 에디터 표시, 읽고쓰기 가능, 카테고리설정
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Damage")
	int32 m_TotalDamage;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Damage")
	float m_DamageTimeInSeconds;

	// 보기만 가능, 휘발성 변수
	UPROPERTY(VisibleAnywhere, Transient, Category="Damage")
	float m_DamagePerSeconds;

	// 블루프린트 모드에서도 사용 가능한 함수로
	UFUNCTION(BlueprintCallable, Category="Damage")
	void CalculateValues();

	// 블루프린트 가상 머신으로 호출
	//UFUNCTION(BlueprintImplementableEvent, Category = "Damage")
	//void CalledFromCpp();

	// 블루프린트 가상 머신으로 호출
	UFUNCTION(BlueprintNativeEvent, Category="Damage")
	void CalledFromCpp();

	APlayerController* GetMyPlayerControllerFromSomewhere();

protected:
	// Called when the game starts or when spawned / 반대 EndPlay()
	virtual void BeginPlay() override;

	virtual void PostInitProperties() override;
	virtual void PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent) override;

public:	
	// Called every frame
	virtual void Tick(float DeltaTime) override;

};
// Fill out your copyright notice in the Description page of Project Settings.


#include "MyActor.h"

// Sets default values
AMyActor::AMyActor()
{
 	// 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;

	m_TotalDamage = 200;
	m_DamageTimeInSeconds = 1.0f;
}

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

// Called every frame
void AMyActor::Tick(float DeltaTime)
{
	Super::Tick(DeltaTime);

}

// 생성자(AMyActor()) 이후 바로 실행됨
void AMyActor::PostInitProperties()
{
	Super::PostInitProperties();

	CalculateValues();
}

void AMyActor::CalculateValues()
{
	m_DamagePerSeconds = m_TotalDamage / m_DamageTimeInSeconds;
}

// 에디터에서만 실행
#if WITH_EDITOR
// 에디터에서 값을 변경했을 때 들어오는 곳
void AMyActor::PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent)
{
	CalculateValues();

	Super::PostEditChangeProperty(PropertyChangedEvent);
}
#endif

APlayerController* AMyActor::GetMyPlayerControllerFromSomewhere()
{
	// 현재 UObject 인스턴스를 전부 찾습니다
	for (TObjectIterator<APlayerController> It; It; ++It)
	{
		UObject* CurrentObject = *It;
		UE_LOG(LogTemp, Log, TEXT("Found UObject named : %s"), *CurrentObject->GetName());
		return *It;
	}

	return NULL;
}

void AMyActor::CalledFromCpp_Implementation()
{
	// to doo

	// 현재 UObject 인스턴스를 전부 찾습니다
	for (TObjectIterator<UObject> It; It; ++It)
	{
		UObject* CurrentObject = *It;
		UE_LOG(LogTemp, Log, TEXT("Found UObject named : %s"), *CurrentObject->GetName());
	}

	APlayerController* MyPC = GetMyPlayerControllerFromSomewhere();
	UWorld* World = MyPC->GetWorld();

	// 오브젝트 이터레이터처럼, 구체적인 클래스를 제공하여 해당 클래스 
	// 또는 그 파생클레스의 오브젝트만 구할 수 있
	//for (TActorIterator<AEnemy> It(World); It; ++It)
	{

	}
}

 

C++ 소스 기반으로 블루프린트 생성하기

- 에디터에서 C++ 클래스 항목에서 블루프린트로 만들 클래스를 우클릭해서 블루프린트 생성을 하거나  블루프린트를 저장할 곳에서 우클릭 후 메뉴에서 기본에셋생성 > 블루프린트를 선택 후 모든 클래스 확장 버튼을 누르고 원하는 클래스 선택

블루프린트 제작

- 블루프린트를 만들고 우클릭 > 풀 블루프린트 

728x90

댓글