| 개요

Addressable 시스템에서 추가된 핵심 시스템 중 AnalyzeRule 시스템이 있다.

  • 에디터 상단 메뉴 > Window > Asset Management > Addressables > Analzye

AssetBundle과 관련된 다양한 규칙들을 설정하고, 해당 규칙에 대한 검증 및 문제 해결까지 가능한 시스템이다.

기본적으로 아래와 같은 규칙이 제공된다.

 

  • 중복 번들 종속성
  • 빌트인 리소스와 어드레서블 어셋간 종속성
  • 씬과 어드레서블간 종속성
  • 번들 레이아웃 프리뷰 기능 (명시적, 암묵적으로 포함되는 어셋목록 리스트업)
패키지에 포함되어 있는 Analyze Rule

기존에도 어셋의 종속성이나 Duplicated 이슈를 검증할 수 있는 AssetBundle Rrowser라는 툴을 제공되었으나,

기능을 확장하거나, 번들마다 설정을 달리하는 등의 작업이 용이하진 않았다.

Analyze System은 종전의 문제점들에서 착안 다양한 옵션을 제공하고 있다.

| Custom Analyze Rule 추가방법

using UnityEditor;
using UnityEditor.AddressableAssets.Build.AnalyzeRules;

public class CustomRule : AnalyzeRule
{
        public override string ruleName
        {
            get { return "룰 이름"; }
        }

        // 문제 해결이 가능한지 여부
        public override bool CanFix
        {
            get { return false; }
            set { }
        }

        public override void FixIssues(AddressableAssetSettings settings)
        {
            base.FixIssues(settings);
            // ...
            // 문제 해결 로직
            // ...
        }

        public override List<AnalyzeResult> RefreshAnalysis(AddressableAssetSettings settings)
        {
            var results = new List<AnalyzeResult>();
            // ...
            // 분석 로직
            // ...
            results.Add(new AnalyzeResult()
            {
                    resultName = "Result Message",
                    severity = UnityEditor.MessageType.Info | Warning | Error
            });
            return results;
        }
}

[InitializeOnLoad]
class RegisterCustomRule
{
    static RegisterCustomRule()
    {
        // Analyze System에 등록을 해야만 Analzye 윈도우에서 노출됨      
        AnalyzeSystem.RegisterNewRule<CustomRule>();
    }
}
 

AnalyzeRule 클래스를 상속하고 AnalyzeSystem에 등록만 해주면 간단하게 커스텀 Analyze Rule을 추가할 수 있다.

 

| GroupSchema로 AnalyzeSystem 100% 활용하기

어셋 그룹을 추가하게되면 아래 스키마들이 기본적으로 추가되어 있다.

(Assets/AddressableAssetsData/AssetGroupTemplates/Packed Assets 파일 참조)

 

  • BundledAssetGroupScehema: 번들 빌드 및 로드 경로 / 압축 포맷 / 빌드 포함 여부 등 어셋번들에 관련된 다양한 옵션을 설정할 수 있는 스키마
  • ContentUpdateGroupSchema: 해당 컨텐츠가 업데이트 가능한지 여부를 설정
 

패키지에서 제공하는 스키마외에도 커스텀 스키마를 정의, 추가가 가능하다.

 

using UnityEditor;
using UnityEditor.AddressableAssets.Build.AnalyzeRules;
using UnityEditor.AddressableAssets.Settings;

public class CustomSchema : AddressableAssetGroupSchema
{
    [SerializeField] public string Foo;
}

public class CustomRule : AnalyzeRule
{
            // ...

        public override List<AnalyzeResult> RefreshAnalysis(AddressableAssetSettings settings)
        {
            ClearAnalysis();

            var results = new List<AnalyzeResult>();
            foreach (var group in settings.groups)
            {
                if (group.HasSchema<CustomSchema>())
                {
                    var schema = group.GetSchema<CustomSchema>();
                    // ...
                    // 분석 로직
                    // ...
                }
            }

            results.Add(new AnalyzeResult()
            {
                    resultName = "Result Message",
                    severity = UnityEditor.MessageType.Info | Warning | Error
            });
            return results;
        }
}
 

CustomSchema를 추가한 그룹에 대한 별도 처리가 가능하다.

 

이제부터 AnalyzeSystem 활용에 대한 다양한 활용방법이 떠오르는데, 이를테면 이런 것들이다.

 

  • [어셋그룹]내의 텍스쳐 어셋의 포맷 혹은 압축 및 POT 여부를 설정하는 스키마를 추가 > 해당 그룹내의 텍스쳐를 분석 후 지정된 포맷으로 변환
  • [어셋그룹]내의 저해상도 및 저성능 관련 내용을 설정하는 스키마 추가 > 해당 그룹내 저해상도 어셋을 자동생성
  • [어셋그룹]내 시즌 상품에 관련된 모든 어셋을 지정하는 스키마를 추가, 미노출되어야하는 어세에 대한 처리

 

