검색 표현식을 사용하면 검색 쿼리 언어를 추가하여 여러 제공자를 교차 참조하는 복잡한 쿼리(예: 씬에서 컴파일하지 않는 셰이더를 사용하는 모든 오브젝트 검색)를 표현할 수 있게 해줍니다.
검색 표현식을 연결하여 검색 항목에서 세트 조작을 수행하거나 변환할 수 있습니다.
Search 창에 검색 표현식을 입력하여 결과를 반환합니다.
검색 표현식은 inner 표현식을 포함할 수 있는 root 표현식으로 시작합니다.
t:shader
와 같은 단순한 쿼리는 표현식입니다. 이 표현식은 프로젝트의 셰이더에 상응하는 모든 검색 항목을 반환합니다.
검색 표현식 언어를 사용하여 여러 개의 쿼리를 하나의 표현식으로 합치고 더욱 유연하게 검색할 수 있습니다.
검색 표현식은 다음을 지원합니다.
- 쿼리: t:shader
- 중첩된 표현식이 있는 쿼리: t:prefab ref={t:texture}
- 함수: count{t:shader}
- 리터럴: 3
또는 "this is a string literal"
- 프로퍼티 선택자: @path 또는 @mesh
(@
으로 시작하는 모든 식별자는 검색 항목에서 값을 추출하는 선택자로 간주됩니다. 선택자는 오브젝트의 프로퍼티를 찾을 수 있거나, 동적으로 결과를 계산하는 데 사용될 수 있습니다)
모든 검색 표현식은 검색 항목 세트를 반환합니다(IEnumerable<SearchItem>
). 일반적으로 검색 표현식 언어에서는 중괄호 {}
를 사용하여 항목 세트를 표기합니다. 3
과 같은 리터럴 표현식도 내부적으로는 세트 {3}
으로 평가됩니다.
다음과 같이 검색 표현식을 연결하여 더 복잡한 쿼리를 할 수 있습니다.
t:prefab ref={t:texture}
쿼리의 t:texture
부분은 프로젝트의 모든 텍스처를 찾습니다.
쿼리의 t:prefab ref=
부분은 프로젝트의 텍스처를 참조하는 모든 프리팹을 찾습니다.
t:prefab ref={t:texture size>4000}
: 텍스처 크기가 4,000바이트보다 큰 프로젝트의 모든 프리팹을 찾습니다.
이는 다음과 동등합니다.
- 프로젝트의 모든 4K 텍스처(예: armor.png
, treasure.png
)의 리스트를 반환하기 위해 t:texture size>4000
실행
- t:prefab ref=<one of the 4K textures>
실행(예: t:prefab ref=armor.png
와 t:prefab ref=treasure.png
를 차례로 실행)
- 모든 결과를 집계하여 하나의 검색 항목 리스트로 반환
t:[shader, material, texture]
: 타입이 shader
, material
또는 texture
인 모든 오브젝트를 찾습니다. 노멀 쿼리를 사용하면 다음과 같이 표현할 수 있습니다.
t:shader or t:material or t:texture
Unity에는 여러 검색 항목을 조작하고 변환할 수 있는 검색 표현식 함수의 라이브러리가 있습니다. 각 함수는 여러 개의 인수를 가져와 항목 세트를 반환할 수 있습니다. Unity 검색 표현식은 중괄호를 사용하여 함수 호출을 표기합니다.
모든 함수가 포함된 전체 리스트는 여기서 확인하십시오.
예: count
함수는 파라미터로 전달된 각 세트의 항목 수를 세서 숫자를 반환합니다.
count{t:shader}
: 프로젝트의 셰이더 수를 포함하는 세트를 반환합니다(예: {34}
).count{t:shader, t:texture}
: 프로젝트의 셰이더와 텍스처의 수를 포함하는 세트를 반환합니다(예: {34, 2048}
).LISP 프로그래밍 언어에서 사용되는 s-expression과 비슷하게 함수를 연결할 수 있습니다.
참고: root 표현식은 하나만 존재할 수 있습니다.
평가되는 함수 체인 예시(작업순):
print{"path=@path", first{10, sort{t:texture, @size}}}
: 프로젝트의 텍스처 중 가장 큰 10개의 경로를 프린트
t:texture
: 프로젝트의 모든 텍스처를 찾아 크기 프로퍼티를 선택합니다.sort{ t:texture, @size}
: 모든 텍스처를 각 텍스처의 크기 프로퍼티에 따라 모두 정렬합니다.first{10
: 정렬 순서상 첫 10개에 해당하는 텍스처를 선택합니다.print{ "path=@path"
: Unity 검색이 각 결과 항목의 경로 프로퍼티 path=@path
를 추출하는 형식 문자열에 따라 콘솔에 이 리스트를 프린트합니다.함수의 서명은 여러 개일 수 있으며(C#과 유사하게 메서드의 이름 및 각 공식 파라미터의 타입과 종류(값, 레퍼런스 또는 출력)), 선택적 파라미터(함수에 전달될 필요가 없는 파라미터) 및 가변 (가변적 수의 인수를 가져올 수 있는 파라미터) 파라미터를 지원할 수 있습니다.
리터럴은 쿼리 언어와는 반대로 검색할 실제 단어나 숫자 또는 검색해서 가져올 숫자의 금액입니다. 예를 들어, t:texture는 타입 이름에 texture가 포함된 에셋(예: Texture2D)을 검색하지만, 여기에 따옴표를 추가하여(“t:texture”) 리터럴로 만들면 “t:texture”는 이름이 t:texture인 에셋을 검색합니다.
Expression | 설명 |
---|---|
Number | 리터럴 숫자(1,2,3, and so on ) |
Set | 대괄호([ ] ) |
String | 작은따옴표 또는 큰따옴표('' 또는 "" ) |
숫자 리터럴은 함수의 파라미터로 사용할 수 있습니다(예: first
).
first{10, t:shader}
-> {the first 10 shaders return by the 't:shader' query}
대괄호([]
)를 사용하여 값 세트를 표현합니다. 세트는 모든 타입의 표현식을 포함할 수 있으나, 검색 표현식 구문 분석기는 세트 요소가 검색 쿼리가 아닌 리터럴이라고 추정합니다.
예:
[t:shader, hello, 3]
-> ["t:shader", "hello", 3]
(두 개의 문자열과 숫자 하나가 포함된 세트 검색)
중괄호({}
)를 사용하는 경우, 구문 분석기가 이를 다음 3개의 쿼리로 취급합니다.
{t:shader, hello, 3}
-> {<run a query for t:shader>, <run a query for hello>, <run a query for 3>}
문자열 리터럴은 일부 함수(예: format
)의 파라미터로 사용할 수 있습니다. 다음과 같이 작은따옴표나 큰따옴표를 사용하는 문자열 리터럴을 지정할 수 있습니다.
“hello” 또는 ‘hello’
형식 문자열을 파라미터로 가져오는 형식 함수:
format{t:texture, '@path (@size)'}
선택자는 @
접두사를 사용하여 표기된 식별자입니다. 선택자를 사용하여 항목의 프로퍼티에 액세스해 계산, 필터링 또는 형식을 지정할 수 있습니다. 선택자는 동적 데이터에 대한 액세스를 허용하기 위해 UnityEngine.Object의 직렬화된 프로퍼티 또는 커스텀 함수에 매핑될 수 있습니다.
모든 검색 항목에서 지원되는 기반 선택자는 다음과 같습니다.
id
: 이 항목의 고유한 ID(검색 제공자에 의거).value
: 항목의 내부값. 기본적으로 항목의 ID이지만, 함수가 항목의 값을 오버라이드할 수 있습니다.label
: Search 창에 표시되는 항목 레이블desc
또는 description
: 항목 설명(Search 창의 두 번째 줄)Unity는 검색 항목의 일반 선택자도 정의합니다. 예:
- @name
: UnityEngine.Object.name
- @size
: 에셋에 대한 디스크의 파일 크기
- @path
: 에셋 경로
- @extension
: 에셋 파일 확장자
- @provider
: 이 항목을 산출한 검색 제공자
작업을 수행하기 위해 검색 항목의 특정 프로퍼티에 액세스하려면 다음 선택자를 사용합니다.
- count{t={distinct{select{a:assets, @type}}}}
- a:assets, @type
은 이름이 assets
인 오브젝트를 모두 찾은 다음, 해당 오브젝트의 type
프로퍼티를 선택합니다.
- distinct
는 존재하는 모든 타입의 리스트를 반환합니다.
- t={list of types}
는 타입별로 각 에셋의 리스트 여러 개를 반환합니다.
- count
는 프로젝트에 각 타입의 에셋이 몇 개 있는지 계산합니다.
- avg{@size,t:shader}
- t:shader, @size
: 모든 셰이더를 찾은 다음 size 프로퍼티를 선택합니다.
- avg
: 프로젝트에 포함된 모든 셰이더의 평균 크기를 계산합니다.
print{@value, count{t:texture, t:material}}
@#
선택자가 다음과 같이 직렬화 프로퍼티와 머티리얼 프로퍼티를 찾습니다.
sort{t:texture, @#height}
: 높이 직렬화 프로퍼티 순으로 모든 텍스처를 정렬합니다.Search 창에 표시되었을 때 더 알아보기 쉽도록 검색 표현식의 이름을 지정할 수 있습니다.
예를 들어, Search 창에 sort{count{t:audio, t:texture}, @value,desc}
표현식을 입력하면 어느 개수가 어느 타입에 해당하는지 알아보기가 어려울 수 있습니다.
이때 별칭으로 sort{count{t:audio as Audio, t:texture as Texture}, desc}
을 사용하면 보다 가독성 높은 결과가 산출됩니다.
별칭 이름을 동적으로 생성하려면 alias
함수를 사용하십시오. 예:
alias{[1, 2, 3], 'Title value'}
이 함수는 다음 레이블이 있는 항목이 산출됩니다.
{Title 1, Title 2, Title 3}
확장 조작자 ...
는 한 세트의 항목이 한 세트가 아닌 여러 세트의 항목으로 그룹화될 수 있게 합니다.
...{expandable expression}
-> {sub expr 1} {sub expr 2} {sub expr N}
예:
소규모 프로젝트에 3개의 프리팹, 4개의 텍스처와 5개의 셰이더가 있는 경우, 다음 표현식은 이 모든 요소의 수를 제공합니다.
count{t:[prefab, texture, shader]}
-> {12}
검색 표현식 t:[prefab, texture, shader]
의 결과는 타입 프리팹, 텍스처와 셰이더를 포함하여 12가지 항목으로 구성된 합계 리스트입니다. 이는 t:prefab or t:texture or t:shader
로도 표현할 수 있습니다.
각 에셋 타입의 수를 별도로 세려면 확장 조작자를 사용하십시오.
count{...t:[prefab, texture, shader]}
-> count{t:prefab, t:texture, t:shader}
-> {3, 4, 5}
groupBy
함수를 확장 조작자와 함께 사용하여 공통 키로 그룹화된 항목 세트를 반환할 수 있습니다.
예:
프로젝트에는 세 가지 타입의 에셋(프리팹, 텍스처, 셰이더)이 있습니다. 검색 항목 타입을 반환하는 선택자 @type
이 있다고 가정하면, 표현식이 다음과 같이 확장됩니다.
count{t:prefab or t:texture or t:shader}
groupBy
함수를 사용하여 항목을 타입별로 그룹화한 다음, 타입별 항목 수를 셀 수 있습니다.
count{...groupBy{t:prefab or t:texture or t:shader, @type}}
이러한 예시는 검색 표현식이 어떻게 프로젝트의 복잡한 요청에 사용될 수 있는지 보여줍니다.
씬의 프리팹 사용량 계산 및 사용량이 높은 순으로 정렬:
sort{select{p: t:prefab *.prefab, @path, count{t:scene ref:@path} as count}, @count, desc}
모든 에셋 유형 정렬 및 계산
sort{count{...groupby{a:assets, @type}}, @value, desc}
버텍스가 가장 많은 메시 찾기(프로젝트에서 @vertices 선택자를 사용할 수 있음을 가정)
first{sort{t:mesh, @vertices, desc}}
메시의 버텍스 수를 기준으로 모든 메시 정렬
sort{select{h: t:mesh, @path, @vertices}, @vertices, desc}
모든 메시의 버텍스 수 계산
sum{select{h:t:mesh, @vertices}}
메시를 참조하는 모든 에셋 찾기
ref=select{p:t:mesh, @path}
프리팹 씬 레퍼런스 수 나열
select{p: *.prefab, @path, count{p: a:sceneIndex ref="@path"} as count}
검색 표현식 평가는 C#반복자 패턴에 기반하며 산출 키워드를 사용합니다. 이는 평가가 완전한 비동기식 작업으로 노출되며 최대한 차단하지 않도록 보장합니다. 또한 각 검색 표현식이 첫 검색 항목 세트가 계산 완료되기 전에 계산을 시작하도록 허용합니다.
기본적으로 모든 검색 표현식 평가는 에디터를 차단하지 않도록 워커 스레드에서 수행됩니다. 안전한 비스레드 Unity API에 의존해야 하는 작업(예: 일부 선택자 접근자)의 경우, 이러한 작업을 메인 스레드에 대기시키고 산출된 검색 항목의 패턴을 유지하기 위한 유틸리티 API가 있습니다.
검색 표현식 언어는 커스터마이즈가 가능하도록 고안되었습니다. 향후 릴리스에서 프레임워크의 모든 부분을 커스터마이즈할 수 있는 API가 제공됩니다.