목차

     

     


     

     

    Properties

     

     

     


    Properties

     

    https://docs.unrealengine.com/4.26/ko/ProgrammingAndScripting/GameplayArchitecture/Properties/

     

    프로퍼티

    게임플레이 클래스에 대한 프로퍼티 생성 및 구현 관련 레퍼런스입니다.

    docs.unrealengine.com

     

     


    log 찍기

     

    https://wergia.tistory.com/122

     

    [UE4] Programming - 로그 출력하기

    로그 출력하기 작성버전 :: 4.20.3 로그는 개발중에 여러가지 피드백을 얻기 위해서 중요한 도구다. 그렇기 때문에 항상 새로운 언어, 새로운 엔진 등을 배울 때는 거기서 어떤 방식으로 로그를 출

    wergia.tistory.com

     

     


     

    BP_C01_Property

     

    C01_Property.h

    더보기
    #pragma once
    #include "CoreMinimal.h"
    #include "GameFramework/Actor.h"
    #include "C01_Property.generated.h"
    
    UCLASS()
    class U2212_03_API AC01_Property : public AActor
    {
    	GENERATED_BODY()
    
    private:
    	UPROPERTY(EditAnywhere)
    		int A = 10;
    
    	UPROPERTY(EditDefaultsOnly)
    		int B;
    
    	UPROPERTY(EditInstanceOnly)
    		int C;
    
    	UPROPERTY(VisibleAnywhere, Category = "Property")
    		float D;
    
    protected:
    	UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "Property")
    		int Variable = 10;
    
    public:	
    	AC01_Property();
    
    protected:
    	virtual void BeginPlay() override;
    
    public:	
    	virtual void Tick(float DeltaTime) override;
    };
       
    EditAnyWhere 이 프로퍼티는 Archetypes이나 Instance 양쪽의 프로퍼티 창에서 편집할 수 있습니다. 이 지정자는 어떤 "Visible" 지정자와도 호환되지 않습니다.
    EditDefualtsOnly 이 프로퍼티는 프로퍼티 창에서 편집할 수 있지만, Archetypes 상에서만 가능합니다. 이 지정자는 어떤 "Visible" 지정자와도 호환되지 않습니다.
    EditInstanceOnly 이 프로퍼티는 프로퍼티 창에서 편집할 수 있지만,  Archetypes 아닌 Instance 상에서만 가능합니다. 이 지정자는 어떤 "Visible" 지정자와도 호환되지 않습니다.

    출처: 언리얼 공식문서 https://docs.unrealengine.com/4.26/ko/ProgrammingAndScripting/GameplayArchitecture/Properties/Specifiers/.

     

     

     

    C01_Property.cpp

    더보기
    #include "01_Spawn/C01_Property.h"
    
    AC01_Property::AC01_Property()
    	: B(20)
    {
    	PrimaryActorTick.bCanEverTick = true;
    
    	C = 30;
    }
    
    void AC01_Property::BeginPlay()
    {
    	Super::BeginPlay();
    
    	FString str;
    	str.Append(GetActorLabel());
    
    	str.Append(" / A :");
    	str.Append(FString::FromInt(A));
    
    	str.Append(" / B :");
    	str.Append(FString::FromInt(B));
    
    	str.Append(" / C :");
    	str.Append(FString::FromInt(C));
    
    	GLog->Log(str);
    }
    
    void AC01_Property::Tick(float DeltaTime)
    {
    	Super::Tick(DeltaTime);
    
    	D += DeltaTime; //게임시작부터 현재까지의 시간
    }

     

     


     

    C02_Mesh

     

     

    UObject* obj = StaticLoadObject(UMaterialInstanceConstant::StaticClass(), nullptr, L"MaterialInstanceConstant'/Game/Materials/M_White_Inst.M_White_Inst'");
    UMaterialInstanceConstant* material = Cast<UMaterialInstanceConstant>(obj);

     

    UObject로부터 상속받은 모든 class들은 StaticClass()라는 함수를 가지고 있다.

     

     

    C02_Mesh.h

    더보기
    #pragma once
    
    #include "CoreMinimal.h"
    #include "GameFramework/Actor.h"
    #include "C02_Mesh.generated.h"
    
    UCLASS()
    class U2212_03_API AC02_Mesh : public AActor
    {
    	GENERATED_BODY()
    
    private:
    	UPROPERTY(VisibleAnywhere)
    		class UStaticMeshComponent* Mesh;
    
    
    public:	
    	AC02_Mesh();
    
    protected:
    	virtual void BeginPlay() override;
    
    private:
    	UFUNCTION()
    		void SetRandomColor();
    
    private:
    	class UMaterialInstanceDynamic* Material;
    };

     

     

    C02_Mesh.cpp

    더보기
    #include "01_Spawn/C02_Mesh.h"
    #include "Global.h"
    #include "Components/StaticMeshComponent.h"
    #include "Materials/MaterialInstanceConstant.h"
    #include "Materials/MaterialInstanceDynamic.h"
    AC02_Mesh::AC02_Mesh()
    {
    	//Mesh = CreateDefaultSubobject<UStaticMeshComponent>("Mesh");
    	//RootComponent = Mesh;
    
    	//CHelper.h에서 만든 CreateComponent사용. 2차 포인터이기 때문에 &mesh 주소로 받는다.
    	CHelpers::CreateComponent<UStaticMeshComponent>(this, &Mesh, "Mesh");
    
    	//ConstructorHelpers::FObjectFinder<UStaticMesh> mesh(L"StaticMesh'/Game/Meshes/Cube.Cube'");
    	//if (mesh.Succeeded())
    	//	Mesh->SetStaticMesh(mesh.Object);
    
    	UStaticMesh* mesh = nullptr;
    	CHelpers::GetAsset<UStaticMesh>(&mesh, "StaticMesh'/Game/Meshes/Cube.Cube'");
    	Mesh->SetStaticMesh(mesh);
    
    }
    
    void AC02_Mesh::BeginPlay()
    {
    	Super::BeginPlay();
    
    	UMaterialInstanceConstant* material = nullptr;
    	CHelpers::GetAssetDynamic<UMaterialInstanceConstant>(&material, "MaterialInstanceConstant'/Game/Materials/M_White_Inst.M_White_Inst'");
    
    	Material = UMaterialInstanceDynamic::Create(material, this); //material 생성
    	Mesh->SetMaterial(0, Material); //mesh에 material 할당
    
    	UKismetSystemLibrary::K2_SetTimer(this, "SetRandomColor", 1, true);
    }
    
    void AC02_Mesh::SetRandomColor()
    {
    	Material->SetVectorParameterValue("Color", FLinearColor::MakeRandomColor());
    }

     


     

    참고사항) 언리얼은 모든 헤더가 미리 컴파일된 헤더로 취급된다. (4.18버젼 이후 동일)  

     

    언리얼은 모든 헤더가 미리 컴파일된 헤더로 취급된다. (4.18버젼 이후 동일)

     

    PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHS;

     

     


     

    Global.h 

     

    우리가 만든 미리 컴파일된 헤더. 앞으로 정의할 cpp에 넣어서 사용할 것이다.

     

    Global.h

    더보기
    #pragma once
    
    #include "Kismet/KismetSystemLibrary.h"
    #include "Utilities/CHelpers.h"

     


     

     

     

     

     

     

     

    UE2212_03

    Contents  
    01_Spawn    
         
    C++ 클래스
    U2212_03 Source
    01_Spawn C01_Property.h .cpp
    C02_Mesh.h .cpp
     
    Utilities CHelpers.h .cpp

     
         
    Global.h
    U2212_03GameModeBase