Bundle Mode 중 Pack Together By Label이란 옵션이 있는데, 

(동일한 그룹내에서도 라벨 기준으로 번들 파일을 분리하여서 패키징할 수 있는 옵션)

패킹 레벨에서의 그룹과 Label의 용도의 차이점이 무엇인지 이해하기 어려웠다.

 

하지만 어셋 그룹 스키마와 Custom Analyze Rule에 관련된 예제를 보고는 확실히 개념이 정리가 되었다.

 

  • 라벨링이 필요없는 경우 > Pack Together
  • 번들 자체는 분리되어야 하지만, 어셋 그룹에 대한 설정은 공유하는 경우 > Pack Togher by Label

 

| 마치며

AnalzyeSystem의 사용법커스텀 룰을 추가하는 방법어셋 그룹 스키마와 활용하는 방법까지 알아보았다.

 

테스트나 번들 별 옵션 지정 등 다양한 기능을 제공하면서도 잘 정리된 느낌이 들었다.

종전의 시스템으론 커버하기 힘든 요구사항까지 다 핸들링 가능한 시스템으로 적극적으로 사용한다면 다양한 용도로 사용할 수 있을 것으로 기대된다.

 

 

| 참고

 

반응형
UnassignedReferenceException: The variable {variable} of {script} has not been assigned.
You probably need to assign the {variable} variable of the {script} script in the inspector.
 
 

MonoBehaviour에 SerializeField로 정의된 변수에 아무 오브젝트도 설정하지 않은 (None) 상태일 때 해당 변수를 참조하면 발생하게 된다.

 

사실 기본적인 내용이라 보기 어려운 에러인데,

문제는 유니티가 C# 최신버전을 적극적으로 지원하게 되면서 발생했다.

 

