Unreal Engine/2. Twin Stick Shooter

2. 캐릭터 클래스 빌드

ljw4104 2021. 9. 17. 16:11

1. C++을 이용한 클래스 생성

다음과 같이 헤더파일 하나랑 cpp파일 하나가 나오면 성공한 것이다.

헤더 파일 : 모든 기능들을 선언

CPP 파일 : 헤더 파일에서 선언된 기능들을 구현

 

BaseCharacter.h

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

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Character.h"
#include "BaseCharacter.generated.h"

UCLASS(Blueprintable)
class TWINSTICKSHOOTER_API ABaseCharacter : public ACharacter
{
	GENERATED_BODY()

public:
	//make health property
	//Blueprint가 여기서 읽고 쓸수 있음, 다른 클래스에서 접근 가능, 카테고리 분류
	UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "BaseCharacter")
		float Health = 100;
	
	//isDead property
	//Blueprint가 읽을 수만 있음, 어디서든 볼 수 있음
	UPROPERTY(BluprintReadOnly, VisibleAnywhere, Category = "BaseCharacter")
		bool isDead = false;

	//Calclulate death function (helper)
	virtual void CalculateDead();

	//Calculate health function
	//이 함수를 Blueprint Node로 바꿔줌
	UFUNCTION(BlueprintCallable, Category = "BaseCharacter")
		virtual void CalculateHealth(float Delta);

#if WITH_EDITOR		//에디터에서만 적용
	//Editor-centric code for changing properties
	virtual void PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent)
		override;
#endif

public:
	// Sets default values for this character's properties
	ABaseCharacter();

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

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

	// Called to bind functionality to input
	virtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override;

};

BaseCharacter.cpp

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


#include "BaseCharacter.h"

// Sets default values
ABaseCharacter::ABaseCharacter()
{
 	// Set this character to call Tick() every frame.  You can turn this off to improve performance if you don't need it.
	PrimaryActorTick.bCanEverTick = true;

}

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

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

}

// Called to bind functionality to input
void ABaseCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
	Super::SetupPlayerInputComponent(PlayerInputComponent);

}

//Implement CalculateHealth
void ABaseCharacter::CalculateHealth(float Delta) {
	Health += Delta;
	CalculateDead();
}

//Implement CalculateDeath
void ABaseCharacter::CalculateDead() {
	if (Health <= 0) 
		isDead = true;
	else
		isDead = false;
}

//Implement PostEditChangeProperty
#if WITH_EDITOR
void ABaseCharacter::PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent) {
	isDead = false;
	Health = 100;

	Super::PostEditChangeProperty(PropertyChangedEvent);

	CalculateDead();
}

#endif

 

프로젝트 리로드 후 콘텐츠 브라우저 확인

에러가 발생했다... 빌드 오류인거 같은데 해결이 힘들다

 

* 해결법

VS에서 컴파일하려고 하지말고 나와서 언리얼에서 상단에 있는 컴파일 버튼을 누르면 잘만된다....

2. Blueprints

1. Blueprints 폴더 생성

2. 캐릭터 클래스 기반 블루프린트 생성

컴파일이 성공적으로 이루어졌으면 코드 상에서 만들었던 변수들이 보인다.

3. 캐릭터 추가하기

  1. Skeletal Mesh 추가
  2. 메시를 Capsule Collider에 맞게 조정하기
  3. 캐릭터를 화살표에 맞게 회전시키기

 

4. 카메라 설치

Spring Arm Component

Spring Arm Component : 자손 Actor와의 일정한 거리를 유지하도록 해준다.

 

Spring Arm이 캐릭터의 회전을 따라 회전하지 않도록 체크박스를 모두 해제

카메라는 충돌이 없도록 하게 하기.

=> 셀카봉과 비슷

  1. Camera Component 추가
  2. Spring Arm의 자식으로 추가
  3. 카메라를 캐릭터의 위에서 비추도록 각도 조절
  4. 거리 조절
  5. 컴파일 후 저장