NDC/Dev

[NDC 2016] 유니티, iOS에서 LINQ 사용하기

MAKGA 2023. 1. 15. 21:50
320x100

LINK(Language Integrated Query): 데이터 저장소 종류와 관계 없이 저장소에 일관성 있는 인터페이스로 질의

- 동일한 인터페이스 사용

- 다양하고 편리한 기능 (Max, Min, Average, OrderBy, First ...)

- 지연 실행 (성능 이점)

- 간결한 High Level 코드 품질

- 컴파일 타임 에러 체크

 

int[] numbers = { 5, 10, 8, 3, 6, 12 };

 

Query syntax

var result = from num in numbers
             where num % 2 == 0
             orderby num
             select num * 2;

Method syntax

var result = numbers
             .Where(num => num % 2 == 0)
             .OrderBy(num => num)
             .Select(num => num * 2);

 

 

사용 예시

1) 퀘스트들의 제목을 출력해주세요

2) 입장한 맵에 해당되는 퀘스트들만 보여줍니다

3) 현재 진행 중이어야 하고요

4) 진행 상태가 높은 퀘스트를 가장 먼저 출력합니다.

5) 진행 상태가 같은 경우 퀘스트 아이디가 낮은 순서로 출력합니다.

 

Non LINQ

List<Quest> result = new List<Quest>();
foreach (Quest quest in quests)
{
    if (quest.isActive)
    {
        if (quest.MapIndex == currentMapIndex)
            results.Add(quest);
    }
}

results.Sort((x, y) =>
{
    int compareValue = y.Progress.CompareTo(x.Progress);
    if (compareValue == 0)
        return x.ID.CompareTo(y.ID);
    return compareValue;
});

LINQ

var result = quests
             .Where(quest => quest.IsActive)
             .Where(quest => quest.MapIndex == currentMapIndex)
             .OrderByDescending(quest => quest.Progress)
             .ThenBy(quest => quest.ID);

 

 

 

IOS 환경에서 LINQ를 사용할 수 없는 이유는 LINQ 자체의 결함이 아니라 mono AOT 컴파일러의 버그가 원인!

해결 방법

IL2CPP (IOS 64bit 지원을 위해서 반드시 사용)

UniLinq (https://github.com/RyotaMurohoshi/UniLinq): 낮은 버전의 Unity를 사용해야 한다면 Third party 사용


출처: http://ndcreplay.nexon.com/NDC2016/sessions/NDC2016_0047.html

320x100