2014-5-12

범위 기반 For 루프

By * 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 또는 포럼 에서 만나요!

Recent Posts

리얼타임 기술의 잠재력을 선보인 Theia Interactive의 Harley Davidson AR

증강 현실은 리얼타임 프로젝트 샘플을 통해 비즈니스 고객들을 설득하는 중요한 도구로 자리잡았습니다. Theia Interactive가 ...

2018년 4월 NVIDIA Edge 프로그램 수상자

4월에도 NVIDIA Edge 프로그램에 멋진 작품들이 많이 제출되었으며, 그 중에서 세 개의 작품을 뽑아 수상작으로 선정하였습니다. ...

언리얼 엔진으로 BMW 차량 디자인에 혼합 현실 구현

리얼타임 기술과 VR이 자동차 제조의 새로운 시대를 열고 있는 가운데, 자동차 디자인 분야는 빠르게 변화하고 있습니다. BMW와 MIN...