일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- rpc
- UI
- Unreal Engine
- gameplay tag
- 언리얼 엔진
- photon fusion2
- gas
- gameplay effect
- 보안
- unity
- CTF
- 언리얼엔진
- network object pooling
- attribute
- Aegis
- os
- 유니티
- nanite
- Multiplay
- gameplay ability system
- 게임개발
- stride
- 게임 개발
- local prediction
- ability task
- listen server
- Replication
- map design
- animation
- MAC
- Today
- Total
Replicated
[ChronoSpace] Static Mesh Scale과 관계없는 Meterial 본문
https://www.youtube.com/watch?v=JGJWNPI6sMw
메테리얼 자체는 이거 보고 따라 만들었다
1. 메테리얼 컴포넌트 만들어 붙이기
일단 스태틱 매시 컴포넌트 만들고 메시 붙이기
메시는 그냥 기존 흰 색 큐브 복사해서 폴더만들어서 넣어놓기만 한 거
2. 메테리얼 컴포넌트 위치 조정 관련
만들었던 트리거는 중심이 0, 0, 0으로 지정되는데,
큐브 메시는 한 꼭짓점이 0, 0, 0으로 설정되어 있는 듯 하자
그런데 이거 조정이 Maya같은 외부 프로그램을 써야 한다는 얘기도 있고,
수정하긴 어려워보여서 직접 계산해서 옮겨준다
그런데 트리거 크기에 메시 크기를 맞춰야 하니까, 몇 배 해야하는지 계산하는 코드이다
트리거의 Extent는 반경이라, 큐브의 반경인 50을 기준 값으로 삼아서 계산
3. 스태틱 메시의 Scale과 무관하게 타일 크기를 유지하는 메테리얼
스태틱 메시 크기를 박스 컴포넌트 크기에 맞추기 위해 스케일을 바꾸면, 당연하지만 메테리얼이 같이 확장된다
그런데, 크기가 조정되는 중력 필드를 만드려고 하는데 크기 조정할 때 메테리얼이 같이 커지면 퀄리티가 별로일 것이다
타일링이란 값이 메시 블루프린트에 존재하는데, 저 값이 메테리얼 타일 크기를 조절한다
저 값을 조절해야 하면 된다
그런데, 유튜브 영상에 나오는 것처럼 에디터에서 인스턴스 만들면(정적 인스턴스) 저 값을 조정하는 것이 불가능함
→ 동적 인스턴스를 만들어줘야 한다 (코드 상에서, UMaterialInstanceDynamic)
타일링 기본 값 찾아와서 메시 스케일이랑 곱해준 값을 타일링 값으로 재설정하면 메테리얼의 타일 크기가 유지된다
정상 작동 확인 가능하다
ACSTA_ReverseGravityBox::ACSTA_ReverseGravityBox()
{
// Trigger
ReverseGravityTrigger = CreateDefaultSubobject<UBoxComponent>(TEXT("ReverseGravityTrigger"));
RootComponent = ReverseGravityTrigger;
ReverseGravityTrigger->SetBoxExtent(FVector(BoxExtentSize, BoxExtentSize, BoxExtentSize));
ReverseGravityTrigger->SetRelativeLocation(FVector(0.0f, 0.0f, 0.0f));
ReverseGravityTrigger->SetCollisionProfileName(CPROFILE_CSTRIGGER);
ReverseGravityTrigger->OnComponentBeginOverlap.AddDynamic(this, &ACSTA_ReverseGravityBox::OnTriggerBeginOverlap);
ReverseGravityTrigger->OnComponentEndOverlap.AddDynamic(this, &ACSTA_ReverseGravityBox::OnTriggerEndOverlap);
// Static Mesh
StaticMeshComp = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("StaticMeshComp"));
StaticMeshComp->SetCollisionEnabled( ECollisionEnabled::NoCollision );
StaticMeshComp->SetupAttachment(ReverseGravityTrigger);
//StaticMeshComp->SetRelativeLocation(FVector(-0.0f, -0.0f, -0.0f));
static ConstructorHelpers::FObjectFinder<UStaticMesh> StaticMeshRef(TEXT("/Script/Engine.StaticMesh'/Game/Mesh/StaticMesh/SM_Cube.SM_Cube'"));
if (nullptr != StaticMeshRef.Object)
{
StaticMeshComp->SetStaticMesh(StaticMeshRef.Object);
}
FVector BoxExtent = FVector(BoxExtentSize, BoxExtentSize, BoxExtentSize);
float HalfSizeOfSide = 50.0f; // SM_Cube 기본 사이즈가 100x100x100 -> 반경(Extent) 기준 50
FVector LocationOffset = FVector(-HalfSizeOfSide, -HalfSizeOfSide, -HalfSizeOfSide);
FVector MeshScale = BoxExtent / HalfSizeOfSide;
StaticMeshComp->SetRelativeLocation(LocationOffset * MeshScale);
StaticMeshComp->SetRelativeScale3D(MeshScale);
static ConstructorHelpers::FObjectFinder<UMaterial> MaterialRef(TEXT("/Script/Engine.Material'/Game/Material/MAT_AntyGravity.MAT_AntyGravity'"));
if ( MaterialRef.Succeeded() )
{
UMaterialInstanceDynamic* DynMaterial = UMaterialInstanceDynamic::Create(MaterialRef.Object, this);
if (DynMaterial)
{
float OutBaseValue = 2.0f;
DynMaterial->GetScalarParameterValue(FName(TEXT("Tiling")), OutBaseValue);
DynMaterial->SetScalarParameterValue(FName(TEXT("Tiling")), OutBaseValue * MeshScale.X);
StaticMeshComp->SetMaterial(0, DynMaterial);
}
}
}
'언리얼 엔진 > ChronoSpace' 카테고리의 다른 글
[ChronoSpace] Black Hole & White Hole (0) | 2025.01.26 |
---|---|
[ChronoSpace] 밀리는 Character (0) | 2025.01.25 |
[ChronoSpace] 중력 반전 #2 / Box Trigger (0) | 2025.01.17 |
[ChronoSpace] 중력 반전 #1 / SweepMultiByChannel (0) | 2025.01.16 |
[ChronoSpace] 트레이스 세팅, 움직임 동기화 (0) | 2025.01.15 |