안드로이드앱에서 광고 콜백을 처리하는 IUnityAdsListener 인터페이스를 구현합니다. SDK를 초기화하는 Initialize 메소드에는 이 리스너가 매개 변수로 필요합니다.
아래는 소스 코드입니다.
import com.unity3d.ads.IUnityAdsListener;
import com.unity3d.ads.UnityAds;
public class InitializeAdsScript extends AppCompatActivity implements View.OnClickListener, IUnityAdsListener {
private String unityGameID = "1234567";
private Boolean testMode = true;
@Override
protected void onCreate (Bundle savedInstanceState) {
super.onCreate (savedInstanceState);
setContentView (R.layout.activity_main);
// Declare a new listener:
final UnityAdsListener myAdsListener = new UnityAdsListener ();
// Add the listener to the SDK:
UnityAds.addListener(myAdsListener);
// Initialize the SDK:
UnityAds.initialize (this, unityGameID, testMode);
}
// Implement the IUnityAdsListener interface methods:
private class UnityAdsListener implements IUnityAdsListener {
@Override
public void onUnityAdsReady (String placementId) {
// Implement functionality for an ad being ready to show.
}
@Override
public void onUnityAdsStart (String placementId) {
// Implement functionality for a user starting to watch an ad.
}
@Override
public void onUnityAdsFinish (String placementId, UnityAds.FinishState finishState) {
// Implement functionality for a user finishing an ad.
}
@Override
public void onUnityAdsError (UnityAds.UnityAdsError error, String message) {
// Implement functionality for a Unity Ads service error occurring.
}
}
}
전면광고를 표시하려면 게재 위치 ID로 표시 기능을 사용하면 됩니다.
전면광고 예제코드입니다.
import com.unity3d.ads.IUnityAdsListener;
import com.unity3d.ads.UnityAds;
public class ShowInterstitialAds extends AppCompatActivity implements View.OnClickListener, IUnityAdsListener {
private String unityGameID = "1234567";
private Boolean testMode = true;
private String placementId = "video";
@Override
protected void onCreate (Bundle savedInstanceState) {
super.onCreate (savedInstanceState);
setContentView (R.layout.activity_main);
// Declare a new listener:
final UnityAdsListener myAdsListener = new UnityAdsListener ();
// Add the listener to the SDK:
UnityAds.addListener(myAdsListener);
// Initialize the SDK:
UnityAds.initialize (this, unityGameID, testMode);
}
// Implement a function to display an ad if the Placement is ready:
public void DisplayInterstitialAd () {
if (UnityAds.isReady (placementId)) {
UnityAds.show (this, placementId);
}
}
// Implement the IUnityAdsListener interface methods:
private class UnityAdsListener implements IUnityAdsListener {
@Override
public void onUnityAdsReady (String placementId) {
// Implement functionality for an ad being ready to show.
}
@Override
public void onUnityAdsStart (String placementId) {
// Implement functionality for a user starting to watch an ad.
}
@Override
public void onUnityAdsFinish (String placementId, UnityAds.FinishState finishState) {
// Implement functionality for a user finishing an ad.
}
@Override
public void onUnityAdsError (UnityAds.UnityAdsError error, String message) {
// Implement functionality for a Unity Ads service error occurring.
}
}
}
보상형광고도 마찬가지입니다. 광고시청에 대한 보상을 제공하면서 표시되는 광고입니다. 동영상 광고를 완료한 앱사용자에게 보상을 제공하려면 onUnityAdsFinish 리스너 콜백 메소드의 FinishState 결과를 사용하여 사용자가 광고 시청을 완료했는지, 보상을 받아야 하는지 확인합니다.
아래는 보상형 광고 예제 샘플입니다.
import com.unity3d.ads.IUnityAdsListener;
import com.unity3d.ads.UnityAds;
public class ShowRewardedAds extends AppCompatActivity implements View.OnClickListener, IUnityAdsListener {
private String unityGameID = "1234567";
private Boolean testMode = true;
private String placementId = "rewardedVideo";
@Override
protected void onCreate (Bundle savedInstanceState) {
super.onCreate (savedInstanceState);
setContentView (R.layout.activity_main);
// Declare a new listener:
final UnityAdsListener myAdsListener = new UnityAdsListener ();
// Add the listener to the SDK:
UnityAds.addListener(myAdsListener);
// Initialize the SDK:
UnityAds.initialize (this, unityGameID, testMode);
}
// Implement a function to display an ad if the Placement is ready:
public void DisplayRewardedVideoAd () {
if (UnityAds.isReady (placementId)) {
UnityAds.show (this, placementId);
}
}
// Implement the IUnityAdsListener interface methods:
private class UnityAdsListener implements IUnityAdsListener {
public void onUnityAdsReady (String placementId) {
// Implement functionality for an ad being ready to show.
}
@Override
public void onUnityAdsStart (String placementId) {
// Implement functionality for a user starting to watch an ad.
}
@Override
public void onUnityAdsFinish (String placementId, UnityAds.FinishState finishState) {
// Implement conditional logic for each ad completion status:
if (finishState.equals(UnityAds.FinishState.COMPLETED) {
// Reward the user for watching the ad to completion.
} else if (result == FinishState.SKIPPED) {
// Do not reward the user for skipping the ad.
} else if (result == FinishState.ERROR) {
// Log an error.
}
}
@Override
public void onUnityAdsError (UnityAds.UnityAdsError error, String message) {
// Implement functionality for a Unity Ads service error occurring.
}
}
}
위와 같이 안드로이드에서도 간단하게 유니티 ads 광고를 붙일 수 있습니다.
구글애드몹 광고가 잘 나오지 않을때 효율이 좋지 않을때 유니티 광고와 병행을 한다면 더욱 좋은 결과를 만드실 수 있습니다.
res->New->Fragment->Fragment(Blank) 빈 fragment를 선택해줍니다.
탭 갯수만큼 만들어주시면 됩니다. 이름도 각 탭에 맞게 만들어주시구요.
그런다음 java 클래스를 하나 추가합니다.
New-> Java Class -> PagerAdapter.java
package com.apprichkorea.misstrot;
import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentPagerAdapter;
import androidx.lifecycle.Lifecycle;
import androidx.viewpager2.adapter.FragmentStateAdapter;
public class PagerAdapter extends FragmentStateAdapter {
private int tabsNumber;
public PagerAdapter(@NonNull FragmentManager fm, Lifecycle l, int tabs) {
super(fm, l);
this.tabsNumber = tabs;
}
@NonNull
@Override
public Fragment createFragment(int position) {
switch (position){
case 0:
return new First();
case 1:
return new Second();
case 2:
return new Three();
case 3:
return new Four();
case 4:
return new Five();
default: return null;
}
}
@Override
public int getItemCount() {
return tabsNumber;
}
}
각 탭을 클릭했을때 이동할 fragment를 생성해서 넘어가게 코딩을 해 줍니다.
이제 마지막으로 MainActivity.java에서 이벤트 리스너와 아답터를 연결하는 부분을 코딩해 줍니다.
글로만 설명을 하다보니 정확하게 와닿지 않으실것 같습니다. 그래서 이번 시간에는 게임매니저 싱글턴 구현 예제를 통해 알아보도록 하겠습니다.
GameManager 싱글턴 구현
GameManager에서 싱글턴을 구현한 부분을 먼저 살펴보고 다른 부분을 완성하겠습니다.
public static GameManger instance;
void Awake(){
if(instance == null)
{
instance = this;
}else{
Debug.LogWarning("두 개 이상의 게임 매니저가 존재합니다");
Destroy(gameObject);
}
}
GameManager 스크립트의 최상단에는 싱글턴 오브젝트를 할당하기 위한 static 선언된 GameManager 타입의 변수 instance가 있습니다. Awake() 메서드에서는 현재 오브젝트를 싱글턴 오브젝트로 만들고 instance에 할당하는 작업을 실행합니다. instance는 싱글턴이 될 GameManager 오브젝트가 저장될 변수입니다.
static으로 선언된 변수는 모든 오브젝트가 공유하는 단 하나의 변수가 됩니다. 이것을 다르게 생각하면 instance는 프로젝트에서 하나만 존재해야 하는 것입니다.
instance에는 GameManager 타입 오브젝트의 참조를 할당할 수 있습니다. 그런데 씬에 GameManager타입의 오브젝트가 100개 존재해도 instance는 메모리에 단 하나만 존재하므로 instance에 할당될 수 있는 GameManager 오브젝트도 단 하나뿐입니다.
즉, 싱글턴이 될 GameManager 오브젝트는 스스로를 instance에 할당합니다. 이 과정은 비어있는 왕좌를 경쟁적으로 차지하려는 과정으로 비유할 수 있습니다.
Awake() 메서드의 if문 블록에서는 instance가 비어 있다면 그곳에 자기 자신을 할당합니다.
만약 instance의 값이 null이라면 instance에 아직 어떠한 GameMannger 타입의 오브젝트도 할당되지 않은 상태입니다. 따라서 현재 Awake() 메서드를 실행하고 있는 GameManager 오브젝트가 this를 instance에 할당하여 스스로를 instance에 할당합니다. this는 오브젝트가 자기 자신을 가리키는 키워드로서 스스로에 대한 참조값이 출력됩니다.
이렇게 instance에 할당된 GameManager 오브젝트는 GameManager.instance로 즉시 접근할 수 있습니다.
GameManager 타입의 오브젝트는 씬에 단 하나만 존재해야 합니다. 어떠한 이유로 GameManager 오브젝트가 둘 이상 존재하는 경우 싱글턴이 된 GameManager 오브젝트 하나만 남기고 나머지 GameManager 오브젝트는 모두 파괴해야 합니다.
이어지는 else문 블록은 instance가 null이 아닌 경우에 실행됩니다. 즉, 자신이 아닌 다른 GameManager 오브젝트가 instance에 이미 할당된 경우입니다.
이 경우 경고 로그를 출력하고 싱글턴이 될 수 없는 자신의 게임 오브젝트를 Destory() 메서드로 파괴했습니다.