[Unreal]#6_Gun Actor Setting
Unreal 개발 중 "Gun Actor"에 대해 알아보겠습니다.
"Simple Shooter Game"의 Character Class 개발 과정 중 일부입니다.
Gun Actor
* 상속 구조
1. Capsule Component : Collision
2. Mesh Component : Skeleton Mesh + Animation
3. Mesh Component : Gun Actor
4. Particle System : Particle Effect of Gun
우리가 앞으로 구현할 "Actor", 총은 "Character"의 Mesh Component의 하위 Component가 됩니다.
1. C++ Actor Class 생성
1. 새로운 C++ "Actor" 클래스 생성
2. 클래스의 이름은 "Gun"으로 합니다.
* 주의 : 구현할 Gun Class는 "Pawn" 클래스처럼 소유하거나, "Character" 클래스처럼 이동을 하지 않습니다!
2. 파생 Blueprint Class 생성
3. C++ 클래스에서 Component를 데이터 멤버로 선언
// Gun.h 내부
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "TestGun.generated.h"
UCLASS()
class SIMPLESHOOTER_API ATestGun : public AActor
{
GENERATED_BODY()
public:
// Sets default values for this actor's properties
ATestGun();
protected:
// Called when the game starts or when spawned
virtual void BeginPlay() override;
public:
// Called every frame
virtual void Tick(float DeltaTime) override;
// Gun 클래스에 추가할 컴포넌트들을 데이터 멤버로 선언합니다.
private:
// 1. Root Component가 될 SceneComponent
UPROPERTY(VisibleAnywhere)
class USceneComponent* Root;
// 2. 총 Mesh의 본체가 될 Mesh Component
UPROPERTY(VisibleAnywhere)
class UMeshComponent* Mesh;
// 3. Effect가 될 Particle System
UPROPERTY(EditAnywere)
class UParticleSystem* MuzzleFlash;
UPROPERTY(EditAnywere)
class UParticleSystem* ImactEffects;
};
1. USceneComponent* Root : Gun Actor의 Root 컴포넌트를 USceneComponent 타입으로 선언합니다.
2. UMeshComponent* Mesh : Gun Actor의 Mesh 컴포넌트들 UMeshComponent 타입으로 선언합니다.
3. UParticleSystem* MuzzleFlash or ImpactEffect : Gun Actor의 Effect들을 UParticleSystem 타입으로 선언합니다.
* USceneComponent?
- Scene Component는 Actor Component 중 하나로 World의 특정 물리적 위치에 존재합니다.
그리고, 그 위치는 Transform(위치, 회전, 스케일)으로 정의됩니다. 더불어, tree를 형성하여
다른 Scene Component와 Attach 할 수 있는 기능을 제공합니다. 따라서, Actor들은 Scene
Component를 "Root" 컴포넌트로 설정하여 Actor의 Transform 정보를 얻어올 수 있습니다.
"Scene Component"가 제공하는 주요 기능은 "Attachment" 기능입니다.
오직 "Scene Component"와 "Scene Component"의 하위 클래스들만 "Attachment"가 가능합니다.
우리는 "Attachment" 기능의 "Transform(위치, 회전, 스케일)" 정보를 통해 부모 컴포넌트와 자식 컴포넌트 간의 공간적 관계(Spatial Relationship)를 설명할 수 있습니다.
4. 각 Component들을 "Attach" 합니다.
// Gun 클래스의 생성자 내부
AGun::AGun()
{
// 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;
Root = CreateDefaultSubobject<USceneComponent>(TEXT("Root"));
SetRootComponent(Root);
Mesh = CreateDefaultSubobject<USkeletalMeshComponent>(TEXT("Mesh"));
Mesh->SetupAttachment(Root);
}
1. T CreateDefaultSubobject< typename T > (FName SubobjectName, bool bTransient = false)
: 템플릿 메서드로, Component 혹은 Subobject를 생성합니다.
2. bool AActor::SetRootComponent(USceneComponent* NewRootComponent)
: 루트 컴포넌트를 특정 Scene Component로 지정합니다.
3. void USceneComponent::SetupAttachment(class USceneComponent* InParent, FName InSocketName)
: 생성자에서 활용되며 아직 등록되지 않은 Component를 "Attach"할 부모 컴포넌트를 지정합니다.
'게임개발 > Unreal C++' 카테고리의 다른 글
[Unreal]#8_Attach Gun Actor to Shooter Character (0) | 2022.08.16 |
---|---|
[Unreal]#7_Spawn Gun Actor in Runtime (0) | 2022.08.12 |
[Unreal]#5_Character의 이동 속도와 각도 구하기, Animation Blueprint (0) | 2022.08.10 |
[Unreal]#4_Animation Blueprint, Gameplay와 Animation 연결하기 (0) | 2022.08.08 |
[Unreal]#3_Character Animation, Animation Blueprint, Animation Blend Space (0) | 2022.08.07 |