Audience Network를 사용하면 Facebook 광고를 통해 Android 및 iOS 앱에서 수익을 창출할 수 있습니다. 보상형 동영상 광고는 전체 화면 형식으로 노출되며, 사용자는 이 동영상 광고를 보는 대가로 온라인 통화, 앱 내 아이템, 독점 콘텐츠 등의 혜택을 받습니다. 광고는 짧은 동영상이며, 마지막 슬라이드에는 행동 유도 버튼이 포함됩니다. 사용자가 동영상을 모두 조회하면 여러분은 약속된 보상을 지급하라는 콜백을 받게 됩니다.
계속 진행하기 전에 Audience Network 시작하기 및 Unity 시작하기 가이드를 완료했는지 확인하세요.
보상형 동영상 광고를 표시하기 위한 첫 단계는 GameObject
에 첨부된 C# 스크립트에서 RewardedVideoAd
개체를 만드는 것입니다.
... using AudienceNetwork; ... public class RewardedVideoAdTest : MonoBehaviour { public void LoadRewardedVideo() { // Create the rewarded video unit with a placement ID (generate your own on the Facebook app settings). // Use different ID for each ad placement in your app. this.rewardedVideoAd = new RewardedVideoAd("YOUR_PLACEMENT_ID"); this.rewardedVideoAd.Register(this.gameObject); // Set delegates to get notified on changes or when the user interacts with the ad. this.rewardedVideoAd.RewardedVideoAdDidLoad = (delegate() { Debug.Log("RewardedVideo ad loaded."); this.isLoaded = true; }); this.rewardedVideoAd.RewardedVideoAdDidFailWithError = (delegate(string error) { Debug.Log("RewardedVideo ad failed to load with error: " + error); }); this.rewardedVideoAd.RewardedVideoAdWillLogImpression = (delegate() { Debug.Log("RewardedVideo ad logged impression."); }); this.rewardedVideoAd.RewardedVideoAdDidClick = (delegate() { Debug.Log("RewardedVideo ad clicked."); }); this.rewardedVideoAd.RewardedVideoAdDidClose = (delegate() { Debug.Log("Rewarded video ad did close."); if (this.rewardedVideoAd != null) { this.rewardedVideoAd.Dispose(); } }); // Initiate the request to load the ad. this.rewardedVideoAd.LoadAd(); } }
RewardedVideoAd
생성자의 매개변수는 다음과 같습니다.
placementId
- 이 보상형 동영상 광고 유닛의 Audience Network 노출 위치 ID그다음으로는 몇 개의 콜백을 구현하여 광고의 수명 주기 이벤트를 받아봅니다. 아래 예시와 같이 이벤트의 델리게이트를 등록하여 해당 이벤트를 수신합니다.
... // Set delegates to get notified on changes or when the user interacts with the ad. this.rewardedVideoAd.RewardedVideoAdDidLoad = (delegate() { Debug.Log("RewardedVideo ad loaded."); this.isLoaded = true; }); this.rewardedVideoAd.RewardedVideoAdDidFailWithError = (delegate(string error) { Debug.Log("RewardedVideo ad failed to load with error: " + error); }); this.rewardedVideoAd.RewardedVideoAdWillLogImpression = (delegate() { Debug.Log("RewardedVideo ad logged impression."); }); this.rewardedVideoAd.RewardedVideoAdDidClick = (delegate() { Debug.Log("RewardedVideo ad clicked."); }); this.rewardedVideoAd.RewardedVideoAdDidClose = (delegate() { Debug.Log("Rewarded video ad did close."); if (this.rewardedVideoAd != null) { this.rewardedVideoAd.Dispose(); } }); ...
이 내용은 Android에만 적용됩니다.
현재 Android용 Unity 게임은 메인 Unity Activity
만 singleTask
의 launchMode
를 가질 수 있도록 지원합니다. Android 매니페스트를 위한 Unity 문서와 활동을 위한 Android 문서를 참조하세요.
Activity
를 사용하여 Interstitial
및 Rewarded Video
광고를 표시하기 때문에 사용자가 앱을 백그라운드로 돌렸다가 앱 전환기가 아닌 아이콘으로 다시 앱을 시작하면 광고 활동이 적절히 닫히지 않은 상태에서 폐기될 수 있습니다. 다음 콜백을 사용하여 사용자가 광고를 닫았는지 확인할 수 있습니다.
삽입 광고:
this.interstitialAd.interstitialAdDidClose = (delegate() { Debug.Log("Interstitial ad did close."); this.didClose = true; if (this.interstitialAd != null) { this.interstitialAd.Dispose(); } }); #if UNITY_ANDROID /* * Android에만 적용됩니다. * 삽입 광고 활동이 적절히 닫히지 않은 상태에서 * 폐기되었을 경우에만 이 콜백이 트리거됩니다. * launchMode:singleTask가 있는 앱(예: Unity 게임)을 * 백그라운드로 돌렸다가 아이콘을 탭해서 다시 시작하면 이렇게 될 수 있습니다. */ this.interstitialAd.interstitialAdActivityDestroyed = (delegate() { if (!this.didClose) { Debug.Log("Interstitial activity destroyed without being closed first."); Debug.Log("Game should resume."); } }); #endif
보상형 동영상:
this.rewardedVideoAd.rewardedVideoAdDidClose = (delegate() { Debug.Log("Rewarded video ad did close."); this.didClose = true; if (this.rewardedVideoAd != null) { this.rewardedVideoAd.Dispose(); } }); #if UNITY_ANDROID /* * Android에만 적용됩니다. * 보상형 동영상 활동이 적절히 닫히지 않은 상태에서 * 폐기되었을 경우에만 이 콜백이 트리거됩니다. launchMode:singleTask가 있는 앱(예: Unity 게임)을 * 백그라운드로 돌렸다가 아이콘을 탭해서 다시 시작하면 이렇게 될 수 있습니다. */ this.rewardedVideoAd.rewardedVideoAdActivityDestroyed = (delegate() { if (!this.didClose) { Debug.Log("Rewarded video activity destroyed without being closed first."); Debug.Log("Game should resume. User should not get a reward."); } }); #endif
RewardedVideoAd
가 인스턴스화되고 나면 광고를 읽어들여야 합니다. 이를 위해서는 loadAd
메서드를 호출하면 됩니다.
위의 예시에서 광고 로드를 시작하는 방법은 다음과 같습니다.
... this.rewardedVideoAd.LoadAd(); ...
마지막으로 광고를 로드하고 나면 Show
메서드를 호출하여 화면에 보상형 동영상 광고를 렌더링할 수 있습니다. 예를 들어 ShowRewardedVideo
에 대한 함수를 만들고 광고를 표시할 시점이 되면 이 함수를 호출합니다.
public void ShowRewardedVideo() { if (this.isLoaded) { this.rewardedVideoAd.Show(); this.isLoaded = false; } else { Debug.Log("Ad not loaded. Click load to request an ad."); } }
이는 선택 사항입니다! 동영상 광고를 활용하기 위해 서버 측 보상 검증을 구현할 필요가 없습니다. 자체 서버에 검증 단계를 도입하여 보안을 강화하려는 경우에만 서버에 보상 검증을 구현하면 됩니다. 이 기능을 활성화하려면 담당 Facebook 직원에게 퍼블리셔 엔드포인트를 제공하세요.
서버 측에서 사용자 보상을 관리하는 경우 Facebook이 제공하는 솔루션을 통해 검증 기술을 사용하여 해당 관리 작업을 안전하게 수행하는 데 도움을 받을 수 있습니다. Facebook 서버에서는 지정된 https 엔드포인트와 통신하여 각 광고 노출 위치를 검증하고 보상을 허락하기에 적절한지 판단합니다.
placementId
: Audience Network 노출 위치 IDRewardData
- 사용자 ID를 나타내는 UserId
와 실제 게임 내 보상을 나타내는 Currency
로 구성된 RewardData
개체200 response
: 요청이 유효하므로 보상을 제공해야 합니다.Non 200 response
: 요청이 유효하지 않으므로 보상을 제공해서는 안 됩니다.RewardedVideoAdDidSucceed
- 3단계에서 200 response가 수신된 경우에만 트리거됩니다.RewardedVideoAdDidFail
- 3단계에서 200 response 외 응답이 수신된 경우에 트리거됩니다.Facebook 서버에서 퍼블리셔 엔드포인트에 연결되는 URL의 예: https://www.your_end_point.com/?token=APP_SECRET&puid=USER_ID&pc=REWARD_ID&ptid=UNIQUE_TRANSACTION_ID
워크플로는 다음과 같습니다.
보상형 동영상 개체를 초기화한 후 광고를 읽어들이기 전에 보상형 광고 데이터에 사용자 ID와 보상 금액을 전달해야 합니다. RewardData
클래스를 사용하면 됩니다. 사용자 ID와 보상 금액은 모두 문자열입니다. 예를 들면 다음과 같습니다.
public class RewardedVideoAdTest : MonoBehaviour { ... private bool isLoaded; private RewardedVideoAd rewardedVideoAd; public void LoadRewardedVideo() //Set the rewarded ad data RewardData rewardData = new RewardData(); rewardData.UserId = "USER_ID"; rewardData.Currency = "REWARD_ID"; // Instantiate RewardedVideoAd with reward data this.rewardedVideoAd = new RewardedVideoAd("YOUR_PLACEMENT_ID", rewardData); this.rewardedVideoAd.Register(this.gameObject); // Set delegates to get notified on changes or when the user interacts with the ad. this.rewardedVideoAd.RewardedVideoAdDidLoad = (delegate() { Debug.Log("RewardedVideo ad loaded."); this.isLoaded = true; }); this.rewardedVideoAd.RewardedVideoAdDidFailWithError = (delegate(string error) { Debug.Log("RewardedVideo ad failed to load with error: " + error); }); this.rewardedVideoAd.RewardedVideoAdWillLogImpression = (delegate() { Debug.Log("RewardedVideo ad logged impression."); }); this.rewardedVideoAd.RewardedVideoAdDidClick = (delegate() { Debug.Log("RewardedVideo ad clicked."); }); this.rewardedVideoAd.RewardedVideoAdDidClose = (delegate() { Debug.Log("Rewarded video ad did close."); if (this.rewardedVideoAd != null) { this.rewardedVideoAd.Dispose(); } }); // For S2S validation you need to register the following two callback this.rewardedVideoAd.RewardedVideoAdDidSucceed = (delegate() { Debug.Log("Rewarded video ad validated by server"); }); this.rewardedVideoAd.RewardedVideoAdDidFail = (delegate() { Debug.Log("Rewarded video ad not validated, or no response from server"); }); this.rewardedVideoAd.loadAd(); } ... }
앱에서 보상의 유효성에 관한 알림을 받으려면 RewardedVideoAd
에 대한 다른 콜백 외에도 RewardedVideoAdDidSucceed
와 RewardedVideoAdDidFail
콜백을 구현해야 합니다.
광고가 로드되고 나면 일반 RewardedVideoAd
등의 Show
메서드로 광고를 렌더링할 수 있습니다.
참고 - 사용자가 마지막 슬라이드를 닫은 이후에 서버 검증 콜백이 발생할 수 있습니다. 이 콜백 중 하나가 실행될 때까지 보상형 동영상 개체 할당을 취소해서는 안 됩니다.
Unity 앱에서 여러 광고 형식을 통합하려면 Facebook 가이드를 참조하세요.
앱에 광고를 전송하여 수익을 창출할 준비가 완료되었다면, 앱이 Audience Network 정책 및 Facebook 커뮤니티 규정을 준수하는지 확인한 후 검수를 위해 제출하세요.