언리얼 게임잼을 준비하면서 인생 언리얼 교과서의 Chapter 03 실습 중이다.
부모 클래스는 Actor 클래스
public:
// 발사체의 이동을 담당할 컴포넌트
UPROPERTY(VisibleAnywhere, Category = Movement)
class UProjectileMovementComponent* movementComp;
// 충돌 컴포넌트
UPROPERTY(VisibleAnywhere, Category = Collision)
class USphereComponent* collisionComp;
// 외관 컴포넌트
UPROPERTY(VisibleAnywhere, Category = BodyMesh)
class UStaticMeshComponent* bodyMeshComp;
ABullet::ABullet()
{
PrimaryActorTick.bCanEverTick = true;
// 1. 충돌체 등록
collisionComp = CreateDefaultSubobject<USphereComponent>(TEXT("CollisionComp"));
// 2. 충돌 프로파일 설정
// - 충돌 프로파일 BlockAll: 모든 물체와 부딪혀 튕길 수 있도록 함
collisionComp->SetCollisionProfileName(TEXT("BlockAll"));
// 3. 충돌체 크기 설정
collisionComp->SetSphereRadius(13);
// 4. 루트로 등록
RootComponent = collisionComp;
// 5. 외관 컴포넌트 등록하기
bodyMeshComp = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("BodyMeshComp"));
// 6. 부모 컴포넌트 지정
bodyMeshComp->SetupAttachment(collisionComp);
// 7. 충돌 비활성화
// - 위에서 이미 충돌체를 등록해주었으므로 StaticMesh에 있는 충돌체는 꺼줌
bodyMeshComp->SetCollisionEnabled(ECollisionEnabled::NoCollision);
// 8. 외관 크기 설정
bodyMeshComp->SetRelativeScale3D(FVector(0.25f));
}
위에서 스태틱메시의 충돌체는 비활성화해주었기 때문에
스태틱메시만 날아가면 아무런 충돌도 발생하지 않음
따라서 충돌체인 캡슐 컴포넌트가 날아가야 하고 스태틱메시는 캡슐 컴포넌트의 자식으로 들어가야 함
// 발사체 컴포넌트
movementComp = CreateDefaultSubobject<UProjectileMovementComponent>(TEXT("MovementComp"));
// movement 컴포넌트가 갱신시킬 컴포넌트 지정
// - 스태틱메시 컴포넌트의 부모가 collisionComp 이므로 스태틱메시도 같이 업데이트 될 것
movementComp->SetUpdatedComponent(collisionComp);
// 초기속도
movementComp->InitialSpeed = 5000;
// 최대속도
movementComp->MaxSpeed = 5000;
// 반동 여부
movementComp->bShouldBounce = true;
// 반동 값
movementComp->Bounciness = 0.3f;
언리얼 에디터로 돌아가서 Blueprint 만들어주고 스태틱 메시 할당
배치한 다음에 플레이 해보면 날아가는 총알을 볼 수 있다..
사진 상 아주 조그마하게 나옴.. 작고 귀여운..
내가 만들 거에서는 총이 필요 없으므로 총 붙이는 건 패스
// 총알 공장
UPROPERTY(EditDefaultsOnly, Category = BulletFactory)
TSubclassOf<class ABullet> bulletFactory;
TSubclassOf 템플릿 클래스는 템플릿에 등록된 ABullet 유형의 클래스,
혹은 블루프린트 클래스를 언리얼 에디터로부터 할당받을 수 있음
TPSPlayer의 블루프린트 디테일에서 아래와 같이 설정
void ATPSPlayer2::InputFire()
{
// 총알 발사 처리
// - 플레이어 메시의 중간지점에서 발사할 것임
ConstructorHelpers::FObjectFinder<USkeletalMesh>
TempMesh(TEXT("SkeletalMesh'/Game/Mannequin/Character/Mesh/SK_Mannequin.SK_Mannequin'"));
if (TempMesh.Succeeded())
{
FTransform firePosition = GetMesh()->GetSocketTransform(TEXT("FirePosition"));
GetWorld()->SpawnActor<ABullet>(bulletFactory, firePosition);
}
}
void ATPSPlayer2::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
Super::SetupPlayerInputComponent(PlayerInputComponent);
PlayerInputComponent->BindAction(TEXT("Fire"), IE_Pressed, this, &ATPSPlayer2::InputFire);
}
메시에다가 FirePosition 소켓 추가
진짜 제발
위 구조처럼 되어 있는데 Body Mesh Comp의 Scale이 너무 커서
임의로 바꿔주었는데 계속 요상한 크기로 Bullet이 나와가지고 헤맸다.
원인은 Collision Comp가 Body Mesh Comp랑 크기가 안맞고 혼자 커서 요상한 크기로 된 거였음...
언리얼 쉽지 않네요