adstage
Mobile SDKDeep Link

Unity

คู่มือการเชื่อมต่อ In-App Event ของ AdStage (Unity)

สารบัญ

  1. ภาพรวม
  2. การตั้งค่าพื้นฐาน
  3. การส่งอีเวนต์แบบ Type-Safe
  4. แคตตาล็อกอีเวนต์มาตรฐาน
  5. การแก้ไขปัญหา

ภาพรวม

AdStage Unity SDK v3.0 ได้นำ ระบบอีเวนต์แบบ type-safe มาใช้ เพื่อป้องกันข้อผิดพลาดตั้งแต่ตอนคอมไพล์ และเข้ากันได้อย่างสมบูรณ์กับ SDK เนทีฟของ Android/iOS

แพลตฟอร์มที่รองรับ

  • ✅ Android (API 21+)
  • ✅ iOS (12.0+)

การตั้งค่าพื้นฐาน

1. ติดตั้งแพ็กเกจ

ติดตั้งผ่าน Package Manager:

Window → Package Manager → + → Add package from git URL
https://github.com/nbase-io/NBase-SDK-Unity.git?path=/AdStageSDK-Package

หรือแก้ไข manifest.json โดยตรง:

{
  "dependencies": {
    "com.nbase.adstage": "https://github.com/nbase-io/NBase-SDK-Unity.git?path=/AdStageSDK-Package#3.0.0"
  }
}

2. เริ่มต้นใช้งาน SDK

using AdStageSDK;
using UnityEngine;
 
public class GameManager : MonoBehaviour
{
    void Start()
    {
        // AdStage 초기화
        AdStage.Initialize(
            apiKey: "your-api-key-here"
        );
        
        Debug.Log("✅ AdStage SDK 초기화 완료");
    }
}

3. การตั้งค่า Android (AndroidManifest.xml)

<manifest xmlns:android="http://schemas.android.com/apk/res/android">
    
    <!-- 필수 권한 -->
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    
</manifest>

4. การตั้งค่า iOS (Info.plist)

<!-- 네트워크 사용 권한 -->
<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <false/>
</dict>

การส่งอีเวนต์แบบ Type-Safe

1. วิธีที่ง่ายที่สุด

using AdStageSDK;
using AdStageSDK.Models;
 
public class GameController : MonoBehaviour
{
    void Start()
    {
        // 파라미터 없는 이벤트
        AdStage.TrackEvent(AdStageEvent.Custom());
        
        // 로그인 이벤트
        AdStage.TrackEvent(
            AdStageEvent.Login(method: "email")
        );
    }
}

2. อีเวนต์การซื้อ (ตัวอย่างการตรวจสอบ)

// ✅ GOOD: value와 currency 함께 제공
AdStage.TrackEvent(
    AdStageEvent.Purchase(
        value: 29.99,
        currency: "USD",
        transactionId: "TXN_123456"
    )
);
 
// ❌ BAD: value만 제공 시 런타임 에러!
AdStage.TrackEvent(
    AdStageEvent.Purchase(
        value: 29.99  // ❌ 에러: currency 필수!
    )
);
 
// ✅ GOOD: currency 없이 transactionId만
AdStage.TrackEvent(
    AdStageEvent.Purchase(
        transactionId: "TXN_123456"
    )
);

3. การใช้คอลแบ็ก

AdStage.TrackEvent(
    AdStageEvent.Purchase(
        value: 9900.0,
        currency: "KRW",
        transactionId: "ORDER_001"
    ),
    onSuccess: (success) => {
        Debug.Log("✅ 이벤트 전송 성공");
    },
    onError: (error) => {
        Debug.LogError($"❌ 이벤트 전송 실패: {error}");
    }
);

4. อีเวนต์แบบกำหนดเอง (การเลื่อนระดับ event_name อัตโนมัติ)

เมื่อต้องการส่งอีเวนต์เฉพาะของแอปนอกเหนือจากอีเวนต์มาตรฐาน ให้ใช้ AdStageEvent.Custom หากใส่คีย์ event_name ในพารามิเตอร์ ค่าดังกล่าวจะถูกเลื่อนระดับขึ้นเป็นชื่ออีเวนต์จริงโดยอัตโนมัติ และถูกบันทึกไว้ในแดชบอร์ด

// 예: 'promotion_click'이라는 커스텀 이벤트 전송
var promotionParams = new Dictionary<string, object>
{
    { "event_name", "promotion_click" },
    { "promotion_id", "summer_sale_2025" },
    { "screen", "home_banner" }
};
 
AdStage.TrackEvent(AdStageEvent.Custom(promotionParams));
// 대시보드에는 "promotion_click" 이벤트로 수집됨
 
