Unity Search는 각종 파일(씬, 어셋, 리소스)과 오브젝트, 다양한 것들을 (설정, 메뉴, 패키지, 정적 API, 프리셋) 쉽게 찾을 수 있는 도구이다.

(Unity 21.1부터 에디터에서 기본으로 제공, 이전 버전에선 Quick Search 패키지 형태로 제공)

| Search Window

우선 검색을 실행하려면 아래 방법 중 하나를 통해 검색 Window를 활성화할 수 있다.

  • 에디터 상단 메뉴 > Windows > Search > New Window
  • 에디터 상단 메뉴 > Edit > Search All
  • Ctrl + K 단축키
  • Hierarchy / Project 윈도우 > 검색 버튼

 

A
검색 필드
여기에 검색 쿼리를 입력 또는 검색 토글을 추가
B
저장된 검색
검색 쿼리 및 컬럼을 어셋 형태로 저장할 수 있고, 검색 아이콘 을 클릭하여, 창을 표시 또는 숨길 수 있다. 검색 내용을 저장하려면 검색 필드 오른쪽 Save 아이콘을 클릭
C
검색 결과
검색 쿼리에 해당하는 검색 결과가 표시
D
결과 탭
 
E
인스펙터
선택한 오브젝트의 인스펙터가 제공됨 (인스펙터 아이콘 을 클릭)
F
뷰 및 환경설정
검색 결과 뷰를 변경할 수 있고, 설정 창을 열 수 있다. (리스트 / 그리드 / 테이블 뷰)

 

| 검색 쿼리

대표사진 삭제

검색 쿼리는 기존Hierarchy / Project 에디터의 그것과 유사한 문법을 가진다.

(e.g. t: 어셋타입명, b: 번들 라벨명)

 

 

각각 Project, Hierarchy의 검색 필터 목록

물론 훨씬 더 다양한 형태의 필터를 제공한다.

  • 컴포넌트 타입 포함 여부
  • 번들 라벨
  • 이름 / 파일 수정일자 / 디렉토리 / 확장자 / 파일 사이즈
  • 하이라키 필터 (Visible / Hidden, Root / Leaf, Static, Prefab 등등)
  • 라벨
  • 프리팹 (Variant, Modified, Root 등등)
  • 태그 및 레이어
  • Missing 프리팹 / 어셋 / 스크립트 등
  • 참조 (어셋, 오브젝트)
  • 특정 컴포넌트의 프로퍼티

 

| 인덱스 매니저

기본적으로 Assets로 명명된 기본 인덱스를 가진다.

기본적으로 어셋, 오브젝트, 키워드 등의 엘리먼트를 모두 포함하는 형태이기 때문에 대용량의 대규모의 프로젝트의 경우에 검색에 필요한 별도 인덱스를 생성 및 빌드해서 사용하는 것이 좋아 보인다.

 

| 활용 예

 

배경 씬 검색

  • Scenes 인덱스 내에서 검색
  • Unity Scene File을 검색
  • bg_ 키워드를 포함하는 경우

 

Raycast Target가 참인, Graphic 컴포넌트 검색

 

Hierarchy 내에서 검색
  • Raycast Target 참인 경우
  • TextMeshProUGUI / TMP_Sub Mesh UI 컴포넌트를 제외

 

Localize

  • Hierarchy 내에서 검색
  • GameText 컴포넌트를 가진 경우
  • Localize Key 프로퍼티를 검색 결과에 추가

 

Texture 포맷

  • Project 내에서 검색
  • 텍스쳐 파일 검색
  • 디렉토리 지정
  • 압축 포맷 및 텍스쳐 사이즈를 검색결과에 추가

 

Missing Script / Prefab / Asset 검색

  • Hierarchy 내에서 검색
  • 필터 Any (Script, Prefab, Asset) 검색

 

| 결론

 

Unity Search(QuickSearchModule)는 사용이 간편하면서도 강력한 기능을 제공하는 모듈이라 할 수 있다.

기존에는 특정 객체의 검증이나 특정 케이스의 객체를 목록화하려면 개별 오브젝트의 인스펙터를 확인하거나 직접 스크립트를 작성해야 했다.

 

하지만, Unity Search의 경우엔 간단한 설정만으로도 특정 어셋을 찾고, 메뉴 커맨드를 실행할 수 있다.

