목차

     

     


     

     
    Source
        Characters
        CAnimInstance.h .cpp
    CPlayer.h .cpp
    ICharacter.h .cpp 생성
        Components
        CMontagesComponent.h .cpp 
    CMovementComponent.h .cpp 
    CStateComponent.h .cpp 
    CWeaponComponent.h .cpp 
        Notifies
        CAnimNotify_EndState.h .cpp 생성
        Utilities
        CHelper.h
    CLog.h .cpp
        Weapons
        CAttachment.h .cpp 생성
    CWeaponAsset.h .cpp 생성
        Global.h
    CGameMode.h .cpp
    U2212_06.Build.cs
        U2212_06.uproject
     

     

     

     

    인터페이스

     


     

     

    인터페이스(Interface) vs 추상클래스

     

    인터페이스

    • 인터페이스는 정의 상 순수 가상함수만 포함한다.
    • C++과 Unreal C++에서 가상, 추상, 일반 모두 포함할 수 있다.
    • UInterface 지정자 사용
    • 그룹을 묶어주기 위해서 사용한다.

     

    추상클래스

    • 순수 가상함수를 하나라도 포함한다.
    • C++과 Unreal C++에서 가상, 추상, 일반 모두 포함할 수 있다.?
    • 대부분에 부모에 구현되어 있다?
    • UCLASS 지정자 사용

     

    블로그를 예시로 들면 상하위 카테고리 관계는 상속을 이용한 추상클래스, tag는 인터페이스다. 

     

     

     

     

    일반클래스 vs. 추상클래스

    • 일반클래스는 객체화 될 수 있지만 추상클래스는 객체화 될 수 없다.
    • 객체화되면 안되는 것들이 추상이다(=추상화 해야되는 대상이다).

     

     

     

    구조체 vs. 클래스

    • 접근 지정자의 차이
    • 선언 시 struct, class 차이

     


     

     

    CAnimNotify_EndState 생성

     

    새 c++ 클래스 - AnimNotify - CAnimNotify_EndState 생성

     

     

    CAnimNotify_EndState.h

    더보기
    #pragma once
    
    #include "CoreMinimal.h"
    #include "Animation/AnimNotifies/AnimNotify.h"
    #include "Components/CStateComponent.h"
    #include "CAnimNotify_EndState.generated.h"
    
    UCLASS()
    class U2212_06_API UCAnimNotify_EndState : public UAnimNotify
    {
    	GENERATED_BODY()
    
    private:
    	UPROPERTY(EditAnywhere, Category = "Type")
    		EStateType StateType;
    
    public:
    	FString GetNotifyName_Implementation() const override;
    
    	void Notify(USkeletalMeshComponent* MeshComp, UAnimSequenceBase* Animation) override;
    };

     

     

     

    CAnimNotify_EndState.cpp

    더보기
    #include "CAnimNotify_EndState.h"
    #include "Global.h"
    #include "Characters/ICharacter.h"
    
    FString UCAnimNotify_EndState::GetNotifyName_Implementation() const
    {
    	return "EndState";
    }
    
    void UCAnimNotify_EndState::Notify(USkeletalMeshComponent* MeshComp, UAnimSequenceBase* Animation)
    {
    	Super::Notify(MeshComp, Animation);
    	CheckNull(MeshComp);
    	CheckNull(MeshComp->GetOwner());
    
    	IICharacter* character = Cast<IICharacter>(MeshComp->GetOwner());
    	CheckNull(character);
    
    	switch(StateType)
    	{
    		case EStateType::BackStep: 
    			character->End_BackStep(); break;
    	}
    }

     

     

     

     

    ※참고) AnimNotify.h 내에 있는 GetNotifyName 코드

     AnimNotify.cpp 내에 있는 GetNotifyName_Implementation 코드

     


     

     

     

    ICharacter 생성

     

    새 c++ 클래스 - Unreal Interface - ICharacter 생성

     

     

    ICharacter.h

    더보기
    #pragma once
    #include "CoreMinimal.h"
    #include "UObject/Interface.h"
    #include "ICharacter.generated.h"
    
    UINTERFACE(MinimalAPI) //직렬화를 위한 부분
    class UICharacter : public UInterface
    {
    	GENERATED_BODY()
    };
    
    class U2212_06_API IICharacter
    {
    	GENERATED_BODY()
    
    public:
    	virtual void End_BackStep() { }
    };

     

     

     

    ICharacter.cpp

    더보기
    #include "Characters/ICharacter.h"

     

     


     

     

    Backstep_Montage에 AnimNotify_EndState 할당

     

     


     

    실행화면

     

     

     

     

     


     

     

     

     

     

    Weapon System 시작

     

     


     

     

    Weapon System 구조 개요

     

    UDataAsset

               ↑

    UCWeaponAssets

     

     

    WeaponComponent

     

     

    ACAttachment

    • 모양을 결정해줄 클래스

     

    UCEquipment

    • 장착방식.
    • ex. 어떤 몽타주에서 장착할지. 몽타주 없이 장착할지

     

    UCDoAction

     

     

    위의 구조를 지켜 무기 시스템을 만들것이다. Slate UI를 함께 사용하여 구현할 것이다.

     


     

     

    CAttachment 생성

     

    새 c++ 클래스 - Actor - CAttachment생성

     

    CAttachment.h

    더보기
    #pragma once
    #include "CoreMinimal.h"
    #include "GameFramework/Actor.h"
    #include "CAttachment.generated.h"
    
    UCLASS()
    class U2212_06_API ACAttachment : public AActor
    {
    	GENERATED_BODY()
    
    protected:
    	UPROPERTY(BlueprintReadOnly, VisibleAnywhere)
    		class USceneComponent* Root;
    	
    public:	
    	ACAttachment();
    
    protected:
    	virtual void BeginPlay() override;
    
    protected:
    	UPROPERTY(BlueprintReadOnly, Category = "Game")
    		class ACharacter* OwnerCharacter;
    };

     

     

     

    CAttachment.cpp

    더보기
    #include "Weapons/CAttachment.h"
    #include "Global.h"
    #include "GameFramework/Character.h"
    #include "Components/SceneComponent.h"
    
    ACAttachment::ACAttachment()
    {
    	CHelpers::CreateComponent(this, &Root, "Root");
    }
    
    void ACAttachment::BeginPlay()
    {
    	OwnerCharacter = Cast<ACharacter>(GetOwner());
    	//ACharacter를 먼저 Cast 한 후에 Super::BeginPlay() 호출.
    	Super::BeginPlay();
    }

     

     


     

     

     

     

    BP_CAttachment_Sword 생성

     

     


     

     

    CWeaponAsset 생성

     

    새 c++ 클래스 - Data Asset - CWeaponAsset 생성

     

    CWeaponAsset.h

    더보기
    #pragma once
    #include "CoreMinimal.h"
    #include "Engine/DataAsset.h"
    #include "CWeaponAsset.generated.h"
    
    UCLASS()
    class U2212_06_API UCWeaponAsset : public UDataAsset
    {
    	GENERATED_BODY()
    
    private:
    	UPROPERTY(EditAnywhere)
    		TSubclassOf<class ACAttachment> AttachmentClass;
    
    public:
    	FORCEINLINE class ACAttachment* GetAttachment() { return Attachment; }//외부에 생성된 것을 리턴해줌. 
    
    public:
    	UCWeaponAsset();
    
    	void BeginPlay(class ACharacter* InOwner);
    
    private:
    	//UPROPERTY를 붙여 가비지 콜렉터가 제거하기 전까지 물고 있게 만든다.
    	//UWeaponAsset은 UObject로부터 상속받아 Actor?의 생성주기에 영향을 받지 않아 가비지 콜렉터에 영향을 받는다.
    	UPROPERTY() 
    	class ACAttachment* Attachment; 
    };

    UPROPERTY를 붙여 가비지 콜렉터가 제거하기 전까지 물고 있게 만든다.
    UWeaponAsset은 UObject로부터 상속받아 Actor?의 생성주기에 영향을 받지 않아 가비지 콜렉터에 영향을 받는다.

     

     

     

    CWeaponAsset.cpp

    더보기
    #include "Weapons/CWeaponAsset.h"
    #include "Global.h"
    #include "CAttachment.h"
    #include "GameFramework/Character.h"
    
    
    UCWeaponAsset::UCWeaponAsset()
    {
    	AttachmentClass = ACAttachment::StaticClass();
    }
    
    void UCWeaponAsset::BeginPlay(ACharacter* InOwner)
    {
    	if (!!AttachmentClass)//AttachmentClass가 선택이 되어 있다면
    	{
    		FActorSpawnParameters params;
    		params.Owner = InOwner;
    
    		Attachment = InOwner->GetWorld()->SpawnActor<ACAttachment>(AttachmentClass, params);
    	}
    }

     


     

     

    DA_Sword 생성

     

    기타 - 데이터 에셋 - CWeaponAsset - DA_Sword 생성

     

    Attachment Class에 BP_CAttachment_Sword 할당