// event_name 없이 일반 커스텀 이벤트
var customParams = new Dictionary<string, object>
{
    { "action", "button_click" },
    { "button_id", "promo_banner" },
    { "screen", "home" },
    { "timestamp", DateTimeOffset.UtcNow.ToUnixTimeSeconds() }
};
 
AdStage.TrackEvent(AdStageEvent.Custom(customParams));
// 대시보드에는 "custom" 이벤트로 수집됨
 
// Click, View도 자유 파라미터 지원
var clickParams = new Dictionary<string, object>
{
    { "campaign_id", "SUMMER2025" },
    { "ad_group", "electronics" }
};
 
AdStage.TrackEvent(AdStageEvent.Click(clickParams));

แคตตาล็อกอีเวนต์มาตรฐาน

AdStage Unity SDK มีอีเวนต์มาตรฐาน 46 รายการ

📌 การติดตามโฆษณา (4 รายการ)

// 1. 광고 클릭
AdStage.TrackEvent(AdStageEvent.Click(
    new Dictionary<string, object> { { "campaign_id", "CAMP_123" } }
));
 
// 2. 광고 노출
AdStage.TrackEvent(AdStageEvent.View(
    new Dictionary<string, object> { { "impression_id", "IMP_456" } }
));
 
// 3. 앱 설치
AdStage.TrackEvent(AdStageEvent.Install());
 
// 4. 커스텀 이벤트 (event_name으로 이벤트 이름 지정)
AdStage.TrackEvent(AdStageEvent.Custom(
    new Dictionary<string, object> { 
        { "event_name", "promotion_click" },
        { "promotion_id", "summer_sale_2025" }
    }
));

👤 วงจรชีวิตผู้ใช้ (5 รายการ)

// 1. 회원가입 완료
AdStage.TrackEvent(AdStageEvent.SignUp(method: "google"));
 
// 2. 회원가입 시작
AdStage.TrackEvent(AdStageEvent.SignUpStart());
 
// 3. 로그인
AdStage.TrackEvent(AdStageEvent.Login(method: "email"));
 
// 4. 로그아웃
AdStage.TrackEvent(AdStageEvent.Logout());
 
// 5. 앱 최초 실행
AdStage.TrackEvent(AdStageEvent.FirstOpen());

📄 การดูเนื้อหา (6 รายการ)

// 1. 홈 화면
AdStage.TrackEvent(AdStageEvent.HomeView());
 
// 2. 상품 목록
AdStage.TrackEvent(AdStageEvent.ProductListView(itemCategory: "electronics"));
 
// 3. 검색 결과
AdStage.TrackEvent(AdStageEvent.SearchResultView(searchTerm: "wireless headphones"));
 
// 4. 상품 상세
AdStage.TrackEvent(AdStageEvent.ProductDetailsView(
    itemId: "PROD_123",
    itemName: "Wireless Earbuds"
));
 
// 5. 페이지 조회 (웹)
AdStage.TrackEvent(AdStageEvent.PageView(
    pageUrl: "https://example.com/products",
    pageTitle: "Products"
));
 
// 6. 화면 조회 (Unity Scene)
AdStage.TrackEvent(AdStageEvent.ScreenView(
    screenName: "MainMenu",
    screenClass: "MainMenuScene"
));

🛒 อีคอมเมิร์ซ (8 รายการ)

// 1. 장바구니 추가
var cartItem = new EcommerceItem(
    itemId : "PROD_123",
    itemName : "Wireless Earbuds",
    price : 99000.0,
    quantity : 1
);
 
AdStage.TrackEvent(AdStageEvent.AddToCart(
    value: 99000.0,
    currency: "KRW",
    items: new List<EcommerceItem> { cartItem }
));
 
// 2. 장바구니 제거
AdStage.TrackEvent(AdStageEvent.RemoveFromCart(
    value: 50000.0,
    currency: "KRW"
));
 
// 3. 위시리스트 추가
AdStage.TrackEvent(AdStageEvent.AddToWishlist(
    itemId: "PROD_456",
    itemName: "Smart Watch"
));
 
// 4. 결제 정보 입력
AdStage.TrackEvent(AdStageEvent.AddPaymentInfo(paymentType: "credit_card"));
 
// 5. 결제 시작
AdStage.TrackEvent(AdStageEvent.BeginCheckout(
    value: 150000.0,
    currency: "KRW"
));
 
// 6. 구매 완료 ⭐⭐⭐
var purchaseItems = new List<EcommerceItem>
{
    new EcommerceItem(
        itemId: "PROD_123",
        itemName: "Wireless Earbuds",
        price: 126000.0,
        quantity: 1
    )
};
 
