Unity SDK - 기본 연동

사전 요구사항

원활한 연동 과정을 위해 Singular Unity SDK를 설치하기 전에 다음 사전 요구사항 단계를 완료하세요.

필수 사전 요구사항:


설치

Unity Package Manager(UPM)를 통한 설치

Singular Unity SDK는 Git URL을 사용하여 Unity Package Manager를 통해 설치됩니다. 다음 단계를 따라 프로젝트에 SDK를 추가하세요.

설치 단계

  1. Package Manager 열기: Unity에서 Window > Package Manager 로 이동합니다.
  2. Git에서 패키지 추가: 왼쪽 상단 모서리의 [+] 버튼을 클릭하고 "Add package from git URL" 을 선택합니다.
  3. Git URL 입력:
    • Standard SDK의 경우: 다음을 입력합니다: https://github.com/singular-labs/Singular-Unity-SDK.git
    • Kids SDK의 경우: 다음을 입력합니다: https://github.com/singular-labs/Singular-Unity-SDK.git#kids
  4. 설치 완료: "Add" 를 클릭하여 SDK 패키지를 설치합니다.

Google EDM4U를 사용하지 않으시나요? 프로젝트가 External Dependency Manager를 사용하지 않는 경우, 네이티브 종속성을 수동으로 다운로드하여 추가해야 합니다.

수동 종속성 설치

  1. 종속성 다운로드: Singular의 S3 버킷에서 적절한 Plugins.zip 파일을 다운로드합니다:
  2. Assets로 압축 해제: 다운로드한 파일을 압축 해제하여 Unity 프로젝트의 Assets > Plugins 로 이동합니다.
  3. iOS 프레임워크 구성: Assets > Plugins > iOS 로 이동하여 Singular.xcframework 를 선택합니다.
  4. 바이너리 임베드: Inspector 창에서 "Add to Embedded Binaries" 옵션을 선택합니다.

Android 구성 팁

적절한 SDK 기능을 보장하도록 Android 빌드 설정을 구성하세요. Unity는 Android 매니페스트와 Gradle 파일을 커스터마이징할 수 있는 여러 가지 방법을 제공합니다.

AndroidManifest.xml 업데이트 방법

다음 두 가지 방법 중 하나를 사용하여 AndroidManifest를 수정할 수 있습니다:

방법 1: Unity 커스텀 매니페스트

  1. File > Build Settings > Player Settings > Publishing Settings 로 이동합니다.
  2. Publishing Settings 섹션에서 "Custom Main Manifest" 를 활성화합니다.
  3. Unity가 Assets/Plugins/Android/AndroidManifest.xml 위치에 기본 AndroidManifest.xml 파일을 생성합니다.
  4. 이 파일을 편집하여 필요한 권한과 구성을 추가합니다.

출처: Unity Android Manifest 문서

방법 2: Android Studio

  1. File > Build Settings > Export Project 을 사용하여 Unity에서 프로젝트를 내보냅니다.
  2. 내보낸 프로젝트를 Android Studio에서 엽니다.
  3. Android Studio에서 AndroidManifest.xml 파일을 직접 편집합니다.
Gradle 빌드 파일 업데이트 방법

방법 1: Unity 커스텀 템플릿

  1. File > Build Settings > Player Settings > Publishing Settings 로 이동합니다.
  2. Publishing Settings 섹션에서 "Custom Gradle Template" 을 활성화합니다.
  3. Unity가 Assets/Plugins/Android/mainTemplate.gradle 위치에 mainTemplate.gradle 파일을 생성합니다.
  4. 이 파일에 커스텀 Gradle 구성을 추가합니다.

출처: Unity Gradle Overview 문서

방법 2: Android Studio

  1. Unity에서 프로젝트를 내보냅니다.
  2. Android Studio에서 프로젝트를 엽니다.
  3. 앱의 build.gradle 파일을 직접 편집합니다.
중복 클래스 오류 해결

