diff --git a/Assembly-CSharp.csproj b/Assembly-CSharp.csproj index 18ea03f..899389e 100644 --- a/Assembly-CSharp.csproj +++ b/Assembly-CSharp.csproj @@ -1,7 +1,7 @@  - latest + 7.3 Debug @@ -47,11 +47,14 @@ {E097FAD1-6243-4DAD-9C02-E9B9EFC3FFC1};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} Package - 2.0.11 + 2.0.15 Game:1 Android:13 2019.4.28f1 + + + diff --git a/Assets/Prototype/Core/Core.dll b/Assets/Prototype/Core/Core.dll index ebedf0d..84df857 100644 Binary files a/Assets/Prototype/Core/Core.dll and b/Assets/Prototype/Core/Core.dll differ diff --git a/Assets/Prototype/Core/CoreEditor.dll b/Assets/Prototype/Core/CoreEditor.dll index 4ffc8dc..1385c22 100644 Binary files a/Assets/Prototype/Core/CoreEditor.dll and b/Assets/Prototype/Core/CoreEditor.dll differ diff --git a/Assets/Prototype/Custumization/Resources/CoreSettings.asset b/Assets/Prototype/Custumization/Resources/CoreSettings.asset index 91daac5..8115324 100644 --- a/Assets/Prototype/Custumization/Resources/CoreSettings.asset +++ b/Assets/Prototype/Custumization/Resources/CoreSettings.asset @@ -30,7 +30,9 @@ MonoBehaviour: - scene: Test positions: 4 consumableProducts: [] - nonConsumableProducts: [] + nonConsumableProducts: + - noads + nonConsumableProductsDisableAds: 010000000000 localizationTable: {fileID: 4900000, guid: 8906a0d6652cf524d95c802bef1d0b88, type: 3} availableLanguages: 1e000000260000000a000000 musicVolume: 0.5 diff --git a/Assets/Prototype/Custumization/Scenes/Test.unity b/Assets/Prototype/Custumization/Scenes/Test.unity index baf155a..e17221e 100644 --- a/Assets/Prototype/Custumization/Scenes/Test.unity +++ b/Assets/Prototype/Custumization/Scenes/Test.unity @@ -280,6 +280,7 @@ RectTransform: - {fileID: 1370401863} - {fileID: 1127382359} - {fileID: 1630259401} + - {fileID: 1095112902} m_Father: {fileID: 0} m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} @@ -288,6 +289,145 @@ RectTransform: m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 0, y: 0} m_Pivot: {x: 0, y: 0} +--- !u!1 &1095112901 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1095112902} + - component: {fileID: 1095112906} + - component: {fileID: 1095112905} + - component: {fileID: 1095112904} + - component: {fileID: 1095112903} + m_Layer: 5 + m_Name: PurchaseButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1095112902 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1095112901} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1397823467} + m_Father: {fileID: 892138056} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: -150} + m_SizeDelta: {x: 450, y: 75} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1095112903 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1095112901} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -53964576, guid: 2fd26ea99448fca48804f673704d54b7, type: 3} + m_Name: + m_EditorClassIdentifier: + _productId: noads + _onSucces: + m_PersistentCalls: + m_Calls: [] + _onFailed: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &1095112904 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1095112901} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1095112905} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &1095112905 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1095112901} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1095112906 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1095112901} + m_CullTransparentMesh: 0 --- !u!1 &1127382358 GameObject: m_ObjectHideFlags: 0 @@ -514,6 +654,84 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1370401862} m_CullTransparentMesh: 0 +--- !u!1 &1397823466 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1397823467} + - component: {fileID: 1397823469} + - component: {fileID: 1397823468} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1397823467 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1397823466} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1095112902} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1397823468 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1397823466} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 14 + m_FontStyle: 0 + m_BestFit: 1 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Purchase NoADS +--- !u!222 &1397823469 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1397823466} + m_CullTransparentMesh: 0 --- !u!1 &1465904771 GameObject: m_ObjectHideFlags: 0 diff --git a/Assets_DLL/Core/Ads/AdsManager.cs b/Assets_DLL/Core/Ads/AdsManager.cs index 6f629c6..acbc20e 100644 --- a/Assets_DLL/Core/Ads/AdsManager.cs +++ b/Assets_DLL/Core/Ads/AdsManager.cs @@ -3,6 +3,7 @@ using UnityEngine; using Core.Settings; using Core.Ads.BridgeInterfaces; using Core.Ads.Bridges.DemoAds; +using Core.IAP; namespace Core.Ads { @@ -14,7 +15,7 @@ namespace Core.Ads private static IRewardedBridge _rewarded = null; private static IBannerBridge _banner = null; - public static void Init() + internal static void Init() { GameObject holder = new GameObject("[AdsManager]"); @@ -57,6 +58,15 @@ namespace Core.Ads if (_banner == null) throw new NullReferenceException("ads bridge object does not implement IBannerBridge"); + + PurchaseManager.OnPurchaseSuccess += (productId) => + { + if (!CoreSettings.data.nonConsumableProducts.Contains(productId)) + return; + + if (CoreSettings.data.nonConsumableProductsDisableAds[CoreSettings.data.nonConsumableProducts.IndexOf(productId)]) + HideBanner(); + }; } if (CoreSettings.data.needRewarded) @@ -69,10 +79,26 @@ namespace Core.Ads if (_rewarded == null) throw new NullReferenceException("ads bridge object does not implement IRewardedBridge"); } + + + } + + public static bool IsAdsDisabled() + { + for (int i = 0; i < CoreSettings.data.nonConsumableProducts.Count; i++) + { + if (CoreSettings.data.nonConsumableProductsDisableAds[i] && PurchaseManager.IsProductPurchased(CoreSettings.data.nonConsumableProducts[i])) + return true; + } + + return false; } public static bool IsInterstitialReady() { + if (IsAdsDisabled()) + return false; + if (_interstitial == null) throw new NullReferenceException("ads bridge object does not implement IInterstitialBridge"); @@ -95,6 +121,9 @@ namespace Core.Ads public static void ShowInterstitial() { + if (IsAdsDisabled()) + return; + if (_interstitial == null) throw new NullReferenceException("ads bridge object does not implement IInterstitialBridge"); @@ -106,6 +135,9 @@ namespace Core.Ads public static bool IsRewardedReady() { + if (IsAdsDisabled()) + return false; + if (_rewarded == null) throw new NullReferenceException("ads bridge object does not implement IRewardedBridge"); @@ -117,6 +149,9 @@ namespace Core.Ads public static void ShowRewarded(Action onSucces, Action onFailed) { + if (IsAdsDisabled()) + return; + if (_rewarded == null) throw new NullReferenceException("ads bridge object does not implement IRewardedBridge"); @@ -141,6 +176,9 @@ namespace Core.Ads public static void ShowBanner(BannerPositions position) { + if (IsAdsDisabled()) + return; + if (_banner == null) throw new NullReferenceException("ads bridge object does not implement IBannerBridge"); diff --git a/Assets_DLL/Core/Ads/Bridges/DemoAds/DemoInterstitialAds.cs b/Assets_DLL/Core/Ads/Bridges/DemoAds/DemoInterstitialAds.cs index 221008a..a3d4a55 100644 --- a/Assets_DLL/Core/Ads/Bridges/DemoAds/DemoInterstitialAds.cs +++ b/Assets_DLL/Core/Ads/Bridges/DemoAds/DemoInterstitialAds.cs @@ -19,7 +19,10 @@ namespace Core.Ads.Bridges.DemoAds if (_isVisible) { if (GUI.Button(new Rect(0f, 0f, Screen.width, Screen.height), "Interstitial Demo Ads")) - CloseInterstitial(); + { + _isVisible = false; + OnEnded?.Invoke(); + } } } @@ -43,12 +46,6 @@ namespace Core.Ads.Bridges.DemoAds Debug.LogError("AdsManager: Interstitial ads is not ready"); } - private void CloseInterstitial() - { - _isVisible = false; - OnEnded?.Invoke(); - } - private IEnumerator InterstitialTimer() { _isInterstitialReady = false; diff --git a/Assets_DLL/Core/Ads/Bridges/DemoAds/DemoRewardedAds.cs b/Assets_DLL/Core/Ads/Bridges/DemoAds/DemoRewardedAds.cs index 2fb082d..98baf3d 100644 --- a/Assets_DLL/Core/Ads/Bridges/DemoAds/DemoRewardedAds.cs +++ b/Assets_DLL/Core/Ads/Bridges/DemoAds/DemoRewardedAds.cs @@ -16,10 +16,16 @@ namespace Core.Ads.Bridges.DemoAds if (_isVisible) { if (GUI.Button(new Rect(0f, 0f, Screen.width, Screen.height / 2f), "Rewarded success")) - OnSuccesClick(); + { + onSucces?.Invoke(); + _isVisible = false; + } if (GUI.Button(new Rect(0f, Screen.height / 2f, Screen.width, Screen.height / 2f), "Rewarded close")) - OnFailedClick(); + { + onFailed?.Invoke(); + _isVisible = false; + } } } @@ -32,17 +38,5 @@ namespace Core.Ads.Bridges.DemoAds _isVisible = true; } - - private void OnSuccesClick() - { - onSucces?.Invoke(); - _isVisible = false; - } - - private void OnFailedClick() - { - onFailed?.Invoke(); - _isVisible = false; - } } } \ No newline at end of file diff --git a/Assets_DLL/Core/Ads/RewardedButton.cs b/Assets_DLL/Core/Ads/RewardedButton.cs index ebe2d22..70d5b94 100644 --- a/Assets_DLL/Core/Ads/RewardedButton.cs +++ b/Assets_DLL/Core/Ads/RewardedButton.cs @@ -1,4 +1,6 @@ using Core.Ads; +using Core.IAP; +using Core.Settings; using UnityEngine; using UnityEngine.Events; using UnityEngine.UI; @@ -31,5 +33,27 @@ namespace Core.Ads ); }); } + + private void OnEnable() + { + PurchaseManager.OnPurchaseSuccess += CheckAdsEnablingAfterPurchasing; + + if (AdsManager.IsAdsDisabled()) + gameObject.SetActive(false); + } + + private void OnDisable() + { + PurchaseManager.OnPurchaseSuccess -= CheckAdsEnablingAfterPurchasing; + } + + private void CheckAdsEnablingAfterPurchasing(string productId) + { + if (!CoreSettings.data.nonConsumableProducts.Contains(productId)) + return; + + if (CoreSettings.data.nonConsumableProductsDisableAds[CoreSettings.data.nonConsumableProducts.IndexOf(productId)]) + gameObject.SetActive(false); + } } } diff --git a/Assets_DLL/Core/Audio/AudioController.cs b/Assets_DLL/Core/Audio/AudioController.cs index 4c2c780..aa7b507 100644 --- a/Assets_DLL/Core/Audio/AudioController.cs +++ b/Assets_DLL/Core/Audio/AudioController.cs @@ -6,7 +6,7 @@ using Core.Settings; public static class AudioController { - public static void Init() + internal static void Init() { GameObject audioParent = new GameObject("[AudioController]"); diff --git a/Assets_DLL/Core/CoreInitializer.cs b/Assets_DLL/Core/CoreInitializer.cs index a69585b..52d32a7 100644 --- a/Assets_DLL/Core/CoreInitializer.cs +++ b/Assets_DLL/Core/CoreInitializer.cs @@ -2,14 +2,16 @@ using Core.SceneManagement; using Core.Ads; using Core.Localization; +using Core.IAP; namespace Core { - public sealed class CoreInitializer + internal sealed class CoreInitializer { [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.AfterSceneLoad)] private static void Init() { + PurchaseManager.Init(); AdsManager.Init(); LocalizationManager.Init(); AudioController.Init(); diff --git a/Assets_DLL/Core/IAP/PurchaseButton.cs b/Assets_DLL/Core/IAP/PurchaseButton.cs new file mode 100644 index 0000000..db37eeb --- /dev/null +++ b/Assets_DLL/Core/IAP/PurchaseButton.cs @@ -0,0 +1,46 @@ +using Core.Ads; +using Core.IAP; +using Core.Settings; +using UnityEngine; +using UnityEngine.Events; +using UnityEngine.UI; + +namespace Core.Ads +{ + [RequireComponent(typeof(Button))] + public sealed class PurchaseButton : MonoBehaviour + { + [SerializeField] private string _productId = ""; + [SerializeField] private UnityEvent _onSucces = null; + [SerializeField] private UnityEvent _onFailed = null; + + private void Awake() + { + Button button = GetComponent