diff --git a/Assets/3rd/Plugins/Easy Save 3/Resources/ES3/ES3Defaults.asset b/Assets/3rd/Plugins/Easy Save 3/Resources/ES3/ES3Defaults.asset index 30cedfb1..0622d9bb 100644 --- a/Assets/3rd/Plugins/Easy Save 3/Resources/ES3/ES3Defaults.asset +++ b/Assets/3rd/Plugins/Easy Save 3/Resources/ES3/ES3Defaults.asset @@ -9,7 +9,7 @@ MonoBehaviour: m_GameObject: {fileID: 0} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 0} + m_Script: {fileID: 11500000, guid: 7b340139c9e4d054f904d8b452798652, type: 3} m_Name: ES3Defaults m_EditorClassIdentifier: settings: diff --git a/Assets/ExternalDependencyManager/Editor/1.2.181/Google.IOSResolver.dll.meta b/Assets/ExternalDependencyManager/Editor/1.2.181/Google.IOSResolver.dll.meta index 1eb09c51..7fc20989 100644 --- a/Assets/ExternalDependencyManager/Editor/1.2.181/Google.IOSResolver.dll.meta +++ b/Assets/ExternalDependencyManager/Editor/1.2.181/Google.IOSResolver.dll.meta @@ -14,8 +14,26 @@ PluginImporter: isPreloaded: 0 isOverridable: 0 isExplicitlyReferenced: 0 - validateReferences: 1 + validateReferences: 0 platformData: + - first: + : Any + second: + enabled: 0 + settings: + Exclude Android: 1 + Exclude Editor: 0 + Exclude Linux64: 1 + Exclude OSXUniversal: 1 + Exclude Win: 1 + Exclude Win64: 1 + - first: + Android: Android + second: + enabled: 0 + settings: + AndroidSharedLibraryType: Executable + CPU: ARMv7 - first: Any: second: @@ -26,7 +44,33 @@ PluginImporter: second: enabled: 1 settings: + CPU: AnyCPU DefaultValueInitialized: true + OS: AnyOS + - first: + Standalone: Linux64 + second: + enabled: 0 + settings: + CPU: x86_64 + - first: + Standalone: OSXUniversal + second: + enabled: 0 + settings: + CPU: None + - first: + Standalone: Win + second: + enabled: 0 + settings: + CPU: x86 + - first: + Standalone: Win64 + second: + enabled: 0 + settings: + CPU: x86_64 - first: Windows Store Apps: WindowsStoreApps second: diff --git a/Assets/Scripts/Dev/Ads Scripts.meta b/Assets/Scripts/Dev/Ads Scripts.meta new file mode 100644 index 00000000..4dee6036 --- /dev/null +++ b/Assets/Scripts/Dev/Ads Scripts.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 3faf72e5fd4b5594885be40431ca3fe0 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Dev/Ads Scripts/AdmobUIHandler.cs b/Assets/Scripts/Dev/Ads Scripts/AdmobUIHandler.cs new file mode 100644 index 00000000..eb50fdf9 --- /dev/null +++ b/Assets/Scripts/Dev/Ads Scripts/AdmobUIHandler.cs @@ -0,0 +1,71 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEngine.UI; + +public class AdmobUIHandler : MonoBehaviour +{ + public Text admobInitText, admobInitTextBool; + public Text iAdLoadingTextBool, rAdLoadingTextBool; + public Text iAdLoadedTextBool, rAdLoadedTextBool; + + private void Start() + { + AdsManager.Instance.OnAdmobInitializedEvent += OnAdmobInitComplete; + AdsManager.Instance.OniAdLoading += OniAdStartedLoading; + AdsManager.Instance.OnrAdLoading += OnrAdStartedLoading; + AdsManager.Instance.OniAdLoaded += OniAdLoaded; + AdsManager.Instance.OnrAdLoaded += OnrAdLoaded; + } + + private void OnAdmobInitComplete() + { + admobInitText.text = "Admob Initialized"; + admobInitTextBool.text = "true"; + } + + private void OniAdStartedLoading(bool val) + { + iAdLoadingTextBool.text = val.ToString(); + } + + private void OniAdLoaded(bool val) + { + iAdLoadedTextBool.text = val.ToString(); + } + + private void OnrAdStartedLoading(bool val) + { + rAdLoadingTextBool.text = val.ToString(); + } + + private void OnrAdLoaded(bool val) + { + rAdLoadedTextBool.text = val.ToString(); + } + + public void InitAdmob() + { + AdsManager.Instance.InitializeAdmob(); + } + + public void RequestrAd() + { + AdsManager.Instance.LoadRewardedAdWithDelay(); + } + + public void RequestiAd() + { + AdsManager.Instance.LoadInterstitialAdWithDelay(); + } + + public void ShowiAd() + { + AdsManager.Instance.ShowInterstitialAd("placement_name"); + } + + public void ShowrAd() + { + AdsManager.Instance.ShowRewardedAd(RewardedTypes.Color); + } +} diff --git a/Assets/Scripts/Dev/Ads Scripts/AdmobUIHandler.cs.meta b/Assets/Scripts/Dev/Ads Scripts/AdmobUIHandler.cs.meta new file mode 100644 index 00000000..f860ba84 --- /dev/null +++ b/Assets/Scripts/Dev/Ads Scripts/AdmobUIHandler.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: dce9aed54179cfb4792ca72bdd213712 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 100 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Dev/Ads Scripts/AdsManager.cs b/Assets/Scripts/Dev/Ads Scripts/AdsManager.cs new file mode 100644 index 00000000..3407665f --- /dev/null +++ b/Assets/Scripts/Dev/Ads Scripts/AdsManager.cs @@ -0,0 +1,381 @@ +using GoogleMobileAds.Api; +using GoogleMobileAds.Common; +using System; +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public class AdsManager : MonoBehaviour +{ + //test ad units +#if UNITY_ANDROID + public string iAdUnit = "ca-app-pub-3940256099942544/1033173712"; +#elif UNITY_IPHONE + public string iAdUnit = "ca-app-pub-3940256099942544/4411468910"; +#endif + + // test ad units +#if UNITY_ANDROID + public string rAdUnit = "ca-app-pub-3940256099942544/5224354917"; +#elif UNITY_IPHONE + public string rAdUnit = "ca-app-pub-3940256099942544/1712485313"; +#endif + + private InterstitialAd _interstitialAd; + private int interstitialRetryAttempt = 1; + private bool loadingiAd = false; + private string iAdPlacement; + + private RewardedAd _rewardedAd; + private int rewardedRetryAttempt = 1; + private bool loadingrAd = false; + private RewardedTypes rewardType; + private bool isRewardAvailable = false; + + public static AdsManager Instance; + public Action OnUserEarnedReward; + public Action OnAdmobInitializedEvent; + public Action OniAdLoading; + public Action OnrAdLoading; + public Action OniAdLoaded; + public Action OnrAdLoaded; + + private void Awake() + { + if (Instance is null) + Instance = this; + else + DestroyImmediate(this); + DontDestroyOnLoad(gameObject); + } + + private void Start() + { + InitializeAdmob(); + } + + private void FixedUpdate() + { + if (isRewardAvailable) + { + isRewardAvailable = false; + OnUserEarnedReward?.Invoke(rewardType); + } + } + + public void InitializeAdmob() + { + if (!CanShowAds()) return; + + MobileAds.RaiseAdEventsOnUnityMainThread = true; + // Initialize the Google Mobile Ads SDK. + MobileAds.Initialize(OnAdmobInitialized); + } + + public void OnAdmobInitialized(InitializationStatus initStatus) + { + MobileAdsEventExecutor.ExecuteInUpdate(() => + { + Debug.Log("Admob Initialized"); + OnAdmobInitializedEvent?.Invoke(); + Invoke(nameof(LoadInterstitialAdWithDelay), 3f); + Invoke(nameof(LoadRewardedAdWithDelay), 6f); + }); + + } + + public bool CanShowAds() + { + return true; + } + + private void OnAdPaid(AdValue adValue) + { + Debug.Log(String.Format("ad paid {0} {1}.", + adValue.Value, + adValue.CurrencyCode)); + } + + private void PauseGame() + { + Time.timeScale = 0f; + AudioListener.pause = true; + } + + private void ResumeGame() + { + Time.timeScale = 1f; + AudioListener.pause = false; + } + + #region Interstitial_Ads + public void LoadInterstitialAdWithDelay() + { + if (!CanShowAds()) return; + + var currentAttempt = Mathf.Min(interstitialRetryAttempt, 5); + var delayTime = Mathf.Pow(2, currentAttempt); + if(!loadingiAd) + { + OniAdLoading?.Invoke(loadingiAd); + loadingiAd = true; + Invoke(nameof(LoadInterstitialAd), delayTime); + } + } + + private void LoadInterstitialAd() + { + // Clean up the old ad before loading a new one. + if (_interstitialAd != null) + { + _interstitialAd.Destroy(); + _interstitialAd = null; + } + + // create our request used to load the ad. + var adRequest = new AdRequest(); + // send the request to load the ad. + InterstitialAd.Load(iAdUnit, adRequest, OnInterstitialAdLoaded); + } + + private void OnInterstitialAdLoaded(InterstitialAd ad, LoadAdError error) + { + MobileAdsEventExecutor.ExecuteInUpdate(() => + { + loadingiAd = false; + OniAdLoading?.Invoke(loadingiAd); + // if error is not null, the load request failed. + if (error != null || ad == null) + { + OniAdLoaded?.Invoke(false); + interstitialRetryAttempt++; + //load ad again + LoadInterstitialAdWithDelay(); + Debug.LogError("interstitial ad failed to load an ad " + + "with error : " + error); + return; + } + + interstitialRetryAttempt = 1; + Debug.Log("Interstitial ad loaded with response : " + + ad.GetResponseInfo()); + OniAdLoaded?.Invoke(true); + _interstitialAd = ad; + RegisterEventHandlers(_interstitialAd); + }); + } + + public void ShowInterstitialAd(string adPlacement) + { + if (!CanShowAds()) return; + + iAdPlacement = adPlacement; + if (_interstitialAd != null && _interstitialAd.CanShowAd()) + { + Debug.Log("Showing interstitial ad."); + _interstitialAd.Show(); + } + else + { + Debug.LogError("Interstitial ad is not ready yet."); + LoadInterstitialAdWithDelay(); + } + } + + private void RegisterEventHandlers(InterstitialAd interstitialAd) + { + // Raised when the ad is estimated to have earned money. + //interstitialAd.OnAdPaid += OnAdPaid; + // Raised when an impression is recorded for an ad. + //interstitialAd.OnAdImpressionRecorded += () => + //{ + // Debug.Log("Interstitial ad recorded an impression."); + //}; + // Raised when a click is recorded for an ad. + //interstitialAd.OnAdClicked += () => + //{ + // Debug.Log("Interstitial ad was clicked."); + //}; + //Raised when an ad opened full screen content. + interstitialAd.OnAdFullScreenContentOpened += OnInterstitialAdOpen; + // Raised when the ad closed full screen content. + interstitialAd.OnAdFullScreenContentClosed += () => + { + MobileAdsEventExecutor.ExecuteInUpdate(() => + { + Debug.Log("Interstitial ad full screen content closed."); + ResumeGame(); + LoadInterstitialAdWithDelay(); + }); + }; + // Raised when the ad failed to open full screen content. + interstitialAd.OnAdFullScreenContentFailed += (AdError error) => + { + MobileAdsEventExecutor.ExecuteInUpdate(() => + { + Debug.LogError("Interstitial ad failed to open full screen content " + + "with error : " + error); + LoadInterstitialAdWithDelay(); + }); + }; + } + + private void OnInterstitialAdOpen() + { + MobileAdsEventExecutor.ExecuteInUpdate(() => + { + PauseGame(); + }); + } + #endregion + + #region Rewarded_Ads + + public void LoadRewardedAdWithDelay() + { + if (!CanShowAds()) return; + + var currentAttempt = Mathf.Min(rewardedRetryAttempt, 5); + var delayTime = Mathf.Pow(2, currentAttempt); + if (!loadingrAd) + { + OnrAdLoading?.Invoke(loadingrAd); + loadingrAd = true; + Invoke(nameof(LoadRewardedAd), delayTime); + } + } + + public void LoadRewardedAd() + { + // Clean up the old ad before loading a new one. + if (_rewardedAd != null) + { + _rewardedAd.Destroy(); + _rewardedAd = null; + } + + Debug.Log("Loading the rewarded ad."); + + // create our request used to load the ad. + var adRequest = new AdRequest(); + + // send the request to load the ad. + RewardedAd.Load(rAdUnit, adRequest, OnRewardedAdLoaded); + } + + private void OnRewardedAdLoaded(RewardedAd ad, LoadAdError error) + { + MobileAdsEventExecutor.ExecuteInUpdate(() => + { + loadingrAd = false; + OnrAdLoading?.Invoke(loadingrAd); + // if error is not null, the load request failed. + if (error != null || ad == null) + { + OnrAdLoaded?.Invoke(false); + rewardedRetryAttempt++; + //load ad again + LoadRewardedAdWithDelay(); + Debug.LogError("rewarded ad failed to load an ad " + + "with error : " + error); + return; + } + + rewardedRetryAttempt = 1; + Debug.Log("rewarded ad loaded with response : " + + ad.GetResponseInfo()); + + OnrAdLoaded?.Invoke(true); + _rewardedAd = ad; + RegisterEventHandlers(_rewardedAd); + }); + } + + private void RegisterEventHandlers(RewardedAd ad) + { + // Raised when the ad is estimated to have earned money. + //ad.OnAdPaid += OnAdPaid; + // Raised when an impression is recorded for an ad. + //ad.OnAdImpressionRecorded += () => + //{ + // Debug.Log("Rewarded ad recorded an impression."); + //}; + // Raised when a click is recorded for an ad. + //ad.OnAdClicked += () => + //{ + // Debug.Log("Rewarded ad was clicked."); + //}; + // Raised when an ad opened full screen content. + ad.OnAdFullScreenContentOpened += OnRewardedAdOpen; + // Raised when the ad closed full screen content. + ad.OnAdFullScreenContentClosed += () => + { + MobileAdsEventExecutor.ExecuteInUpdate(() => + { + Debug.Log("Rewarded ad full screen content closed."); + ResumeGame(); + LoadRewardedAdWithDelay(); + }); + }; + // Raised when the ad failed to open full screen content. + ad.OnAdFullScreenContentFailed += (AdError error) => + { + MobileAdsEventExecutor.ExecuteInUpdate(() => + { + Debug.LogError("Rewarded ad failed to open full screen content " + + "with error : " + error); + LoadRewardedAdWithDelay(); + }); + }; + } + + private void OnRewardedAdOpen() + { + MobileAdsEventExecutor.ExecuteInUpdate(() => + { + PauseGame(); + }); + } + + public void ShowRewardedAd(RewardedTypes rewardFor) + { + rewardType = rewardFor; + + if (!CanShowAds()) + { + isRewardAvailable = true; + return; + } + + if (_rewardedAd != null && _rewardedAd.CanShowAd()) + { + _rewardedAd.Show((Reward reward) => + { + // TODO: Reward the user. + isRewardAvailable = true; + }); + } + else + { + Debug.LogError("No Video!"); + LoadRewardedAdWithDelay(); + } + } + #endregion + + +} + +public enum RewardedTypes +{ + None, + Revive, + ClaimDouble, + LevelUnlock, + FootSteps, + NewCharacter, + Color, + Animation, + InventoryPurchase, + Hint +} diff --git a/Assets/Scripts/Dev/Ads Scripts/AdsManager.cs.meta b/Assets/Scripts/Dev/Ads Scripts/AdsManager.cs.meta new file mode 100644 index 00000000..2a7d03d2 --- /dev/null +++ b/Assets/Scripts/Dev/Ads Scripts/AdsManager.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a853c83bcccfa14468a366e0290483a3 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 50 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: