starOfWords/Assets/Scripts/Reklam/AdMobAllInOne.cs
portakal ecb1c9edea Initial commit: Star of Words Unity project
Snapshot of the existing Unity 6 language-learning word game before any
refactoring. Adds Unity .gitignore and .gitattributes.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-05 15:31:20 +03:00

461 lines
No EOL
12 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using UnityEngine;
using GoogleMobileAds.Api;
using GoogleMobileAds.Common;
using System;
using System.Collections;
using System.Collections.Generic;
public class AdMobAllInOne : MonoBehaviour
{
public static AdMobAllInOne Instance;
[Header("REKLAM MODU")]
[Tooltip("Geliştirme sırasında true bırak. Yayına çıkarken false yap.")]
[SerializeField] private bool useTestAds = false;
private const string TEST_INTERSTITIAL_ID = "ca-app-pub-3940256099942544/1033173712";
private const string TEST_REWARDED_ID = "ca-app-pub-3940256099942544/5224354917";
private const string REAL_INTERSTITIAL_ID = "ca-app-pub-9882956647539723/3464283079";
private const string REAL_REWARDED_ID = "ca-app-pub-9882956647539723/9566656997";
private string InterstitialId => useTestAds ? TEST_INTERSTITIAL_ID : REAL_INTERSTITIAL_ID;
private string RewardedId => useTestAds ? TEST_REWARDED_ID : REAL_REWARDED_ID;
[Header("TEST CİHAZLARI")]
[Tooltip("Gerçek ID'lerle güvenli test için kendi cihazının test ID'sini ekle.")]
[SerializeField] private List<string> testDeviceIds = new List<string>();
[Header("GEÇİŞ REKLAMI AYARI")]
[SerializeField] private float minSecondsBetweenInterstitial = 45f;
private InterstitialAd interstitialAd;
private RewardedAd rewardedAd;
private bool isInitialized = false;
private bool isInterstitialLoading = false;
private bool isRewardedLoading = false;
private int interstitialRetry = 0;
private int rewardedRetry = 0;
private const int MAX_RETRY = 6;
private float lastInterstitialTime = -999f;
private void Awake()
{
if (Instance != null && Instance != this)
{
Destroy(gameObject);
return;
}
Instance = this;
DontDestroyOnLoad(gameObject);
Debug.Log("[ADMOB] Reklam yöneticisi oluşturuldu. Banner sistemi KAPALI.");
}
private void Start()
{
InitializeAds();
}
private void RunOnUnityThread(Action action)
{
if (action == null)
return;
MobileAdsEventExecutor.ExecuteInUpdate(action);
}
private void InitializeAds()
{
if (isInitialized)
return;
if (testDeviceIds != null && testDeviceIds.Count > 0)
{
RequestConfiguration config = new RequestConfiguration
{
TestDeviceIds = testDeviceIds
};
MobileAds.SetRequestConfiguration(config);
}
MobileAds.Initialize(initStatus =>
{
RunOnUnityThread(() =>
{
isInitialized = true;
Debug.Log("[ADMOB] MobileAds başlatıldı. Mod: " + (useTestAds ? "TEST" : "GERÇEK"));
LoadInterstitial();
LoadRewarded();
});
});
}
private IEnumerator RetryAfter(float seconds, Action action)
{
yield return new WaitForSecondsRealtime(seconds);
action?.Invoke();
}
private float RetryDelay(int retry)
{
return Mathf.Pow(2f, Mathf.Clamp(retry, 1, MAX_RETRY));
}
// =====================================================
// INTERSTITIAL / GEÇİŞ REKLAMI
// =====================================================
public void LoadInterstitial()
{
if (!isInitialized)
{
Debug.Log("[ADMOB] Interstitial yüklenemedi, AdMob daha başlamadı.");
return;
}
if (isInterstitialLoading)
return;
if (interstitialAd != null)
{
interstitialAd.Destroy();
interstitialAd = null;
}
isInterstitialLoading = true;
Debug.Log("[ADMOB] Interstitial yükleniyor: " + InterstitialId);
AdRequest request = new AdRequest();
InterstitialAd.Load(InterstitialId, request, (InterstitialAd ad, LoadAdError error) =>
{
RunOnUnityThread(() =>
{
isInterstitialLoading = false;
if (error != null || ad == null)
{
interstitialRetry = Mathf.Min(interstitialRetry + 1, MAX_RETRY);
float delay = RetryDelay(interstitialRetry);
Debug.LogError("[ADMOB] Interstitial yüklenemedi: " +
(error != null ? error.GetMessage() : "ad null") +
" | " + delay + " sn sonra tekrar denenecek.");
StartCoroutine(RetryAfter(delay, LoadInterstitial));
return;
}
interstitialAd = ad;
interstitialRetry = 0;
Debug.Log("[ADMOB] Interstitial yüklendi.");
RegisterInterstitialEvents(interstitialAd);
});
});
}
private void RegisterInterstitialEvents(InterstitialAd ad)
{
ad.OnAdFullScreenContentClosed += () =>
{
RunOnUnityThread(() =>
{
lastInterstitialTime = Time.unscaledTime;
Debug.Log("[ADMOB] Interstitial kapandı, yenisi yükleniyor.");
LoadInterstitial();
});
};
ad.OnAdFullScreenContentFailed += (AdError err) =>
{
RunOnUnityThread(() =>
{
Debug.LogError("[ADMOB] Interstitial gösterilemedi: " +
(err != null ? err.GetMessage() : "bilinmeyen"));
LoadInterstitial();
});
};
ad.OnAdPaid += (AdValue value) =>
{
RunOnUnityThread(() =>
{
Debug.Log("[ADMOB] Interstitial gelir: " + value.Value + " " + value.CurrencyCode);
});
};
}
public void ShowInterstitial()
{
if (!isInitialized)
{
Debug.Log("[ADMOB] Interstitial gösterilemedi, AdMob başlamadı.");
return;
}
if ((Time.unscaledTime - lastInterstitialTime) < minSecondsBetweenInterstitial)
{
Debug.Log("[ADMOB] Interstitial süre limiti nedeniyle gösterilmedi.");
return;
}
TryShowInterstitial();
}
public void ShowInterstitialIgnoreTime()
{
if (!isInitialized)
{
Debug.Log("[ADMOB] Interstitial gösterilemedi, AdMob başlamadı.");
return;
}
TryShowInterstitial();
}
private void TryShowInterstitial()
{
if (interstitialAd != null && interstitialAd.CanShowAd())
{
Debug.Log("[ADMOB] Interstitial gösteriliyor.");
interstitialAd.Show();
}
else
{
Debug.Log("[ADMOB] Interstitial hazır değil, tekrar yükleniyor.");
LoadInterstitial();
}
}
public bool IsInterstitialReady()
{
return interstitialAd != null && interstitialAd.CanShowAd();
}
// =====================================================
// REWARDED / ÖDÜLLÜ REKLAM
// =====================================================
public void LoadRewarded()
{
if (!isInitialized)
{
Debug.Log("[ADMOB] Rewarded yüklenemedi, AdMob daha başlamadı.");
return;
}
if (isRewardedLoading)
return;
if (rewardedAd != null)
{
rewardedAd.Destroy();
rewardedAd = null;
}
isRewardedLoading = true;
Debug.Log("[ADMOB] Rewarded yükleniyor: " + RewardedId);
AdRequest request = new AdRequest();
RewardedAd.Load(RewardedId, request, (RewardedAd ad, LoadAdError error) =>
{
RunOnUnityThread(() =>
{
isRewardedLoading = false;
if (error != null || ad == null)
{
rewardedRetry = Mathf.Min(rewardedRetry + 1, MAX_RETRY);
float delay = RetryDelay(rewardedRetry);
Debug.LogError("[ADMOB] Rewarded yüklenemedi: " +
(error != null ? error.GetMessage() : "ad null") +
" | " + delay + " sn sonra tekrar denenecek.");
StartCoroutine(RetryAfter(delay, LoadRewarded));
return;
}
rewardedAd = ad;
rewardedRetry = 0;
Debug.Log("[ADMOB] Rewarded yüklendi.");
RegisterRewardedEvents(rewardedAd);
});
});
}
private void RegisterRewardedEvents(RewardedAd ad)
{
ad.OnAdFullScreenContentClosed += () =>
{
RunOnUnityThread(() =>
{
Debug.Log("[ADMOB] Rewarded kapandı, yenisi yükleniyor.");
LoadRewarded();
});
};
ad.OnAdFullScreenContentFailed += (AdError err) =>
{
RunOnUnityThread(() =>
{
Debug.LogError("[ADMOB] Rewarded gösterilemedi: " +
(err != null ? err.GetMessage() : "bilinmeyen"));
LoadRewarded();
});
};
ad.OnAdPaid += (AdValue value) =>
{
RunOnUnityThread(() =>
{
Debug.Log("[ADMOB] Rewarded gelir: " + value.Value + " " + value.CurrencyCode);
});
};
}
public void ShowRewarded(Action onReward = null, Action onNotReady = null)
{
if (!isInitialized)
{
Debug.Log("[ADMOB] Rewarded gösterilemedi, AdMob başlamadı.");
onNotReady?.Invoke();
return;
}
if (rewardedAd != null && rewardedAd.CanShowAd())
{
Debug.Log("[ADMOB] Rewarded gösteriliyor.");
rewardedAd.Show((Reward reward) =>
{
RunOnUnityThread(() =>
{
Debug.Log("[ADMOB] Rewarded ödül kazanıldı: " + reward.Amount + " " + reward.Type);
onReward?.Invoke();
});
});
}
else
{
Debug.Log("[ADMOB] Rewarded hazır değil, tekrar yükleniyor.");
LoadRewarded();
onNotReady?.Invoke();
}
}
public bool IsRewardedReady()
{
return rewardedAd != null && rewardedAd.CanShowAd();
}
// =====================================================
// BUTTON ONCLICK İÇİN
// =====================================================
public void ShowInterstitialFromButton()
{
ShowInterstitial();
}
public void ShowInterstitialIgnoreTimeFromButton()
{
ShowInterstitialIgnoreTime();
}
public void ShowRewardedFromButton()
{
ShowRewarded(() =>
{
Debug.Log("[ADMOB] Rewarded butondan izlendi, standart ödül verildi.");
});
}
public void LoadInterstitialFromButton()
{
LoadInterstitial();
}
public void LoadRewardedFromButton()
{
LoadRewarded();
}
public void DebugAdStatusFromButton()
{
Debug.Log("[ADMOB] Interstitial hazır mı: " + IsInterstitialReady());
Debug.Log("[ADMOB] Rewarded hazır mı: " + IsRewardedReady());
}
// =====================================================
// BANNER TAMAMEN KAPALI
// =====================================================
public void ShowBannerFromButton()
{
Debug.Log("[ADMOB] Banner kapalı. Gösterilmeyecek.");
}
public void HideBannerFromButton()
{
Debug.Log("[ADMOB] Banner kapalı. Gizlenecek banner yok.");
}
public void ReloadBannerFromButton()
{
Debug.Log("[ADMOB] Banner kapalı. Yeniden yüklenecek banner yok.");
}
public void ShowBanner()
{
Debug.Log("[ADMOB] Banner kapalı.");
}
public void HideBanner()
{
Debug.Log("[ADMOB] Banner kapalı.");
}
// =====================================================
// TEMİZLEME
// =====================================================
private void OnDestroy()
{
if (Instance != this)
return;
if (interstitialAd != null)
{
interstitialAd.Destroy();
interstitialAd = null;
}
if (rewardedAd != null)
{
rewardedAd.Destroy();
rewardedAd = null;
}
Instance = null;
}
}