5.12.2014

범위 기반 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

PixARK Dev Kit으로 만드는 나만의 복셀 월드

에픽게임즈 런처에서 Snail Games가 제공한 모드 제작 툴로 재밌는 PixARK 월드를 만들어보세요.

Drive Studio, 언리얼 엔진으로 Fox Sports의 2018 FIFA 월드컵 방송 제작

Drive Studio는 언리얼 엔진의 강력함을 활용해 FOX Sports 채널의 2018 FIFA 월드컵 중계에서 사용할 배경, 중간...

에픽게임즈, 언리얼 엔진 마켓플레이스의 수익 배분율 88% / 12%로 변경

에픽게임즈는 언리얼 엔진 마켓플레이스의 수익 배분율을 기존의 70% / 30% 에서 88%로 변경하고, 이

...