diff --git a/Editor/IapSettingsEditor.cs b/Editor/IapSettingsEditor.cs index f152bbb..7d6f09a 100644 --- a/Editor/IapSettingsEditor.cs +++ b/Editor/IapSettingsEditor.cs @@ -64,6 +64,7 @@ void GenerateProductImpl() { Directory.CreateDirectory(pathDefaultScript); } + var productImplPath = $"{pathDefaultScript}/IapProduct.cs"; var str = "namespace VirtueSky.Iap\n{"; str += "\n\tpublic struct IapProduct\n\t{"; @@ -79,7 +80,7 @@ void GenerateProductImpl() $"\n\t\tpublic static IapDataProduct Purchase{CultureInfo.CurrentCulture.TextInfo.ToTitleCase(itemName)}()"; str += "\n\t\t{"; str += - $"\n\t\t\treturn IapManager.Instance.PurchaseProduct(IapSettings.Instance.IapDataProducts[{i}]);"; + $"\n\t\t\treturn IapManager.PurchaseProduct(IapSettings.Instance.IapDataProducts[{i}]);"; str += "\n\t\t}"; str += "\n"; @@ -87,7 +88,7 @@ void GenerateProductImpl() $"\n\t\tpublic static bool IsPurchased{CultureInfo.CurrentCulture.TextInfo.ToTitleCase(itemName)}()"; str += "\n\t\t{"; str += - $"\n\t\t\treturn IapManager.Instance.IsPurchasedProduct(IapSettings.Instance.IapDataProducts[{i}]);"; + $"\n\t\t\treturn IapManager.IsPurchasedProduct(IapSettings.Instance.IapDataProducts[{i}]);"; str += "\n\t\t}"; str += "\n"; @@ -96,7 +97,7 @@ void GenerateProductImpl() $"\n\t\tpublic static string LocalizedPrice{CultureInfo.CurrentCulture.TextInfo.ToTitleCase(itemName)}()"; str += "\n\t\t{"; str += - $"\n\t\t\treturn IapManager.Instance.LocalizedPriceProduct(IapSettings.Instance.IapDataProducts[{i}]);"; + $"\n\t\t\treturn IapManager.LocalizedPriceProduct(IapSettings.Instance.IapDataProducts[{i}]);"; str += "\n\t\t}"; str += "\n"; } @@ -153,7 +154,8 @@ void GuiLine(int i_height = 1) EditorGUI.DrawRect(rect, new Color32(0, 0, 0, 255)); } - string GetPathInCurrentEnvironent(string fullRelativePath) + + string GetPathInCurrentEnvironent(string fullRelativePath) { var upmPath = $"Packages/com.wolf-package.in-app-purchasing/{fullRelativePath}"; var normalPath = $"Assets/in-app-purchasing/{fullRelativePath}"; diff --git a/README.md b/README.md index 33cbe1a..e0a677e 100644 --- a/README.md +++ b/README.md @@ -3,16 +3,16 @@ Made With Unity - License + License - Last Commit + Last Commit - Repo Size + Repo Size - Last Release + Last Release

@@ -23,9 +23,13 @@ ### Add the line below to `Packages/manifest.json` -for version `1.0.0` +for version `1.0.1` ```csharp -"com.wolf-package.in-app-purchasing":"https://github.com/wolf-package/in-app-purchasing.git#1.0.0", +"com.wolf-package.in-app-purchasing":"https://github.com/wolf-package/in-app-purchasing-unity.git#1.0.1", +``` +dependency `extensions-unity-1.0.1` +```csharp +"com.wolf-package.extensions":"https://github.com/wolf-package/extensions-unity.git#1.0.1", ``` ## Use @@ -50,33 +54,33 @@ for version `1.0.0` public const string ID_COIN = "com.test.coin"; public static IapDataProduct PurchaseCoin() { - return IapManager.Instance.PurchaseProduct(IapSettings.Instance.IapDataProducts[0]); + return IapManager.PurchaseProduct(IapSettings.Instance.IapDataProducts[0]); } public static bool IsPurchasedCoin() { - return IapManager.Instance.IsPurchasedProduct(IapSettings.Instance.IapDataProducts[0]); + return IapManager.IsPurchasedProduct(IapSettings.Instance.IapDataProducts[0]); } public static string LocalizedPriceCoin() { - return IapManager.Instance.LocalizedPriceProduct(IapSettings.Instance.IapDataProducts[0]); + return IapManager.LocalizedPriceProduct(IapSettings.Instance.IapDataProducts[0]); } public const string ID_REMOVEADS = "com.test.removeads"; public static IapDataProduct PurchaseRemoveads() { - return IapManager.Instance.PurchaseProduct(IapSettings.Instance.IapDataProducts[1]); + return IapManager.PurchaseProduct(IapSettings.Instance.IapDataProducts[1]); } public static bool IsPurchasedRemoveads() { - return IapManager.Instance.IsPurchasedProduct(IapSettings.Instance.IapDataProducts[1]); + return IapManager.IsPurchasedProduct(IapSettings.Instance.IapDataProducts[1]); } public static string LocalizedPriceRemoveads() { - return IapManager.Instance.LocalizedPriceProduct(IapSettings.Instance.IapDataProducts[1]); + return IapManager.LocalizedPriceProduct(IapSettings.Instance.IapDataProducts[1]); } } @@ -123,7 +127,6 @@ for version `1.0.0` ``` - Example 2: You create a new script similar to the demo below. then attach it to LoadingScene -(From version 1.1.1, `OnPurchaseSuccessEvent` and `OnPurchaseFailedEvent` will be called via `IapManager`) ```csharp diff --git a/Runtime/IapManager.cs b/Runtime/IapManager.cs index 23f160c..e165410 100644 --- a/Runtime/IapManager.cs +++ b/Runtime/IapManager.cs @@ -5,13 +5,14 @@ using UnityEngine; using UnityEngine.Purchasing; using UnityEngine.Purchasing.Extension; +using VirtueSky.Misc; namespace VirtueSky.Iap { public class IapManager : MonoBehaviour, IDetailedStoreListener { - public bool dontDestroyOnLoad = true; - public static IapManager Instance; + [SerializeField] private bool dontDestroyOnLoad = true; + private static IapManager _instance; public static event Action OnPurchaseSucceedEvent; public static event Action OnPurchaseFailedEvent; public static event Action OnIapTrackingRevenueEvent; @@ -29,9 +30,9 @@ private void Awake() DontDestroyOnLoad(this.gameObject); } - if (Instance == null) + if (_instance == null) { - Instance = this; + _instance = this; } else { @@ -41,7 +42,7 @@ private void Awake() private void OnDestroy() { - if (Instance == this) Instance = null; + if (_instance == this) _instance = null; } private void Start() @@ -93,7 +94,7 @@ private void InternalPurchaseFailed(string id) { if (product.Id != id) continue; OnPurchaseFailedEvent?.Invoke(product.Id); - CallActionAndClean(ref product.purchaseFailedCallback); + Common.CallActionAndClean(ref product.purchaseFailedCallback); } } @@ -166,7 +167,7 @@ void InternalPurchaseSuccess(string id) { if (product.Id != id) continue; OnPurchaseSucceedEvent?.Invoke(product.Id); - CallActionAndClean(ref product.purchaseSuccessCallback); + Common.CallActionAndClean(ref product.purchaseSuccessCallback); } } @@ -195,7 +196,7 @@ public void OnPurchaseFailed(Product product, PurchaseFailureDescription failure } #if UNITY_IOS - public void RestorePurchase() + private void InternalRestorePurchase() { if (!IsInitialized) { @@ -203,7 +204,8 @@ public void RestorePurchase() return; } - if (Application.platform == RuntimePlatform.IPhonePlayer || Application.platform == RuntimePlatform.OSXPlayer) + if (Application.platform == RuntimePlatform.IPhonePlayer || + Application.platform == RuntimePlatform.OSXPlayer) { Debug.Log("Restore purchase started ..."); @@ -211,7 +213,8 @@ public void RestorePurchase() storeProvider.RestoreTransactions(_ => { // no purchase are avaiable to restore - Debug.Log("Restore purchase continuting: " + _ + ". If no further messages, no purchase available to restore."); + Debug.Log("Restore purchase continuting: " + _ + + ". If no further messages, no purchase available to restore."); }); } else @@ -248,17 +251,9 @@ private static void AutoInitialize() } } - private void CallActionAndClean(ref Action action) - { - if (action == null) return; - var a = action; - a(); - action = null; - } + #region Internal API - #region API - - public IapDataProduct PurchaseProduct(string id) + private IapDataProduct InternalPurchaseProduct(string id) { OnShowIapNativePopupEvent?.Invoke(true); var product = iapSettings.GetIapProduct(id); @@ -266,40 +261,60 @@ public IapDataProduct PurchaseProduct(string id) return product; } - public IapDataProduct PurchaseProduct(IapDataProduct product) + private IapDataProduct InternalPurchaseProduct(IapDataProduct product) { OnShowIapNativePopupEvent?.Invoke(true); PurchaseProductInternal(product); return product; } - public bool IsPurchasedProduct(IapDataProduct product) + private bool InternalIsPurchasedProduct(IapDataProduct product) { if (_controller == null) return false; return ConvertProductType(product.iapProductType) == ProductType.NonConsumable && _controller.products.WithID(product.Id).hasReceipt; } - public bool IsPurchasedProduct(string id) + private bool InternalIsPurchasedProduct(string id) { if (_controller == null) return false; return ConvertProductType(iapSettings.GetIapProduct(id).iapProductType) == ProductType.NonConsumable && _controller.products.WithID(id).hasReceipt; } - public string LocalizedPriceProduct(IapDataProduct product) + private string InternalLocalizedPriceProduct(IapDataProduct product) { if (_controller == null) return ""; return _controller.products.WithID(product.Id).metadata.localizedPriceString; } - public string LocalizedPriceProduct(string id) + private string InternalLocalizedPriceProduct(string id) { if (_controller == null) return ""; return _controller.products.WithID(id).metadata.localizedPriceString; } #endregion + + #region Public API + + public static IapDataProduct PurchaseProduct(string id) => _instance.InternalPurchaseProduct(id); + + public static IapDataProduct PurchaseProduct(IapDataProduct product) => + _instance.InternalPurchaseProduct(product); + + public static bool IsPurchasedProduct(IapDataProduct product) => _instance.InternalIsPurchasedProduct(product); + public static bool IsPurchasedProduct(string id) => _instance.InternalIsPurchasedProduct(id); + + public static string LocalizedPriceProduct(IapDataProduct product) => + _instance.InternalLocalizedPriceProduct(product); + + public static string LocalizedPriceProduct(string id) => _instance.InternalLocalizedPriceProduct(id); +#if UNITY_IOS + public static void RestorePurchase() => _instance.InternalRestorePurchase(); +#endif + + #endregion } } diff --git a/Runtime/UnityCommon.IAP.asmdef b/Runtime/UnityCommon.IAP.asmdef index 80f3c39..ee107c4 100644 --- a/Runtime/UnityCommon.IAP.asmdef +++ b/Runtime/UnityCommon.IAP.asmdef @@ -7,7 +7,8 @@ "GUID:e63a64384cc3ef04cac761c1ce76e9c2", "GUID:08d1c582746949b40ba6a45cdb776bdf", "GUID:fe25561d224ed4743af4c60938a59d0b", - "GUID:70ea675efa2644cef98c7ece24158333" + "GUID:70ea675efa2644cef98c7ece24158333", + "GUID:5a4d3c3ff86da0f459ebef74b42549cd" ], "includePlatforms": [], "excludePlatforms": [], diff --git a/package.json b/package.json index c491dac..55c19a3 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "com.wolf-package.in-app-purchasing", "displayName": "UnityCommon-IAP", "description": "Support for unity in-app-purchasing", - "version": "1.0.0", + "version": "1.0.1", "unity": "2021.3", "category": "virtuesky", "license": "MIT", @@ -18,6 +18,7 @@ "UnityIAP" ], "dependencies": { - "com.unity.purchasing": "4.12.0" + "com.unity.purchasing": "4.12.0", + "com.wolf-package.extensions": "https://github.com/wolf-package/extensions-unity.git#1.0.1" } } \ No newline at end of file