AdStage.TrackEvent(AdStageEvent.Purchase(
    value: 129000.0,
    currency: "KRW",
    transactionId: "ORDER_20250105_001",
    tax: 12900.0,
    shipping: 3000.0,
    coupon: "SUMMER2025",
    items: purchaseItems
));
 
// 7. 환불
AdStage.TrackEvent(AdStageEvent.Refund(
    transactionId: "ORDER_20250105_001",
    value: 129000.0,
    currency: "KRW"
));

🎮 ความคืบหน้า/ความสำเร็จ (4 รายการ)

// 1. 튜토리얼 시작
AdStage.TrackEvent(AdStageEvent.TutorialBegin(
    new Dictionary<string, object> { { "tutorial_id", "intro" } }
));
 
// 2. 튜토리얼 완료
AdStage.TrackEvent(AdStageEvent.TutorialComplete(
    new Dictionary<string, object> { { "duration_seconds", 120 } }
));
 
// 3. 레벨 업
AdStage.TrackEvent(AdStageEvent.LevelUp(
    level: 25,
    character: "warrior"
));
 
// 4. 업적 달성
AdStage.TrackEvent(AdStageEvent.Achievement(achievementId: "first_win"));

💬 การโต้ตอบ (3 รายการ)

// 1. 검색
AdStage.TrackEvent(AdStageEvent.Search(searchTerm: "gaming laptop"));
 
// 2. 공유
AdStage.TrackEvent(AdStageEvent.Share(
    contentType: "product",
    method: "kakao"
));
 
// 3. 광고 클릭
AdStage.TrackEvent(AdStageEvent.AdClick(adPlatform: "unity", adSource:"unity_source", adFormat:"unity_format", adUnitName: "AD_12345"));

🎮 เฉพาะเกม (4 รายการ)

// 1. 게임 플레이
AdStage.TrackEvent(AdStageEvent.GamePlay(
    level: 10,
    levelName: "Dragon's Lair",
    character: "mage",
    contentType: "dungeon"
));
 
// 2. 보너스 획득
AdStage.TrackEvent(AdStageEvent.AcquireBonus(
    contentType: "reward",
    itemId: "ITEM_123",
    itemName: "Gold Chest",
    quantity: 1
));
 
// 3. 게임 서버 선택
AdStage.TrackEvent(AdStageEvent.SelectGameServer(
    contentId: "SERVER_01",
    contentType: "pvp",
    itemName: "Asia Server"
));
 
// 4. 패치 완료
AdStage.TrackEvent(AdStageEvent.CompletePatch(
    contentId: "PATCH_2.1.0",
    contentType: "update"
));

📅 การสมัครสมาชิก/ทดลองใช้ (3 รายการ)

// 1. 무료 체험 시작
AdStage.TrackEvent(AdStageEvent.StartTrial(
    value: 9900.0,
    currency: "KRW",
    trialDays: 14
));
 
// 2. 구독 시작
AdStage.TrackEvent(AdStageEvent.Subscribe(
    value: 9900.0,
    currency: "KRW",
    subscriptionId: "premium_monthly"
));
 
// 3. 구독 취소
AdStage.TrackEvent(AdStageEvent.Unsubscribe(subscriptionId: "premium_monthly"));

การแก้ไขปัญหา

1. อีเวนต์ไม่ถูกส่งใน Unity Editor

นี่เป็นการทำงานที่ปกติ! ใน Editor จะแสดงเฉพาะล็อกเท่านั้น และจะไม่มีการส่งจริง

วิธีตรวจสอบ:

#if UNITY_EDITOR
Debug.Log("📊 [Editor Mode] 이벤트는 실제 기기에서만 전송됩니다");
#endif

2. อีเวนต์ไม่ถูกส่งหลังจากบิลด์ Android

รายการตรวจสอบ:

  1. ตรวจสอบ Logcat: adb logcat | grep -i adstage
  2. สิทธิ์อินเทอร์เน็ต: ตรวจสอบสิทธิ์ INTERNET ใน AndroidManifest.xml
  3. ปิดใช้งาน Minify (สำหรับทดสอบ): ตรวจสอบการตั้งค่า ProGuard/R8
// 디버그 빌드로 테스트
BuildOptions options = BuildOptions.Development | BuildOptions.AllowDebugging;

3. อีเวนต์ไม่ถูกส่งหลังจากบิลด์ iOS