R&D 및 활용예를 만들면서 포맷이 잘못 설정된 파일을 쉽게 찾을 수 있었다.

 

검색은 기존의 Hierarchy와 Project Window 툴바에서 제공되던 검색 필터와 유사한 방식으로 사용 가능하며, (ex) t:prefab t:scene 등) 좀 더 강화된 검색 표현식(LISP의 S-expression과 유사)을 추가적으로 제공하고 있다. 또한 검색 쿼리 작성 없이 다양한 GUI 검색 필터를 제공하고 있어 사용이 매우 용이했다.

 

기본적으로 제공되는 여러 Search Provider(File, Log, Package, Scene, Adb, Asset, Settings, Menu 등) 외에도 커스마이즈 또한 가능한데, 관련 클래스 및 Attribute, delegate의 정의 만으로 커스텀 Search Provider를 제작할 수 있다.

 

이를 통해 별도의 커스텀 검색과 액션을 지정할 수 있다.

이러한 기능들을 잘 활용한다면 프로젝트 관리와 작업 효율성을 크게 향상시킬 수 있으리라 생각이 든다.

 

| 참고

 

메뉴얼

기본 Search Provider

 

UnityCsReference/Modules/QuickSearch/Editor/Providers at master · Unity-Technologies/UnityCsReference

Unity C# reference source code. Contribute to Unity-Technologies/UnityCsReference development by creating an account on GitHub.

github.com

 

 

반응형

| 개요

유니티 에디터에서 흔하게 볼 수 있는 Flexible한 UI 구성을 자주 볼 수 있다.

사소한 부분이긴 하지만, 사용 편의성이 크게 다가오기도 한다.

 

때문에, 커스텀한 에디터에서 차용하고 싶어도

기존의 IMGUI에선 구현하기가 번거로웠는데 UIToolkit의 TwoPaneSplitView를 이용하면 간단하게 구현이 가능하다.

 

 

Unity - Manual: Create a custom Editor window