Unity에서 Android 앱을 빌드할 때, 여러 SDK가 동일한 전이 종속성을 포함하여 발생하는 "Duplicate class"(중복 클래스) 오류가 나타날 수 있습니다. 이는 AppLovin SDK와 Singular SDK를 함께 사용할 때 Android Vending Licensing 라이브러리에서 흔히 발생합니다.

오류 예시:

Duplicate class com.android.vending.licensing.ILicensingService found in modules
applovin-sdk-13.5.0.aar -> jetified-applovin-sdk-13.5.0-runtime (com.applovin:applovin-sdk:13.5.0)
and singular_sdk-12.11.0.aar -> jetified-singular_sdk-12.11.0-runtime (com.singular.sdk:singular_sdk:12.11.0)

해결책 1: External Dependency Manager(EDM4U) 사용

프로젝트가 External Dependency Manager for Unity (권장)를 사용하는 경우, Dependencies XML 파일에 제외 규칙을 추가합니다.

  1. Unity 프로젝트에서 *Dependencies.xml 파일을 찾습니다(일반적으로 Assets/Editor 또는 유사한 위치에 있음).
  2. SDK 종속성 중 하나에 제외 규칙을 추가합니다:
XML
<dependencies>
  <androidPackages>
    <androidPackage spec="com.applovin:applovin-sdk:13.5.0">
      <androidSdkPackageIds>
        <exclude group="com.android.vending" module="licensing"/>
      </androidSdkPackageIds>
    </androidPackage>
    <androidPackage spec="com.singular.sdk:singular_sdk:12.11.0" />
  </androidPackages>
</dependencies>

참고: Android Resolver가 해결 과정에서 커스텀 템플릿 변경 사항을 덮어쓸 수 있으므로, 이 방법이 Gradle 템플릿을 수정하는 것보다 더 지속적입니다.

해결책 2: 커스텀 Gradle 템플릿 사용

EDM4U를 사용하지 않는 경우, Gradle 구성 파일에 직접 제외 규칙을 적용합니다.

  1. File > Build Settings > Player Settings > Publishing Settings 로 이동합니다.
  2. "Custom Main Gradle Template" 또는 "Custom Launcher Gradle Template" 을 활성화합니다.
  3. Assets/Plugins/Android/mainTemplate.gradle (또는 launcherTemplate.gradle )을 엽니다.
  4. 종속성 블록에 제외 규칙을 추가합니다:
Gradle
dependencies {
    implementation('com.applovin:applovin-sdk:13.5.0') {
        exclude group: 'com.android.vending', module: 'licensing'
    }
    implementation 'com.singular.sdk:singular_sdk:12.11.0'
}

대안: 종속성 블록 뒤에 다음을 추가하여 전역 제외를 적용합니다:

Gradle
configurations.all {
    exclude group: 'com.android.vending', module: 'licensing'
}

해결 확인

  1. 제외를 적용한 후, Library/Bee Temp 폴더를 삭제하여 프로젝트를 정리합니다.
  2. Unity에서 Android 프로젝트를 다시 빌드합니다.
  3. 빌드 출력에 중복 클래스 오류가 더 이상 나타나지 않는지 확인합니다.

작동 원리: 두 SDK 모두 동일한 Android licensing 라이브러리를 전이 종속성으로 번들합니다. 제외 규칙은 Gradle에게 하나의 복사본만 사용하도록 지시하여 충돌을 해결합니다.

ProGuard 구성

프로젝트가 코드 난독화를 위해 ProGuard를 사용하는 경우, Singular SDK가 제거되지 않도록 다음 keep 규칙을 proguard-unity.txt 파일에 추가합니다:

proguard-unity.txt
-keep class com.singular.sdk.** { *; }
-keep public class com.android.installreferrer.** { *; }
-keep public class com.singular.unitybridge.** { *; }

iOS 구성 팁

적절한 어트리뷰션, 딥링킹, 테스트 기능을 활성화하도록 iOS 전용 설정을 구성하세요.

CocoaPods 종속성 업데이트

