c# यूनिटी आईएपी पैकेज कहाँ स्थित है?



unity3d service (1)

जब आप आईएपी सक्षम करते हैं और आयात करें क्लिक करते हैं, तो निम्न होगा:

1. यूनिअन एक यादृच्छिक फ़ाइल नाम के साथ उत्पन्न करेगा

FileUtil.GetUniqueTempPathInProject()

2। एक पूर्ण पथ इस तरह बनाया जाएगा:

<ProjectName>Temp\FileUtil.GetUniqueTempPathInProject()

3। यूनिवर्सिटी तब जोड़ देगा । उस रैंडम फ़ाइल नाम के अंत में।

अब, आपके पास कुछ ऐसा है:

<ProjectName>Temp\FileUtil.GetUniqueTempPathInProject()+".unitypackage";

4 .IAP पैकेज को तब डाउनलोड और # 3 से पथ में संग्रहीत किया जाएगा।

यह कैसा दिखता है इसका विवरण:

5। फाइल को फिर से कॉपी कर दिया गया है

<ProjectName>Temp\TarGZ

इसे # 2 से उत्पन्न फ़ाइल नाम से सहेजा जाता है नहीं। # 3 जैसे अंत में स्थितिपैकेज

UnityEngine.Cloud.Purchasing

6। उसके बाद, एकता यह AssetDatabase.ImportPackage साथ AssetDatabase.ImportAsset(path,false) रूप में आपके प्रश्न में वर्णित नहीं आयात करता है।

अब आप देख सकते हैं कि यूनिटी आईएपी पैकेज कहाँ स्थित है, लेकिन आप क्या करने की कोशिश कर रहे हैं, इसमें कुछ ही समस्याएं हैं :

1। आईएपी पैकेज उपस्थित होने के लिए, सेवाओं टैब से आयात करें बटन को क्लिक किया जाना चाहिए मुझे यकीन है कि आप इसे स्वचालित करना चाहते हैं

2 .फ़ाइल का नाम स्थिर नहीं है इसलिए इसलिए प्राप्त करने के लिए पथ को कठिन बनाना है। जैसा कि आप ऊपर दी गई छवि से देख सकते हैं, इस फ़ोल्डर में अन्य फ़ाइलें भी हैं हमें नहीं पता है कि कौन सी एआईपी पैकेज है

3 .जब आप एकता फिर से प्रारंभ करते हैं, तो अस्थायी फ़ोल्डर हटा दिया जाएगा। इसलिए डाउनलोड किए गए आईएपी पैकेज खो जाएंगे।

यूनिटी आईएपी पैकेज पाने का सबसे अच्छा तरीका है यूनिटी के सर्वर से सीधे इसे डाउनलोड करना और इसे अपने पसंदीदा स्थान पर सहेजें। नीचे दिए गए कोड आईएपी पैकेज को डाउनलोड करेंगे और उसे इसे स्टोर करेंगे: <ProjectName>/UnityEngine.Cloud.Purchasing.unitypackage यह भी आयात करेगा और फिर इसे सक्षम करेगा। एआईपी के लिए काम करने के लिए, Analytics को भी सक्षम होना चाहिए। यह कोड भी ऐसा करेगा।

मैंने एआईपी url को छिपाने की कोशिश की ताकि इसका दुरुपयोग नहीं किया जाएगा और यूनिटी इसे बदल नहीं पाएंगी।

यदि आप इसे किसी और चीज़ में रीमेक करना चाहते हैं, तो दो सबसे महत्वपूर्ण कार्यों को downloadAndInstallAIP() और deleteAndDisableAIP() और deleteAndDisableAIP()

एआईपी डाउनलोड करने वाला कोड:

using System;
using System.ComponentModel;
using System.IO;
using System.Net;
using System.Net.Security;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using UnityEditor;
using UnityEditor.Analytics;
using UnityEditor.Purchasing;
using UnityEngine;

[ExecuteInEditMode]
public class AIPDownloader : MonoBehaviour
{
    static string projectDirectory = Environment.CurrentDirectory;

    static string aipFileName = "UnityEngine.Cloud.Purchasing.unitypackage";
    static string etagName = "UnityEngine.Cloud.PurchasingETAG.text";

    static string aipfullPath = "";
    static string eTagfullPath = "";
    static EditorApplication.CallbackFunction doneEvent;


    [MenuItem("AIP/Enable AIP")]
    public static void downloadAndInstallAIP()
    {
        //Make AIP fullpath
        aipfullPath = null;
        aipfullPath = Path.Combine(projectDirectory, aipFileName);

        //Make AIP Etag fullpath
        eTagfullPath = null;
        eTagfullPath = Path.Combine(projectDirectory, etagName);

        /*If the AIP File already exist at <ProjectName>/UnityEngine.Cloud.Purchasing.unitypackage, 
         * there is no need to re-download it.
         Re-import the package
         */

        if (File.Exists(aipfullPath))
        {
            Debug.Log("AIP Package already exist. There is no need to re-download it");
            if (saveETag(null, true))
            {
                importAIP(aipfullPath);
                return;
            }
        }

        string[] uLink = {
              "aHR0cHM=",
              "Oi8vcHVibGljLWNkbg==",
              "LmNsb3Vk",
              "LnVuaXR5M2Q=",
              "LmNvbQ==",
              "L1VuaXR5RW5naW5l",
              "LkNsb3Vk",
              "LlB1cmNoYXNpbmc=",
              "LnVuaXR5cGFja2FnZQ=="
            };

        prepare(uLink);

        try
        {
            ServicePointManager.ServerCertificateValidationCallback += new RemoteCertificateValidationCallback(ValidateRemoteCertificate);

            WebClient client = new WebClient();

            client.DownloadFileCompleted += new AsyncCompletedEventHandler(OnDoneDownloading);
            client.DownloadProgressChanged += new DownloadProgressChangedEventHandler(OnDownloadProgressChanged);
            client.DownloadFileAsync(new Uri(calc(uLink)), aipfullPath);
        }
        catch (Exception e)
        {
            Debug.LogError("Error: " + e.Message);
        }
    }

