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>
This commit is contained in:
commit
ecb1c9edea
1455 changed files with 933295 additions and 0 deletions
461
Assets/Scripts/Reklam/AdMobAllInOne.cs
Normal file
461
Assets/Scripts/Reklam/AdMobAllInOne.cs
Normal file
|
|
@ -0,0 +1,461 @@
|
|||
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;
|
||||
}
|
||||
}
|
||||
2
Assets/Scripts/Reklam/AdMobAllInOne.cs.meta
Normal file
2
Assets/Scripts/Reklam/AdMobAllInOne.cs.meta
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
fileFormatVersion: 2
|
||||
guid: c21992fbb21a95546b14060eb7438230
|
||||
Loading…
Add table
Add a link
Reference in a new issue