iOS용 Unity 프로젝트를 빌드한 후 Xcode에서 빌드하기 전에, 최신 SDK 버전을 사용하도록 CocoaPods 종속성을 업데이트하세요.

Terminal
cd /path/to/your/ios/project
pod repo update
pod update
테스트용 IDFV 로깅

연동을 테스트할 때, IDFV(Identifier for Vendor)를 로깅하여 Singular SDK 콘솔에서 테스트 기기를 빠르게 추가하세요.

IDFV 로깅 추가

  1. Unity에서 빌드한 후 Xcode 프로젝트를 엽니다.
  2. Classes > UnityAppController.mm 로 이동합니다.
  3. applicationDidBecomeActive 메서드를 찾습니다.
  4. IDFV를 로깅하기 위해 다음 코드를 추가합니다:
Objective-C
// Log IDFV for testing
NSLog(@"Singular === IDFV: %@", [[[UIDevice currentDevice] identifierForVendor] UUIDString]);
  1. Xcode에서 앱을 빌드하고 실행합니다.
  2. Xcode 콘솔 로그에서 IDFV 출력을 확인합니다.
  3. IDFV를 복사하여 Singular SDK 콘솔 에서 테스트 기기로 추가합니다.
딥링크 지원 구성

Xcode 프로젝트에서 Associated Domains를 구성하여 딥링킹을 위한 Universal Links를 활성화하세요.

  1. Associated Domain 추가: Xcode에서 앱 타겟의 Signing & Capabilities 탭으로 이동합니다.
  2. 기능 활성화: [+] Capability 를 클릭하고 "Associated Domains" 를 추가합니다.
  3. 도메인 추가: 다음 형식으로 Singular 추적 도메인을 추가합니다: applinks:yourdomain.sng.link
  4. Team ID 구성: Singular 대시보드에서 앱 설정으로 이동하여 Apple Team ID를 추가합니다. 이를 통해 Singular는 Universal Links에 필요한 Apple App Site Association(AASA) 파일을 생성하고 호스팅할 수 있습니다.

중요: Associated Domains와 Team ID가 올바르게 구성되지 않으면 Universal Links가 작동하지 않으며, 사용자가 Singular 추적 링크에서 앱을 열 수 없습니다.

⚠️ 중요: UnityAppController 충돌 해결

UnityAppController를 등록하는 다른 SDK(예: Firebase, Adjust, AppsFlyer)를 사용하는 경우, Singular가 제대로 초기화되지 않도록 하는 충돌이 발생할 수 있습니다. Unity에서는 한 번에 하나의 클래스만 UnityAppController로 등록할 수 있습니다.

이 충돌을 해결하려면:

  1. 열기 Xcode 프로젝트에서 SingularSwizzledAppController.m 파일을 엽니다.
  2. 이 파일의 모든 코드의 주석 처리를 해제합니다.
  3. 열기 SingularAppDelegate.m 을 열고 다음 줄이 주석 처리되지 않았는지 확인합니다:
    IMPL_APP_CONTROLLER_SUBCLASS(SingularAppDelegate)

이를 통해 Singular는 UnityAppController를 서브클래싱하는 대신 메서드 스위즐링을 사용하여 다른 SDK와 함께 작동할 수 있습니다.


SDK 연동

SingularSDK GameObject 생성

Singular SDK가 작동하려면 Unity 씬 계층 구조에 GameObject가 필요합니다. 제공된 프리팹을 사용하거나 수동으로 생성하여 이 GameObject를 추가할 수 있습니다.

방법 1: Singular 프리팹 사용(권장)

씬에 프리팹 추가

  1. Project 창에서 Packages > Singular > SingularSDK > Prefabs 로 이동합니다.
  2. SingularSDKObject 프리팹을 Hierarchy 창으로 드래그합니다.
  3. 이제 프리팹을 Inspector에서 구성할 준비가 되었습니다.
방법 2: GameObject 수동 생성

