초보 코린이의 성장 일지
UE4 StaticMesh 본문
더보기
#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