2014. 5. 12.

범위 기반 For 루프

글쓴이 * James Golding

언리얼 엔진 4 코드 베이스에서 C++11 에 추가된 몇 가지 멋진 기능을 활용하기로 했습니다. 새 언어를 채택할 때는 주의를 기울여야 하는 것이, 다양한 컴파일러가 지원되는 다양한 범위의 플랫폼을 대상으로 삼기 때문입니다. 제가 자주 사용하는 신기능 중 하나는 'range-based for loop' (범위 기반 for 루프)로, 이제 언리얼의 TArray, TMap, TSet 컨테이너에 작동합니다. 이를 통해 흔히 볼 수 있는 게임 코드가 얼마나 말끔해지는지, 그 예제는 이렇습니다. 기존에는 AActor* 포인터 배열에 대해 반복처리를 하고자 했다면 이렇습니다:

TArray<AActor*> Actors;

for (int32 ActorIndex=0; ActorIndex<Actors.Num(); ActorsIndex++)

{

AActor* Actor = Actors[ActorIndex];

Actor->SetActorLocation(NewLocation);

}

하지만 '범위 기반 for 루프' 문법을 사용하면 이렇습니다:

TArray<AActor*> Actors;

for (AActor* Actor : Actors)

{

Actor->SetActorLocation(NewLocation);

}

얼마나 멋집니까! TMap 예제 하나 더 들어 보자면, 원래는 이랬던 것이:

TMap<AActor*, FMyStruct> ActorStructs;

for (auto ActorStructIt = ActorStructs.CreateIterator(); ActorStructIt; ++ActorStructIt)

{

AActor* Actor = ActorStructIt.Key();

FMyStruct& Data = ActorStructIt.Value();

}

이제 이렇게 됩니다:

TMap<AActor*, FMyStruct> ActorStructs;

for (const auto& Entry : ActorStructs)

{

AActor* Actor = Entry.Key;

const FMyStruct& Data = Entry.Value;

}

참고로 선언하고자 하는 변수에는 'const' 나 '&' 를 붙여줘야 합니다. 예:

TArray<FVector> Positions;

for (FVector& Position : Positions)

{

Position.z += 10.f;

}

FVector 를 복사 아닌 참조를 위해서는 '&' 를 붙여줘야 합니다. 엔진의 모든 for 루프 포맷을 변경하지는 않을테지만, 확실히 앞으로는 이 문법을 많이 사용하게 될 것 같습니다.

이 기능에 대한 여러분의 생각이 어떠한지 듣고 싶고, 질문이 있으시면 답해드리고자 합니다. 트위터 @EpicJamesG 또는 포럼 에서 만나요!

최근 게시글

언리얼 엔진 4.19 프리뷰 1 출시

현재 에픽게임즈 런처에서 언리얼 엔진 4.19의 첫번째 프리뷰를 다운로드하실 수 있습니다. 지금 다운로드하셔서 새로운 기능들을 확

...

에픽게임즈, 총 200,000 달러 규모의 새로운 언리얼 데브 그랜트 수상 발표

인디 게임, 툴, 그리고 애니메이션을 언리얼 엔진으로 제작하고 있는 세계 여러 개발자들을 선정해 언리얼 데브 그랜트를 수여했습니다.

이미지를 넘어서: 비주얼 디자인을 경험해보다

디자인 경험이라는 것이 과연 무엇을 뜻할까요? 현재 기업들이 언리얼 엔진을 어떻게 작업물의 새롭고 강력한 테스트 방법으로 활용하고 있는...