수동 GameObject 생성

  1. Hierarchy 창에서 마우스 오른쪽 버튼을 클릭하고 Create Empty 를 선택합니다.
  2. GameObject의 이름을 SingularSDKObject 로 지정합니다(정확한 이름 필수).
  3. GameObject가 선택된 상태에서 Inspector 창으로 이동합니다.
  4. Add Component 를 클릭합니다.
  5. "Singular" 를 검색하고 Singular SDK Script 컴포넌트를 선택합니다.

필수: SDK가 제대로 작동하려면 GameObject의 이름이 정확히 SingularSDKObject 여야 합니다.

SDK 설정 구성

Unity Inspector를 통해 SDK 자격 증명 및 초기화 설정을 구성하세요. SDK가 Singular의 서버와 통신하려면 API Key와 Secret이 필요합니다.

API 자격 증명 추가

  1. SingularSDKObject 선택: Hierarchy에서 SingularSDKObject를 클릭합니다.
  2. 자격 증명 찾기: Singular 계정 에 로그인하고 Developer Tools > SDK Integration > SDK Keys 로 이동합니다.
  3. 키 복사: SDK Key SDK Secret 을 복사합니다.
  4. Inspector에 붙여넣기: Unity의 Inspector 창에서 자격 증명을 Singular API Key Singular API Secret 필드에 붙여넣습니다.

필수: Singular Reporting API Key를 사용하지 마세요. SDK Integration 페이지의 SDK 전용 API Key와 Secret만 사용하세요. 잘못된 자격 증명을 사용하면 데이터가 Singular로 전송되지 않습니다.

연동 확인: 구성 후, 이벤트가 올바르게 추적되는지 확인하려면 Singular SDK 콘솔 을 사용하여 구현을 테스트하세요.

기본 Inspector 설정

SingularSDKObject에는 합리적인 기본값이 제공됩니다. 이러한 설정을 이해하면 앱의 요구사항에 맞게 SDK 동작을 커스터마이징하는 데 도움이 됩니다.

기본 구성 옵션
  • Initialize On Awake: 기본적으로 활성화되어 있습니다. GameObject가 awake될 때 SDK가 자동으로 초기화됩니다. 개인정보 동의나 기타 요구사항을 위해 초기화를 지연해야 하는 경우 이를 비활성화하세요.
  • SKAN Enabled: 기본적으로 활성화되어 있습니다(iOS 전용). Singular가 구성한 컨버전 모델을 기반으로 컨버전 값을 자동으로 업데이트하는 Managed Mode에서 SKAdNetwork 어트리뷰션을 활성화합니다.
  • Wait For Tracking Authorization: 0(비활성화)으로 설정됩니다. 앱에서 iOS App Tracking Transparency(ATT) 프롬프트를 표시하는 경우, 이를 300초로 설정하세요. 이는 사용자가 ATT 프롬프트에 응답할 때까지 SDK 세션을 지연시켜 동의가 부여되면 IDFA를 캡처할 수 있도록 합니다. ATT를 사용하지 않는 경우 0으로 둡니다.
  • Enable Logging: 기본적으로 활성화되어 있습니다. 연동 및 문제 해결에 도움이 되도록 SDK 디버그 로그를 출력합니다. 프로덕션 빌드에서는 비활성화해야 합니다. Log Level 설정과 함께 작동합니다(아래 참조).
  • Log Level: 기본적으로 3(Info)으로 설정됩니다. 로깅 상세도를 제어합니다. 숫자가 낮을수록 더 상세한 로그가 생성됩니다:
    C#
    // Based on Android Logger log levels
    public enum LogLevel {
       Verbose = 2,  // Most verbose
       Debug   = 3,
       Info    = 4,  // Default
       Warn    = 5,
       Error   = 6,
       Assert  = 7   // Least verbose
    }

    참고: 상세 로그는 주로 Android에서 사용할 수 있습니다.

  • DDL Timeout Sec: 0(60초 기본값 사용)으로 설정됩니다. SDK가 서버로부터 디퍼드 딥링크 데이터를 기다리는 시간을 결정합니다. 디퍼드 딥링크를 찾지 못하면 이 타임아웃 후 서버가 검색을 중단합니다.
  • Session Timeout Sec: 0(60초 기본값 사용)으로 설정됩니다. SDK가 포그라운드로 돌아올 때 새 세션을 생성하기 전에 앱이 백그라운드에 머물 수 있는 시간을 정의합니다.
  • Shortlink Resolve Timeout: 0(10초 기본값 사용)으로 설정됩니다. 숏링크 확인을 기다리는 최대 시간입니다. 숏링크를 확인할 수 없는 경우 긴 대기를 방지하여 사용자 경험을 보호합니다.

