본문 바로가기

DXWave/Project3

C++연습

C++로 프로젝트를 만들자 ThirdPerson을 포함시켜주자.

C++Classes폴더에 자신의 프로젝트 이름의 클래스가 있다 우클릭후 블루프린트를 만들어준다. BP_TestCharacter라고 하자. 이상태에서는 제어도 안되고 아무것도 안보인다.

블루프린트를 열고 인풋을 지정해줘야한다. 원래는 InputAction을 만들어줘야 하는 ThirdPerson의 포함된걸 사용하겠다.

컴포넌트에서 Mesh를 선택하고 Mesh와 Animation모드를 설정해주자 

이제 이걸 플레이어로 사용하기 위해 게임모드 블루프린트를 하나 만들어 오버로드로 사용한다.

위에서 만든 BP_TestCharacter를 Default Pawn으로 지정한다. 그래야 플레이시 플레이어로 사용할수 있다.

플레이해보면 이상없이 나와야 한다.

이제 총알을 만들어보자. Actor를 부모로 클래스를 만들어보자  저장시 퍼블릭을 선택한다. 이름을 BulletActor로 하고

BulletActor.h

충돌처리를 위한 BoxComp, 메시를 담을 MeshComp, 속도제어를 위해 speed를 선언하고, 

public:
	UPROPERTY(EditAnywhere)
	class UBoxComponent* BoxComp;

	UPROPERTY(EditAnywhere)
	class UStaticMeshComponent* MeshComp;

private:
	UPROPERTY(EditAnywhere)
	float Speed=10;

BulletActor.c

BoxComp, 객체를 생성후 루트로 지정  MeshCom룰 생성 루트에 붙여준다. Tick에 Actor의 forward방향을 구해 speed를 곱해주고 현재위치와 더한후 현재위치를 갱신해줘서 앞으로 나아가게 한다.

Actor는 무브먼트에 대한 컴포넌트가 없기 때문에 이렇게 처리해주던지 

ProjectileMovement를 추가해줘도 된다. ProjectileMovement는 가속부분이 있어 초기에 Force를 주어야 움직인다.

https://plug-in-baby.tistory.com/179

#include "BulletActor.h"
#include "Components/BoxComponent.h"

ABulletActor::ABulletActor()
{
 	// 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;
	BoxComp = CreateDefaultSubobject<UBoxComponent>(TEXT("BoxComp"));
	BoxComp->SetBoxExtent(FVector(37.5f, 12.5f, 50));
	SetRootComponent(BoxComp);
	MeshComp = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("Mesh"));
	MeshComp->SetupAttachment(RootComponent);
	MeshComp->SetRelativeScale3D(FVector(0.75f, 0.25f, 1.0f));
}

void ABulletActor::Tick(float DeltaTime)
{
	Super::Tick(DeltaTime);
	FVector P0 = GetActorLocation();
	FVector dir = GetActorForwardVector();
	FVector v = dir * Speed;
	SetActorLocation(P0 + v);
}