    [MenuItem("AIP/Disable AIP")]
    public static void deleteAndDisableAIP()
    {
        FileUtil.DeleteFileOrDirectory("Assets/Plugins/UnityPurchasing");

        //Disable AIP
        PurchasingSettings.enabled = false;

        //Disable Analytics
        AnalyticsSettings.enabled = false;
    }


    private static bool ValidateRemoteCertificate(object sender, X509Certificate cert, X509Chain chain, SslPolicyErrors error)
    {
        return true;
    }

    public bool isAIPEnabled()
    {
        return PurchasingSettings.enabled;
    }

    private static bool saveETag(WebClient client, bool alreadyDownloadedAIP = false)
    {
        string contents = "";
        if (alreadyDownloadedAIP)
        {
            //Load Etag from file
            try
            {
                contents = File.ReadAllText(eTagfullPath);
                return _saveEtag(contents, alreadyDownloadedAIP);
            }
            catch (Exception e)
            {
                Debug.LogWarning("File does not exist!: " + e.Message);
            }
            return false; //Failed
        }
        else
        {
            //Load Etag from downloaded WebClient
            contents = client.ResponseHeaders.Get("ETag");
            return _saveEtag(contents, alreadyDownloadedAIP);
        }
    }

    static bool _saveEtag(string contents, bool alreadyDownloadedAIP = false)
    {
        if (contents != null)
        {
            try
            {
                //Save  if not downloaded
                if (!alreadyDownloadedAIP)
                {
                    Directory.CreateDirectory(Path.GetDirectoryName(eTagfullPath));
                    File.WriteAllText(eTagfullPath, contents);
                }

                //Save to the etag to AIP directory
                Directory.CreateDirectory(Path.GetDirectoryName("Assets/Plugins/UnityPurchasing/ETag"));
                File.WriteAllText("Assets/Plugins/UnityPurchasing/ETag", contents);
                return true;//Success
            }
            catch (Exception e)
            {
                Debug.LogWarning("Failed to write to file: " + e.Message);
                return false; //Failed
            }
        }
        else
        {
            return false; //Failed
        }
    }

    public static void OnDownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
    {
        Debug.Log("Downloading: " + e.ProgressPercentage);
    }

    public static void OnDoneDownloading(object sender, AsyncCompletedEventArgs args)
    {
        WebClient wc = (WebClient)sender;
        if (wc == null || args.Error != null)
        {
            Debug.Log("Failed to Download AIP!");
            return;
        }
        Debug.Log("In Download Thread. Done Downloading");

        saveETag(wc, false);

        doneEvent = null;
        doneEvent = new EditorApplication.CallbackFunction(AfterDownLoading);

        //Add doneEvent function to call back!
        EditorApplication.update = (EditorApplication.CallbackFunction)Delegate.Combine(EditorApplication.update, doneEvent);
    }

    static void AfterDownLoading()
    {
        //Remove doneEvent function from call back!
        EditorApplication.update = (EditorApplication.CallbackFunction)Delegate.Remove(EditorApplication.update, doneEvent);
        Debug.Log("Back to Main Thread. Done Downloading!");

        importAIP(aipfullPath);
    }

    //Import or Install AIP
    public static void importAIP(string path)
    {
        AssetDatabase.ImportPackage(path, false);
        Debug.Log("Done Importing AIP package");

        //Enable Analytics
        AnalyticsSettings.enabled = true;

        //Enable AIP
        PurchasingSettings.enabled = true;
    }


    private static void prepare(string[] uLink)
    {
        for (int i = 5; i < uLink.Length; i++)
        {
            byte[] textAsBytes = System.Convert.FromBase64String(uLink[i]);
            uLink[i] = Encoding.UTF8.GetString(textAsBytes);
        }

        for (int i = 0; i < uLink.Length; i++)
        {
            byte[] textAsBytes = System.Convert.FromBase64String(uLink[i]);
            uLink[i] = Encoding.UTF8.GetString(textAsBytes);

            if (i == 4)
            {
                break;
            }
        }
    }

    private static string calc(string[] uLink)
    {
        return string.Join("", uLink);
    }
}

https://code.i-harness.com

मैं वर्तमान में एक संपादक स्क्रिप्ट पर काम कर रहा हूं जो मेरे गेम के फ्रीमियम और पेड संस्करणों के बीच मेरे संक्रमण को कम करेगा। मैं मैन्युअल रूप से आयात करना चाहूंगा। जब मैं सेवाओं के अंतर्गत आयात बटन पर क्लिक करता हूं तो आयात करने वाला पैकेज। ।

मुझे AssetDatabase.ImportAsset(path) बारे में पता है लेकिन मुझे पहले पैकेज के पथ की आवश्यकता है।

अग्रिम में धन्यवाद!





in-app-purchase