추가 구성 옵션

Facebook(Meta) Install Referrer 구성

2025년 6월 18일부터: Meta의 Advanced Mobile Measurement(AMM) 은 Meta Install Referrer 구현의 필요성을 없앱니다. AMM 리포팅이 활성화된 경우, Meta Install Referrer를 구성할 필요가 없습니다.

기존 Meta Install Referrer 어트리뷰션 방법을 지원해야 하는 경우, Facebook App ID를 SingularSDKObject 구성에 추가하세요.

구성 단계

  1. 씬 계층 구조에서 SingularSDKObject 를 선택합니다.
  2. Inspector 창에서 "Facebook App ID" 필드를 찾습니다.
  3. Facebook App ID를 입력합니다(Facebook Developer Console에서 확인 가능).

추가 리소스:


SDK 초기화

개인정보 보호 준수: Singular SDK를 구현할 때, GDPR, CCPA, COPPA 등을 포함하여 운영 지역의 개인정보 보호 법규를 준수하세요. 자세한 안내는 SDK 옵트인 및 옵트아웃 관행 을 참조하세요.

앱이 실행될 때마다 Singular SDK를 초기화하세요. SDK 초기화는 모든 Singular 어트리뷰션 기능에 필수적이며, 사용자 리텐션 지표를 계산하기 위한 새 세션을 생성합니다.

자동 초기화

기본적으로 SingularSDK.cs Script는 씬이 로드될 때 Unity의 Awake() 메서드를 통해 SDK를 자동으로 초기화합니다. Inspector에서 Initialize On Awake 가 활성화되어 있으면 추가 코드가 필요하지 않습니다.

수동 초기화

특정 시점(예: 사용자 동의를 얻은 후)에 SDK를 초기화해야 하는 경우, 자동 초기화를 비활성화하고 초기화 메서드를 수동으로 호출하세요.

수동 초기화 설정

  1. 씬 계층 구조에서 SingularSDKObject 를 선택합니다.
  2. Inspector 창에서 Initialize On Awake 의 선택을 해제합니다.
  3. 초기화할 준비가 되면 코드에서 SingularSDK.InitializeSingularSDK() 를 호출합니다.

InitializeSingularSDK 메서드

자동 초기화가 비활성화된 경우 이 메서드를 사용하여 SDK를 수동으로 초기화하세요.

C#
using UnityEngine;
using Singular;

public class GameInitializer : MonoBehaviour
{
    void Start()
    {
        // Perform any required setup (e.g., consent management)
        CheckUserConsent();

        // Initialize Singular SDK after consent is obtained
        // SDK Key and Secret are configured on the SingularSDKObject
        SingularSDK.InitializeSingularSDK();
    }

    void CheckUserConsent()
    {
        // Your consent logic here
    }
}

스레드 안전성: 항상 다른 Unity API 호출에 사용되는 동일한 스레드에서 Singular Unity SDK 메서드를 호출하세요. SDK는 여러 스레드에 걸쳐 스레드로부터 안전하지 않습니다.


고급 구성

Google Ads iOS Integrated Conversion Measurement에 필요

앱이 iOS 14.5+ 사용자를 타겟팅하는 Google Ads 캠페인을 실행하는 경우, iOS Integrated Conversion Measurement(ICM)를 지원하기 위한 추가 SDK 구성 단계가 필요합니다. 여기에는 다음이 포함됩니다:

  • Google의 On-Device Measurement(ODM) SDK 연동
  • Singular iOS SDK v12.8.1+로 업데이트(또는 Unity의 경우 v5.5.0+, Flutter/Cordova의 경우 v1.8.0+, React Native의 경우 v3.9.0+)
  • -ObjC linker 플래그를 추가하고 SingularConfig 에서 enableOdmWithTimeoutInterval 을 활성화