[Unity3d C# Compiler 관련 문서]

 

Null 조건 연산자나 Null 병합(결합) 할당 연산자를 유니티에서도 사용할 수 있게 되었다.

 

public class Foo : MonoBehaviour {
  [SerializeFIeld]
  GameObject _MemberFoo;

  public void MethodFoo() {
    // UnassignedReferenceException !
    _MemberFoo?.SetActive(false);  
  }
}
 

코드만 봤을 땐 문제될 게 없어보이지만, UnassignedReferenceException은 할당되지 않은 SerializeFIeld를 접근하기만 해도 발생하는 유니티 시스템 에러이기 때문에 해당 오류가 발생한다.

 

반응형

 

| 현상

라이브러리내의 로그 파일이 백엔드 프로세스에서 사용중으로 IO Exception이 발생하며 유니티 에디터가 실행 불가능한 상태가 되는 현상

 

 

| 해결방법

해당 프로세스를 종료한 뒤, 유니티 에디터 재실행

 

반응형

[C#] Warning 숨기기 에 이어서 Unity3d 환경에서 Warning을 숨길 수 있는 방법을 알아보자.

C# 포스팅에선 Warning disable을 기준으로 전처리에 대한 내용을 정리했다면, Unity3d에선 커스텀 스크립팅 심볼까지 추가적으로 알아보자.

 

| RSP 파일을 통한 설정

// 커스텀 Define Symbol 정의
-define:FOO_BAR

// Warning Disable
-nowarn:1234
 

우선 전처리 지시문을 작성한 뒤

csc.rsp 파일을 <ProjectPath>/Assets 폴더 하위 위치시키면 된다.

 

※smcs.rsp, mcs.rsp 파일을 지원 중단 예정

 

 

| 에디터를 통한 설정

File > Build Settings > Player Settings > Player > Script Compilation / Additional Compiler Arguments

 

  • 커스텀 Define Symbol의 경우 Scripting Define Symbols 섹션에 `+` 버튼을 클릭 후 내용을 입력
  • 추가적인 컴파일 인수는 Additional Compiler Arguments 섹션에서 `+` 버튼을 클릭 후에 지정
  • 커스텀 스크립팅 심볼 - Unity 매뉴얼

 

| 스크립트를 통한 설정

 

위 3가지 API를 사용해서 스크립팅 심볼을 정의할 수 있다.

다만, PlayerSettings.SetScriptingDefineSymbolsForGroup 의 경우 주의 사항이 몇 가지 있다.

 

  • 해당 메서드는 즉시 적용되지 않고, 스크립트를 다시 컴파일 하지 않음
  • 배치 모드에서 헤드리스로 실행되기 때문에 editor loop(스크립팅 심볼이 다시 컴파일 되는)가 발생하지 않음

따라서 즉시 적용하려면 csc.rsp 파일을 비동기적 상황에선 API를 이용해야 한다.

 

| 관련

 

반응형
// 코드 블록 기본 설정 > 자동 속성 선호

// 권장
public int Foo {get;}

// 권장하지 않음
private int foo;

public int Foo
{
  get
  {
    return foo;
  }
}
 
 

발단은 이 친구다.

 

개인적으론 set과 get하는 부분을 구분하기 위해서

private 멤버변수 + public get 프로퍼티를 선호하는 편이다.

 

C#의 auto 속성 사용을 권장하고 있는데,

오류를 뱉진 않지만 회색빛으로 하이라이트하면서 수정하라고 존재감을 뽐낸다.

 

이제 Warning을 숨겨보자.

 

| 전처리 지시문

#pragma warning disable IDE0032
{
  //
}
// Restore 명령어를 사용하면 특정 코드 줄로 제한할 수 있다.
#pragma warning restore IDE0032
 

pragma 지시문 및 키워드를 이용해서 Warning에 대한 내용만 선택적으로 제어할 수 있다.

 

다만, 다음 파일에서 기본 상태로 복구된다. 즉 지시문이 있는 해당 파일 혹은 블록만 적용된다.

 

| Visual Studio의 옵션 설정

 

도구 > 옵션 > 텍스트 편집기 > [C# 또는 기본] > 코드 스타일 > 일반

 

 

위 창에서 각 항목별로 규칙을 상세히 지정할 수 있다.

 

| EditorConfig 파일

 

위 방법의 옵션 윈도우에서 .editconfig 파일 생성을 클릭 혹은 아래와 같이 직접 파일 생성한다.

 
// 예)
[*.{cs,vb}]
dotnet_diagnostic.IDE0032.severity = none

[*.{cs,vb}]
dotnet_analyzer_diagnostic.category-Style.severity = none
 

위와 같이 설정하고자 하는 내용을 작성

 

※규칙을 설정하는 자세한 내용은 공식문서를 참고

 

| 참고

반응형

| 개요

 

커스텀 설정 창의 예시

SettingsProvider클래스와 Attribute를 사용해서 Project Settings 혹은 Preferences 창을 커스터마이즈하는 법을 소개하고자 한다.

 

| 설정파일 추가

[FilePath("UserSettings/CustomSettings.asset",
          FilePathAttribute.Location.ProjectFolder)]
public sealed class CustomSettings: ScriptableSingleton<CustomSettings>
{
    // 설정 값 정의
    public string customSettingsValue = null;

    // 저장 함수 추가 (인자는 설정파일의 텍스트 저장 여부)
    public void Save() => Save(true);

    // 비활성화 되었을 때, 설정이 저장되도록
    void OnDisable() => Save();
}
 

| SettingsProvider를 재정의할 클래스 정의

 

sealed class CustomSettingsProvider : SettingsProvider
{
    public CustomSettingsProvider ()
      : base("Project/Custom Settings", SettingsScope.Project) {}

    public override void OnGUI(string search)
    {
        var settings = CustomSettings.instance;

        // Properties...
        var customSettingsValue = settings.customSettingsValue;

        EditorGUI.BeginChangeCheck();

        customSettingsValue = EditorGUILayout.TextField("Custom Settings", customSettingsValue);

        // 값이 변경되었을 경우 설정 값을 저장
        if (EditorGUI.EndChangeCheck())
        {
            settings.customSettingsValue = customSettingsValue;
            settings.Save();
        }
    }

    [SettingsProvider]
    public static SettingsProvider CreateCustomSettingsProvider()
      => new CustomSettingsProvider();
}
 
환경 설정에 커스텀 설정을 추가한 모습

| 키워드 설정

public CustomSettingsProvider ()
      : base("Project/Custom Settings", SettingsScope.Project) 
{
    keywords = new HashSet<string>( new []{ "CustomSetting" });
}
 

위와 같이 keywords를 설정해주면 검색창에서 해당 키워드로 리스트업할 수 있다.

 

| 커스텀 설정 바로가기

    void OnGUI()
    {
        if (GUILayout.Button("Open my custom preference"))
        {
            SettingsService.OpenUserPreferences("Preferences/MyCustomPref");
        }

        if (GUILayout.Button("Open my custom project settings"))
        {
            SettingsService.OpenProjectSettings("Project/MyCustomSettings");
        }
    }
 

 

 

| 마치며

SettingsProvider 클래스와 Attribute, ScriptableSingleton을 활용해서 간단히 설정창을 커스텀하는 방법을 알아보았다.

 

SettingsProvider를 상속한 추가 클래스 정의 없이, 아래의 Action 멤버변수를 지정하면 위 예제와 같이 설정 상세 UI를 커스터마이즈할 수 있다.

 

  • IMGUI: guiHandler
  • UI Toolkit: activeHandler

 

| 참고

 

 

반응형

| 개요

써드파티 플러그인을 적용하거나 OS 버전 업과 같은 이유로 SDK Build Tools의 버전을 올려야하는 경우가 있다.

이때 Gradle의 최소 요구 버전이 달라지는 경우가 있는데, 아래와 같은 에러가 발생한다.

FAILURE: Build failed with an exception.

* Where:
Build file '/Users/<usr>/.jenkins/workspace/<job>/<GradleProject>/launcher/build.gradle' line: <line>

* What went wrong:
A problem occurred evaluating project ':launcher'.
> Failed to apply plugin [id 'com.android.internal.version-check']
   > Minimum supported Gradle version is 5.6.4. Current version is 5.1.1. If using the gradle wrapper, try editing the distributionUrl in /Users/<usr>/.gradle/daemon/5.1.1/gradle/wrapper/gradle-wrapper.properties to gradle-5.6.4-all.zip
 
 

필자는 그래들 플러그인(classpath: com.android.tools.build:gradle:3.6.4)을 3.6.4버전을 쓰게 되면서 최소 요구 Gradle 버전은 5.6.4이었다.

dependencies {
  classpath 'com.android.tools.build:gradle:<version>'
}
 

Project 하위에 build.gradle 파일을 열어보면 위와 같은 내용을 확인할 수 있다.

 

Android Gradle 플러그인 출시 노트  |  Android 개발자  |  Android Developers

Android 스튜디오 빌드 시스템은 Gradle을 기반으로 하며 Android Gradle 플러그인에는 Android 앱을 빌드하는 데 사용하는 몇 가지 추가 기능이 있습니다.

developer.android.com

 

※위 링크에서 그래들 플러그인에 대응되는 그래들 버전을 확인할 수 있다.

 

| 플러그인별 Gradle 버전

플러그인 필요한 최소 Gradle 버전
8.1 8.0
8.0 8.0
7.4 7.5
7.3 7.4
7.2 7.3.3
7.1 7.2
7.0 7.0
4.2.0+ 6.7.1

 

| 그래들 버전 설정방법

그래들의 버전 설정은 Android 스튜디오의 File > Project Structure > Project 메뉴에서 또는 gradle/wrapper/gradle-wrapper.properties 파일의 Gradle 배포 참조를 편집하여 Gradle 버전을 지정할 수 있습니다.

해당 메뉴에서 그래들 버전 설정

혹은 gradle/wrapper/gradle-wrapper.properties 파일을 아래와 같이 수정

 

distributionBase=GRADLE_USER_HOME
...
distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-bin.zip
...
distributionPath=wrapper/dists
zipStorePath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
 

| 젠킨스에서

 
  • Jenkins > Manage Jenkins > Global Tool Configuration > Gradle > Gradle Installations
  • 해당 버전의 그래들을 추가
  • 각 프로젝트에서 변경된 그래들을 사용하도록 수정
반응형

| 현상

FAILURE: Build failed with an exception.
 
* What went wrong:
Execution failed for task ':stripReleaseDebugSymbols'.
> No toolchains found in the NDK toolchains folder for ABI with prefix: arm-linux-androideabi
 
* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.
 
* Get more help at https://help.gradle.org
 
Deprecated Gradle features were used in this build, making it incompatible with Gradle 6.0.
Use '--warning-mode all' to show the individual deprecation warnings.
See https://docs.gradle.org/5.5/userguide/command_line_interface.html#sec:command_line_warnings
 
BUILD FAILED in 36s
 

위 에러가 발생하며 빌드에 실패하는 현상

 

| 원인

그래들 버전에 맞는 NDK가 설치되어 있지 않아 발생

 

| 해결방법

 
 
구분
버전
Gradle
5.5
NDK
android-ndk-r16b

그래들 버전에 맞는 NDK 설치

 

반응형

'Workspace' 카테고리의 다른 글

dotPeek을 이용한 디컴파일 / 어셈블리 브라우징 가이드  (0) 2023.04.06
[C#] Warning 숨기기  (0) 2023.03.24

+ Recent posts