티스토리 뷰
지난 번 까지는 언리얼 엔진 뷰포트 상에 있는 액터를 선택하고, 선택된 엑터를 균일한 간격으로 복제하는 기능을 구현했다.
이번 포스팅에서는 선택된 엑터의 회전, 크기, 위치 등을 랜덤하게 바꿔주는 기능을 추가한다.
회전 구현은 어렵지 않다. 선택된 엑터들에 대한 rotation 값을 받아오고 Math::RandRange(val1, val2)를 사용하여 랜덤 값을 얻어내어 회전 값에 추가하면 된다.
처음으로 작성한 코드에서는
//FRotator ActorRotation = SelectedActor->GetActorRotation();
//ActorRotation.Yaw += randRange;
//SelectedActor->SetActorRotation(ActorRotation);
위와 같은 방식으로 Rotaion 값을 얻어내어 수정했는데 언리얼에서는
const float randRange =
(float)FMath::RandRange(RandomActorRotation.RotYawMin, RandomActorRotation.RotYawMax);
SelectedActor->AddActorWorldRotation(FRotator(0.f, randRange, 0.f));
AddActorWorldRotation() 함수를 이용하여 한번에 처리 가능하다.
회전 적용 이미지.
scale과 location 또한 비슷한데 스케일은
const float randSacleValue = (float)FMath::RandRange(ScaleMin, ScaleMax);
SelectedActor->SetActorScale3D(FVector(randSacleValue));
위와 같이 SetActorScale3D 함수를 이용하며 이동은
SelectedActor->AddActorWorldOffset(FVector(randOffsetValue, randOffsetValue, randOffsetValue));
를 사용한다. 이 정도가 차이점이 된다.
전체 코드는 아래.
void UQuickActorActionsWidget::RandomizeActorTransform()
{
const bool bConditionNotSet =
!RandomActorRotation.bRandomizeRotYaw &&
!RandomActorRotation.bRandomizeRotPitch &&
!RandomActorRotation.bRandomizeRotRoll&&
!bRandomizeScale && !bRandomizeOffset ;
if (bConditionNotSet)
{
DebugHeader::ShowNotifyInfo(TEXT("No variation condition specified."));
return;
}
if (!GetEditorActorSubsystem()) return;
TArray<AActor*> SelectedActors = EditorActorSubsystem->GetSelectedLevelActors();
uint32 Counter = 0;
if (SelectedActors.Num() == 0)
{
DebugHeader::ShowNotifyInfo(TEXT("No Actor Selected."));
return;
}
for (auto SelectedActor : SelectedActors)
{
if (!SelectedActor) continue;
if(RandomActorRotation.bRandomizeRotYaw)
{
const float randRangeYaw = (float)FMath::RandRange(RandomActorRotation.RotYawMin, RandomActorRotation.RotYawMax);
SelectedActor->AddActorWorldRotation(FRotator(0.f, randRangeYaw, 0.f));
}
if (RandomActorRotation.bRandomizeRotPitch)
{
const float randRangePitch = (float)FMath::RandRange(RandomActorRotation.RotPitchMin, RandomActorRotation.RotPitchMax);
SelectedActor->AddActorWorldRotation(FRotator(randRangePitch, 0.f, 0.f));
}
if (RandomActorRotation.bRandomizeRotRoll)
{
const float randRangeYRoll = (float)FMath::RandRange(RandomActorRotation.RotRollMin, RandomActorRotation.RotRollMax);
SelectedActor->AddActorWorldRotation(FRotator(0.f, 0.f, randRangeYRoll));
}
if (bRandomizeScale)
{
const float randSacleValue = (float)FMath::RandRange(ScaleMin, ScaleMax);
SelectedActor->SetActorScale3D(FVector(randSacleValue));
}
if (bRandomizeOffset)
{
const float randOffsetValueX = (float)FMath::RandRange(OffsetMin, OffsetMax);
const float randOffsetValueY = (float)FMath::RandRange(OffsetMin, OffsetMax);
const float randOffsetValueZ = (float)FMath::RandRange(OffsetMin, OffsetMax);
SelectedActor->AddActorWorldOffset(FVector(randOffsetValueX, randOffsetValueY, randOffsetValueZ));
}
Counter++;
}
if (Counter > 0)
{
DebugHeader::ShowNotifyInfo(TEXT("Successfully set ") + FString::FromInt(Counter)
+ TEXT(" actors."));
}
}
WBP 상에서는 디테일 뷰에 카테고리를 추가해준다.
그러면 코드상으로 카테고리가 동일한 값들을 디테일 뷰에서 볼 수 있다.
Git -> https://github.com/InKyung-U/CustomEditor
GitHub - InKyung-U/CustomEditor
Contribute to InKyung-U/CustomEditor development by creating an account on GitHub.
github.com
'Unreal > Custom Editor' 카테고리의 다른 글
[UE 5.1] Actor Duplicate - 1 (0) | 2023.10.27 |
---|---|
[UE 5.1] Custom Material Tool - 2 (1) | 2023.10.13 |
[UE 5.1] Custom Material Tool - 1 (0) | 2023.10.11 |
[UE 5.1] Custom Icon (0) | 2023.09.20 |
[UE 5.1] Custom Slate Widget 04 (0) | 2023.09.19 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- FPS
- sort
- 해시
- 누적합
- LV3
- 데디케이티드
- 프로그래머스
- Ue
- IMGUI
- level3
- Heap
- 완전탐색
- 고득점kit
- UE5
- BFS
- 재귀
- 채팅서버
- 스택/큐
- 고득점 Kit
- 너비우선탐색
- 디자인 패턴
- Unreal 5.1
- greedy
- DFS
- C++
- LV2
- 정렬
- 개인공부
- 힙
- 탐욕법
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함