참고: enableOdmWithTimeoutInterval 을 활성화하면 SDK 초기화가 지연되고 딥링크 콜백이 연기될 수 있습니다. 재작업을 피하려면 초기 SDK 구현 중에 이 설정을 완료하세요.

iOS ICM 전체 기술 요구사항 보기


세션 타임아웃 구성

앱이 포그라운드로 돌아올 때 SDK가 새 세션을 생성하기 전에 앱이 백그라운드에 머물 수 있는 시간을 커스터마이징하세요.

세션 타임아웃 구성

기본 세션 타임아웃은 60초입니다. 이 값을 변경하려면:

  1. 씬 계층 구조에서 SingularSDKObject 를 선택합니다.
  2. Inspector 창에서 Session Timeout Sec 필드를 찾습니다.
  3. 원하는 타임아웃 값을 초 단위로 입력합니다(예: 2분의 경우 120).
  4. 기본 60초 타임아웃을 사용하려면 0으로 둡니다.

모범 사례: 세션 타임아웃을 설정할 때 앱의 일반적인 사용 패턴을 고려하세요. 짧은 세션이 빈번한 게임은 더 짧은 타임아웃이 유리할 수 있으며, 생산성 앱은 더 긴 타임아웃이 필요할 수 있습니다.


.unitypackage에서 UPM으로 업그레이드

기존 .unitypackage 설치 방법에서 최신 Unity Package Manager(UPM) 방식으로 마이그레이션하는 경우, 다음 중요한 업그레이드 단계를 따르세요.

마이그레이션 지침: .unitypackage에서 UPM으로

필수: UPM 패키지를 설치하기 전에 기존의 모든 Singular SDK 파일을 수동으로 제거해야 합니다. 그렇지 않으면 충돌과 빌드 오류가 발생합니다.

업그레이드 절차

Unity Package Manager를 통해 SDK를 설치하기 전에 다음 단계를 순서대로 완료하세요:

단계별 파일 제거

1. 코드 파일 제거

프로젝트의 /Code 폴더(일반적으로 Assets/Singular/Code )로 이동하여 모든 Singular 관련 C# Script를 삭제합니다.

2. Android 종속성 제거

/Plugins/Android 로 이동하여 다음 Singular 파일을 제거합니다:

  • 이름에 "singular"가 포함된 모든 .aar 파일
  • 이름에 "singular"가 포함된 모든 .jar 파일
  • singular-sdk.aar
  • install-referrer-*.aar
  • singular-unitybridge.aar

3. iOS 종속성 제거

/Plugins/iOS 로 이동하여 다음 Singular 파일을 제거합니다:

  • 모든 .h 헤더 파일(예: SingularSDK.h )
  • 모든 .m 구현 파일(예: SingularUnityBridge.m )
  • Singular.xcframework 폴더

중요: Singular 전용 파일만 제거하세요. 프로젝트가 의존할 수 있는 다른 플러그인 파일을 삭제하지 않도록 주의하세요.

4. 정리 상태 확인

  1. 파일을 제거한 후 Unity를 완전히 종료합니다.
  2. Unity가 에셋을 다시 가져오도록 강제하기 위해 프로젝트 디렉터리에서 Library 폴더를 삭제합니다.
  3. Unity 프로젝트를 다시 엽니다.
  4. Unity가 에셋 다시 가져오기를 완료할 때까지 기다립니다.
  5. UPM 설치를 진행하기 전에 컴파일 오류가 없는지 확인합니다.

5. UPM 패키지 설치

이제 Unity Package Manager를 통해 Singular SDK를 설치할 준비가 되었습니다. 이 가이드 상단의 UPM 설치 지침 을 따르세요.