초보 코린이의 성장 일지

UE4 StaticMesh 본문

언리얼

UE4 StaticMesh

코오린이 2023. 4. 11. 12:48

더보기
#if WITH_EDITOR // 월드 아웃라이너
    // 안에 이름 전부를 알아낼떄 사용
	GLog->Log(GetActorLabel());
#endif

1. 게임내에서 코드를 수정 할 수 없는 부분, 즉 에디터 전용일때는 매크로 사용을 필히 해줘여한다.

2. 매크로를 꼭 써야하는 이유에 대해 한가지 알게 된 것이다.

 

더보기
#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "CStaticMesh.generated.h"

UCLASS()
class U2212_05_API ACStaticMesh : public AActor
{
	GENERATED_BODY()

#if WITH_EDITOR
public:
	// 에디터 전용, 게임내에서 코드 x, 반드시 매크로 명시 필수
	void Paint();
#endif
	
};
#include "CStaticMesh.h"
#include "Global.h"
#include "Components/StaticMeshComponent.h"
#include "Materials/MaterialInstanceConstant.h"

#if WITH_EDITOR // 정의했을때도 동일하게 매크로 명시
void ACStaticMesh::Paint()
{
	for (const FVectorParameterValue& value : Material->VectorParameterValues)
	{
		// 에디터에서만 사용 가능, VectorParameter를 다 가져올 수 있는 방법
        // 이름이 컬러와 같다면 조건 수행, 컬러를 랜덤으로 바꾸기
		if (value.ParameterInfo.Name.Compare("Color") == 0)
		Material->SetVectorParameterValueEditorOnly(value.ParameterInfo, FLinearColor::MakeRandomColor());
	}
}
#endif

1. 에디터 전용으로만 사용 할 수 있는 머터리얼 방법과 매크로 사용 이유에대해 다시한번 확인 할 수 있다.

더보기
#pragma once

#include "CoreMinimal.h"
#include "IDetailCustomization.h"

// 싱글톤으로 만들거라 생성, 소멸자 제거
class EXAMPLE_API FStaticMesh_Detail
	: public IDetailCustomization
{

private:
	TArray<TWeakObjectPtr<UObject>> Objects;
};
#include "StaticMesh_Detail.h"
#include "DetailLayoutBuilder.h"
#include "DetailCategoryBuilder.h"
#include "DetailWidgetRow.h"
#include "Misc/MessageDialog.h"

#include "CStaticMesh.h"

void FStaticMesh_Detail::CustomizeDetails(IDetailLayoutBuilder& DetailBuilder)
{
	// 자기자신의 자료형이 선택된걸 리턴해주는 함수
	// 이런 함수가 없다면, 에디터에 World를 가져와서 처리해야한다.
	DetailBuilder.GetObjectsBeingCustomized(Objects);
}

1. <TWeakObjectPtr>UObject로 쓰여져있다.

2. UObject로 상속되어 있는 객체는 전부 가비지컬렉터로 관리되고 있기 때문에 WeakPtr로 사용하는 것이다.

3. 우리가 판단해서 관리할 수 없고, 연결만 해주면서, 포인터로만 사용하면된다.

 

더보기
#pragma once

#include "CoreMinimal.h"
#include "IDetailCustomization.h"

// 싱글톤으로 만들거라 생성, 소멸자 제거
class EXAMPLE_API FStaticMesh_Detail
	: public IDetailCustomization
{
private:
	FReply OnClicked_Paint();
	FReply OnClicked_SaveMesh();
};
#include "StaticMesh_Detail.h"
#include "DetailLayoutBuilder.h"
#include "DetailCategoryBuilder.h"
#include "DetailWidgetRow.h"
#include "Misc/MessageDialog.h"

#include "CStaticMesh.h"

FReply FStaticMesh_Detail::OnClicked_Paint()
{
	for (TWeakObjectPtr<UObject> obj : Objects)
	{
		// csat해서 확인후 obj
		ACStaticMesh* mesh = Cast<ACStaticMesh>(obj);

		if (!!mesh)
			mesh->Paint(); // 색 변경 함수 콜해준다.
	}

	// 클릭용
	return FReply::Handled();
}

1. 랜덤 색 변경 함수를 콜해줌으로써, Paint를 클릭하면 색이 변화되는걸 볼 수 있다.

더보기
#pragma once

#include "CoreMinimal.h"
#include "IDetailCustomization.h"

// 싱글톤으로 만들거라 생성, 소멸자 제거
class EXAMPLE_API FStaticMesh_Detail
	: public IDetailCustomization
{
private:
	FReply OnClicked_Paint();
	FReply OnClicked_SaveMesh();
};
#include "StaticMesh_Detail.h"
#include "DetailLayoutBuilder.h"
#include "DetailCategoryBuilder.h"
#include "DetailWidgetRow.h"
#include "Misc/MessageDialog.h"

#include "CStaticMesh.h"

void FStaticMesh_Detail::CustomizeDetails(IDetailLayoutBuilder& DetailBuilder)
{
mesh.AddCustomRow(FText::FromString("SaveMesh"))
		.NameContent() 
		[
			SNew(STextBlock)
			.Text(FText::FromString("Mesh"))
		]
	.ValueContent() 
		[
			SNew(SButton) 
			.VAlign(VAlign_Center) 
		.HAlign(HAlign_Fill) 
		.OnClicked(this, &FStaticMesh_Detail::OnClicked_SaveMesh)
		//.Content() 
		[
			SNew(STextBlock)
			.Text(FText::FromString("SaveMesh"))
		]
		];

	// 자기자신의 자료형이 선택된걸 리턴해주는 함수
	// 이런 함수가 없다면, 에디터에 World를 가져와서 처리해야한다.
	DetailBuilder.GetObjectsBeingCustomized(Objects);
}

// 에디터 상에서만 끼워넣기 때문에, 게임모드인지 확인할 수 있는 방법이 없다.
FReply FStaticMesh_Detail::OnClicked_SaveMesh()
{
	// 게임모드인지를 모르지만 실행하려면, 어떠한 한 객체가 선택이 되어있어야만 한다.
	// 그래서 Objects 0번을 확인하면, 그 객체가 게임상 월드인지 에디터상 월드인지 판단이 가능하다.
	if (Objects[0]->GetWorld()->IsPlayInEditor())
	{
		FMessageDialog dialog;
		dialog.Debugf(FText::FromString("In game mode, it is not working."));

		// 처리를 못했으므로, Un으로 return 해주기, 밑으로 내려줘야 하기 때문
		return FReply::Unhandled();

	}

	TArray<ACStaticMesh*> meshActors;
	for (TWeakObjectPtr<UObject> obj : Objects)
	{
		ACStaticMesh* mesh = Cast<ACStaticMesh>(obj);
		if (mesh == nullptr) continue; // cast후 null이면 저장할 자료형이 아니므로 끝

		meshActors.Add(mesh); // 저장
	}

	return FReply::Handled();
}

1. Mesh에 정점을 가져와서 저장해주고

2.  Save 버튼을 누르면 Static 컴포넌트 안에 있는 Static Mesh 정보를 파일로 저장하기 위한 초기 작업.

 

- 다음에 이어서 정점을 다뤄볼 것이다.

'언리얼' 카테고리의 다른 글

UE4 Save StaticMesh  (0) 2023.04.13
UE4 StaticMesh  (0) 2023.04.12
UE4 StaticMesh  (0) 2023.04.06
UE4 Console, Command  (0) 2023.04.05
UE4 DrawDebugLine  (0) 2023.04.04
Comments