รายการตรวจสอบ:

  1. ตรวจสอบ Xcode Console: ตรวจสอบข้อความแสดงข้อผิดพลาด
  2. การลิงก์ Framework: ตรวจสอบว่าฝัง AdapterAdStage.framework ไว้แล้ว
  3. การตั้งค่า Bitcode: ปิดใช้งาน Bitcode ใน Build Settings

4. ข้อผิดพลาดในการบิลด์ IL2CPP

วิธีแก้ไข:

// link.xml 파일 생성
<linker>
    <assembly fullname="AdStageSDK" preserve="all"/>
    <assembly fullname="AdStageSDK.Models" preserve="all"/>
</linker>

5. ข้อผิดพลาดในการแปลงข้อมูล JSON

ปัญหา:

System.ArgumentException: Invalid JSON

วิธีแก้ไข:

// Dictionary 값이 null인지 확인
var parameters = new Dictionary<string, object>
{
    { "key1", value ?? "default" },
    { "key2", string.IsNullOrEmpty(value2) ? "unknown" : value2 }
};

6. ข้อผิดพลาดในการตรวจสอบรหัสสกุลเงิน

// ❌ 2자리 코드
AdStageEvent.Purchase(value: 100.0, currency: "KR")
// ValidationException: "Currency must be 3-letter ISO 4217 code"
 
// ✅ 3자리 ISO 4217 코드
AdStageEvent.Purchase(value: 100.0, currency: "KRW")  // 한국 원
AdStageEvent.Purchase(value: 100.0, currency: "USD")  // 미국 달러
AdStageEvent.Purchase(value: 100.0, currency: "JPY")  // 일본 엔

ข้อมูลอ้างอิง

มาตรฐานอ้างอิง


FAQ

Q: ทดสอบใน Unity Editor ได้ไหม?
A: ใน Editor จะแสดงเฉพาะล็อกเท่านั้น การทดสอบจริงต้องทำบนเครื่องจริง

Q: ทำงานเหมือนกันทั้ง Android และ iOS หรือไม่?
A: ใช่ อีเวนต์ทั้ง 46 รายการทำงานเหมือนกันทั้งหมด

Q: ใช้ร่วมกับ Unity IAP ได้ไหม?
A: ใช่ เพียงเรียกอีเวนต์ AdStage ในคอลแบ็ก ProcessPurchase

Q: ทำงานแบบออฟไลน์ได้ไหม?
A: ใช่ SDK เนทีฟจะจัดคิวอีเวนต์โดยอัตโนมัติ และส่งเมื่อเครือข่ายกลับมาทำงาน

Q: ส่งอีเวนต์แบบกำหนดเองอย่างไร?
A: ใช้ AdStageEvent.Custom(new Dictionary<string, object> {...})


การสนับสนุน

ติดต่อ:


© 2025 NBase. All rights reserved.

สารบัญ

คู่มือการเชื่อมต่อ In-App Event ของ AdStage (Unity)สารบัญภาพรวมแพลตฟอร์มที่รองรับการตั้งค่าพื้นฐาน1. ติดตั้งแพ็กเกจ2. เริ่มต้นใช้งาน SDK3. การตั้งค่า Android (AndroidManifest.xml)4. การตั้งค่า iOS (Info.plist)การส่งอีเวนต์แบบ Type-Safe1. วิธีที่ง่ายที่สุด2. อีเวนต์การซื้อ (ตัวอย่างการตรวจสอบ)3. การใช้คอลแบ็ก4. อีเวนต์แบบกำหนดเอง (การเลื่อนระดับ event_name อัตโนมัติ)แคตตาล็อกอีเวนต์มาตรฐาน📌 การติดตามโฆษณา (4 รายการ)👤 วงจรชีวิตผู้ใช้ (5 รายการ)📄 การดูเนื้อหา (6 รายการ)🛒 อีคอมเมิร์ซ (8 รายการ)🎮 ความคืบหน้า/ความสำเร็จ (4 รายการ)💬 การโต้ตอบ (3 รายการ)🎮 เฉพาะเกม (4 รายการ)📅 การสมัครสมาชิก/ทดลองใช้ (3 รายการ)การแก้ไขปัญหา1. อีเวนต์ไม่ถูกส่งใน Unity Editor2. อีเวนต์ไม่ถูกส่งหลังจากบิลด์ Android3. อีเวนต์ไม่ถูกส่งหลังจากบิลด์ iOS4. ข้อผิดพลาดในการบิลด์ IL2CPP5. ข้อผิดพลาดในการแปลงข้อมูล JSON6. ข้อผิดพลาดในการตรวจสอบรหัสสกุลเงินข้อมูลอ้างอิงมาตรฐานอ้างอิงFAQการสนับสนุน