Create a Custom Inspector Create a custom Editor window Custom Editor windows allow you to extend Unity by implementing your own editors and workflows. This guide covers creating an Editor window through code, reacting to user input, making the UI(User Int

docs.unity3d.com

위 매뉴얼을 참고하면 쉽게 구분되고 사이즈 조절이 가능한 두개의 패널을 구현할 수 있다.

그렇다면 3개로 구성하되 좌측과 우측은 고정적인 패널로 중앙 부분의 컨텐츠 패널은 Flexible하게 구성할 순 없을까?

 

| 구현

var splitView = new TwoPaneSplitView(0, 300, TwoPaneSplitViewOrientation.Horizontal);
var splitView2 = new TwoPaneSplitView(1, 300, TwoPaneSplitViewOrientation.Horizontal);
{
	// contentView (flexed)
	var scrollView = new ScrollView(ScrollViewMode.VerticalAndHorizontal);
	splitView2.Add(scrollView);

	var fixedPane = CreateInspectorPane();
	splitView2.Add(fixedPane);
}
		
var flexedPane = new VisualElement();
flexedPane.Add(splitView2);
flexedPane.style.minWidth = 200;

splitView.Add(CreateBoardView());
splitView.Add(flexedPane);

rootVisualElement.Add(splitView);
 

간단히 말하자면 2개의 TwoPaneSplitView를 활용하면 된다.

구분
Fixed
Flexed
첫번째 SplitView
Board View(Left)
두번째 SplitView
두번째 SplitView
Inspector (Right)
Content

위와 같이 첫 번째 SplitView는 Flexed Pane에 SplitView를 겹치면 된다.

(TwoPaneSplitView의 생성자에서 첫번째 인자로 Fixed 패널의 인덱스를 지정할 수 있는데 그 부분을 활용하였다.)

좌측/우측 패널은 위치를 고정하고, 컨텐츠 패널만 Flexible하게 구성할 수 있다.

| 예제 코드

using UnityEngine.UIElements;
using UnityEditor;
using UnityEditor.UIElements;

public class FooEditor : EditorWindow
{
	[MenuItem("Tools/Foo", false)]
	static public void Open()
	{
		var window = GetWindow<FooEditor>(false, "Foo", true);
		window.Initialize();
	}

	public void Initialize()
    {
		var splitView = new TwoPaneSplitView(0, 300, TwoPaneSplitViewOrientation.Horizontal);
		var splitView2 = new TwoPaneSplitView(1, 300, TwoPaneSplitViewOrientation.Horizontal);
		{
			// contentView (flexed)
			var scrollView = new ScrollView(ScrollViewMode.VerticalAndHorizontal);
            {
				scrollView.Add(new Label("Content"));
            }
			splitView2.Add(scrollView);

			var fixedPane = CreateInspectorPane();
			splitView2.Add(fixedPane);
        }		
		var flexedPane = new VisualElement();
		flexedPane.Add(splitView2);
		flexedPane.style.minWidth = 200;

		splitView.Add(CreateBoardView());
		splitView.Add(flexedPane);

		var toolBar = new Toolbar();
		{
			var fileButton = new ToolbarButton() { text = "File", name = "FileButton" };
			toolBar.Add(fileButton);

			toolBar.Add(new ToolbarSpacer() { flex = true });

			var helpButton = new ToolbarButton() { text = "Help" };
			toolBar.Add(helpButton);
		}

		rootVisualElement.Add(toolBar);
		rootVisualElement.Add(splitView);
	}

	// Left Pane
	public VisualElement CreateBoardView()
	{
		var boardView = new VisualElement();
		{
			var fooField = new TextField() { label = "Foo" };
			boardView.Add(fooField);

			var barButton = new Button() { text = "Bar" };
			boardView.Add(barButton);
		}
		return boardView;
	}

	// Right Pane
	public VisualElement CreateInspectorPane()
    {
		var inspectorPane = new VisualElement();
        {
			var fooToggle = new Toggle() { label = "Foo" };
			inspectorPane.Add(fooToggle);

			var barToggle = new Toggle() { label = "Bar" };
			inspectorPane.Add(barToggle);
		}
		return inspectorPane;
	}
}
 
반응형
#getMobileprovisionUUID.sh

#!/bin/bash
if [ $# -ne 1 ]
then
 echo "Usage: getmobileuuid the-mobileprovision-file-path"
 exit 1
fi
# mobileprovision_uuid=`grep UUID -A1 -a $1 | grep -o "[-A-Z0-9]\{36\}"`
mobileprovision_uuid=`/usr/libexec/PlistBuddy -c "Print UUID" /dev/stdin <<< $(/usr/bin/security cms -D -i $1)`
echo "UUID is:"
echo ${mobileprovision_uuid}
${scriptPath}/getMobileprovisionUUID.sh ${provisionPath}/${provisionName}.mobileprovision
UUID is:
UUID 결과값
반응형

| 현상

 

macOS 업데이트 후, il2cpp 빌드 중 clang++와 같은 ndk 관련 툴 사용 중 위와 같은 에러가 발생

stdout:
Building libil2cpp.so with AndroidToolChain
    Output directory: /Users/<usr>/.jenkins/workspace/<job>/Temp/StagingArea/assets/bin/Data/Native/armeabi-v7a
    Cache directory: /Users/<usr>/.jenkins/workspace/<job>/Library/il2cpp_android_armeabi-v7a/il2cpp_cache
ObjectFiles: 998 of which compiled: 371
    Time Compile: 74211 milliseconds Il2CppTypeDefinitions.cpp
    Time Compile: 68481 milliseconds Il2CppMethodPointerTable.cpp
    Time Compile: 55285 milliseconds Il2CppAttributes.cpp
    Time Compile: 41421 milliseconds Il2CppMetadataUsage.cpp
    Time Compile: 26292 milliseconds Il2CppInvokerTable.cpp
    Time Compile: 17629 milliseconds Il2CppGenericMethodPointerTable.cpp
    Time Compile: 12918 milliseconds Il2CppGenericClassTable.cpp
    Time Compile: 10404 milliseconds Bulk_Assembly-CSharp_26.cpp
    Time Compile: 9629 milliseconds Bulk_Assembly-CSharp_49.cpp
    Time Compile: 9063 milliseconds Bulk_Assembly-CSharp_144.cpp
Total compilation time: 98643 milliseconds.
il2cpp.exe didn't catch exception: Unity.IL2CPP.Building.BuilderFailedException: /Users/<usr>/Library/Android/sdk/ndk/android-ndk-r16b/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ @"/var/folders/wp/pskqw4ns3cn27r6k10158xkc0000gn/T/tmpWedXj6.tmp" -o "/Users/<usr>/.jenkins/workspace/<job>/Library/il2cpp_android_armeabi-v7a/il2cpp_cache/linkresult_6F0877EF66902EFEC137A171BB702A20/libil2cpp.so" -shared -Wl,-soname,libil2cpp.so -Wl,--no-undefined -Wl,-z,noexecstack -Wl,--gc-sections -Wl,--build-id --sysroot "/Users/<usr>/Library/Android/sdk/ndk/android-ndk-r16b/platforms/android-16/arch-arm" -gcc-toolchain "/Users/<usr>/Library/Android/sdk/ndk/android-ndk-r16b/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64" -target armv7-none-linux-androideabi -Wl,--wrap,sigaction -L "/Users/<usr>/Library/Android/sdk/ndk/android-ndk-r16b/sources/cxx-stl/gnu-libstdc++/4.9/libs/armeabi-v7a" -lgnustl_static -llog -rdynamic -fuse-ld=gold
 
clang++: error: unable to execute command: Killed: 9
clang++: error: linker command failed due to signal (use -v to see invocation)
 
 
   at Unity.IL2CPP.Building.CppProgramBuilder.PostprocessObjectFiles(HashSet`1 objectFiles, CppToolChainContext toolChainContext)
   at Unity.IL2CPP.Building.CppProgramBuilder.Build(IBuildStatistics& statistics)
   at il2cpp.Program.DoRun(String[] args)
   at il2cpp.Program.Run(String[] args)
   at il2cpp.Program.Main(String[] args)
stderr:
 
Unhandled Exception: Unity.IL2CPP.Building.BuilderFailedException: /Users/<usr>/Library/Android/sdk/ndk/android-ndk-r16b/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ @"/var/folders/wp/pskqw4ns3cn27r6k10158xkc0000gn/T/tmpWedXj6.tmp" -o "/Users/<usr>/.jenkins/workspace/<job>/Library/il2cpp_android_armeabi-v7a/il2cpp_cache/linkresult_6F0877EF66902EFEC137A171BB702A20/libil2cpp.so" -shared -Wl,-soname,libil2cpp.so -Wl,--no-undefined -Wl,-z,noexecstack -Wl,--gc-sections -Wl,--build-id --sysroot "/Users/<usr>/Library/Android/sdk/ndk/android-ndk-r16b/platforms/android-16/arch-arm" -gcc-toolchain "/Users/<usr>/Library/Android/sdk/ndk/android-ndk-r16b/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64" -target armv7-none-linux-androideabi -Wl,--wrap,sigaction -L "/Users/<usr>/Library/Android/sdk/ndk/android-ndk-r16b/sources/cxx-stl/gnu-libstdc++/4.9/libs/armeabi-v7a" -lgnustl_static -llog -rdynamic -fuse-ld=gold
 
clang++: error: unable to execute command: Killed: 9

 

 

| 원인

 

macOS Catalina 업데이트 후 보안이 강화되었다.

확인되지 않은 개발자의 앱을 열려는 경우, 경고 팝업이 발생.

 

 

| 해결방법

 

차단된 앱을 허용하기 위해선 시스템 환경 설정 > 보안 및 개인 정보 보호 > 일반 > 확인 없이 허용 버튼을 눌러서 차단을 해제하는 방법도 있지만 NDK에서 새로운 앱을 사용할때마다 차단을 하나하나 해줘야하는 번거로움이 있습니다.

보안엔 안좋을 수 있지만, 아래 방법을 통해서 앱에 해당 보안 설정을 모두 허용해주도록 합니다.

sudo spctl --master-disable

해당 명령어를 터미널에서 입력 후 적용을 위해서 재부팅 필요.

 

반응형

| 플러그인 설치

 

  • Jenkins > Jenkins 관리 > 플러그인 관리 > Available plugins > S3 검색
  • S3 Publisher 설치

 

| 환결성정

 

  • Jenkins > Jenkins 관리 > 시스템 설정 > Amazon S3 profiles > '추가' 버튼 클릭
  • 아래와 같이 Profile name / Access key / Secret key를 입력

 

| JOB 설정

 

  • 사용할 Profile을 선택
  • Source: 업로드할 파일의 경로를 입력 (ant glob syntax를 따름)
  • Exclude: 제외되어야 할 파일 경로 혹은 패턴
  • Destination bucket: 파일을 업로드할 위치
  • Storage class: 아마존 S3 스토리지 클래스 [자세히 알아보기]
  • Bucket Region: ap-northest-2 [Asia Pacific (Seoul) Region]

 

| 참고

 

 

 

객체 스토리지 클래스 – Amazon S3

 

aws.amazon.com

 

 

아시아 태평양(서울) 리전 - AWS CloudFormation

이 페이지에 작업이 필요하다는 점을 알려 주셔서 감사합니다. 실망시켜 드려 죄송합니다. 잠깐 시간을 내어 설명서를 향상시킬 수 있는 방법에 대해 말씀해 주십시오.

docs.aws.amazon.com

 

 

FileSet Type

erroronmissingdir Specify what happens if the base directory does not exist. If true a build error will happen, if false, the fileset will be ignored/empty. Since Apache Ant 1.7.1 No; defaults to true (for backward compatibility reasons)

ant.apache.org

 

반응형

| 현상

UnityException: Error
mainTemplate.gradle file is using the old aaptOptions noCompress property definition which does not include types defined by unityStreamingAssets constant.

 

 

| 해결방법

android {
	aaptOptions {
		noCompress = ['.unity3d', '.ress', '.resource', '.obb'] + unityStreamingAssets.tokenize(', ')
	}
}

 

반응형

| 현상

 

Android AAR 플러그인을 유니티 프로젝트에 추가, 유니티 빌드 시 아래와 같은 에러를 마주하는 경우가 있다.

Failed to install the following Android SDK packages as some licences have not been accepted.

위 에러는 SDK에 라이센스가 없어서 발생하는 문제인데, 해당 이슈의 전체 에러 콘솔로그이다.

 

 

| 해결

 

안드로이드 스튜디오를 통해 SDK가 설치된 경로를 확인하면 아래와 같다.

C:\Users\${User}\AppData\Local\Android\Sdk

위 경로에 licenses 디렉토리를 유니티의 SDK가 설치된 경로에 복사해준다.

C:\Program Files\Unity\Hub\Editor\${Unity}\Editor\Data\PlaybackEngines\AndroidPlayer\SDK

복사 후 재빌드 시 해당 문제는 해결된 것을 확인할 수 있다.

반응형

| 패키치 설치

 

brew install akamai

특정 버전 설치의 경우: brew install akamai@{version} 
e.g. brew install akamai@1.2.1

패키지 설치 후 커맨드도 별도로 설치가 필요하다

 

Usage:
  akamai [global flags] command [command flags] [arguments...]
 
Commands:
  config
  install (alias: get)
  list
  search
  uninstall
  update
  upgrade
  help
 
Global Flags:
  --edgerc value, -e value                 Location of the credentials file [$AKAMAI_EDGERC]
  --section value, -s value                Section of the credentials file [$AKAMAI_EDGERC_SECTION]
  --accountkey value, --account-key value  Account switch key [$AKAMAI_EDGERC_ACCOUNT_KEY]
  --help                                   show help (default: false)
  --bash                                   Output bash auto-complete (default: false)
  --zsh                                    Output zsh auto-complete (default: false)
  --proxy value                            Set a proxy to use
  --version                                Output CLI version (default: false)
 
Copyright (C) Akamai Technologies, Inc

 

 

| 커맨드 설치

 

akamai install purge

 

 

| Authentication credentials 만들기

 

 

Create authentication credentials

Follow these steps to create an authentication credential that contains the client token and client secret required to authenticate Akamai API, CLI, or Terraform requests.👍In order to complete these steps, you need access to Akamai Control Center and a

techdocs.akamai.com

 

 

| 자격증명 설정

 

cli를 실행하기 위해선 위에서 만든 인증 자격증명 파일을 이용해 인증을 하게 된다. 
(이때 커스텀 HTTP 요청 서명 프로토콜인 EdgeGrid를 이용)

인증 자격증명 파일은 클라이언트 토큰/시크릿 , 호스트, 액세스 토큰 등의 내용이 기입된다.

 

[ccu]
client_secret = {client_secret}
host = {host}
access_token = {access_token}
client_token = {client_token}

 

 

| 젠킨스 설정

 

 

  1. 젠킨스 > 잡 > 설정 
  2. 파라미터 추가 > 문자열 파라미터 CACHE_URL 추가
  3. 빌드 스탭 > Exectue Shell 추가
  4. akamai purge delete $CACHE_URL 기입
반응형

+ Recent posts