This class encodes and decodes JSON strings. Spec. details, see http://www.json.org/ JSON uses Arrays and Objects. These correspond here to the datatypes ArrayList and Hashtable. All numbers are parsed to floats.
Exemple #1
0
 public static void SetAvailableResourceItemTypes(List <string> resourceItemTypes)
 {
     if (GAValidator.ValidateResourceItemTypes(resourceItemTypes.ToArray()))
     {
         GA_Wrapper.SetAvailableResourceItemTypes(GA_MiniJSON.Serialize(resourceItemTypes));
     }
 }
Exemple #2
0
 public static void SetAvailableCustomDimensions01(List <string> customDimensions)
 {
     if (GAValidator.ValidateCustomDimensions(customDimensions.ToArray()))
     {
         GA_Wrapper.SetAvailableCustomDimensions01(GA_MiniJSON.Serialize(customDimensions));
     }
 }
Exemple #3
0
 // Token: 0x0600014D RID: 333 RVA: 0x0000AC64 File Offset: 0x00009064
 public static void SetAvailableCustomDimensions03(List <string> customDimensions)
 {
     if (GAValidator.ValidateCustomDimensions(customDimensions.ToArray()))
     {
         string availableCustomDimensions = GA_MiniJSON.JsonEncode(customDimensions.ToArray());
         GA_Wrapper.SetAvailableCustomDimensions03(availableCustomDimensions);
     }
 }
Exemple #4
0
 // Token: 0x0600014F RID: 335 RVA: 0x0000ACC4 File Offset: 0x000090C4
 public static void SetAvailableResourceItemTypes(List <string> resourceItemTypes)
 {
     if (GAValidator.ValidateResourceItemTypes(resourceItemTypes.ToArray()))
     {
         string availableResourceItemTypes = GA_MiniJSON.JsonEncode(resourceItemTypes.ToArray());
         GA_Wrapper.SetAvailableResourceItemTypes(availableResourceItemTypes);
     }
 }
Exemple #5
0
 public static void SetAvailableResourceCurrencies(List <string> resourceCurrencies)
 {
     if (!GAValidator.ValidateResourceCurrencies(resourceCurrencies.ToArray()))
     {
         return;
     }
     GA_Wrapper.SetAvailableResourceCurrencies(GA_MiniJSON.Serialize((object)resourceCurrencies));
 }
Exemple #6
0
 public static void SetAvailableCustomDimensions03(List <string> customDimensions)
 {
     if (GameAnalyticsSDK.Validators.GAValidator.ValidateCustomDimensions(customDimensions.ToArray()))
     {
         string json = GA_MiniJSON.Serialize(customDimensions);
         GA_Wrapper.SetAvailableCustomDimensions03(json);
     }
 }
Exemple #7
0
 public static void SetAvailableCustomDimensions03(List <string> customDimensions)
 {
     if (!GAValidator.ValidateCustomDimensions(customDimensions.ToArray()))
     {
         return;
     }
     GA_Wrapper.SetAvailableCustomDimensions03(GA_MiniJSON.Serialize((object)customDimensions));
 }
Exemple #8
0
 public static void SetAvailableResourceCurrencies(List <string> resourceCurrencies)
 {
     if (GameAnalyticsSDK.Validators.GAValidator.ValidateResourceCurrencies(resourceCurrencies.ToArray()))
     {
         string json = GA_MiniJSON.JsonEncode(resourceCurrencies.ToArray());
         GA_Wrapper.SetAvailableResourceCurrencies(json);
     }
 }
        // Token: 0x060001C4 RID: 452 RVA: 0x0000CCBC File Offset: 0x0000B0BC
        private static void configureAvailableResourceItemTypes(string list)
        {
            ArrayList arrayList = (ArrayList)GA_MiniJSON.JsonDecode(list);

            GA_Wrapper.GA.CallStatic("configureAvailableResourceItemTypes", new object[]
            {
                arrayList.ToArray(typeof(string))
            });
        }
        // Token: 0x060001C2 RID: 450 RVA: 0x0000CC34 File Offset: 0x0000B034
        private static void configureAvailableCustomDimensions03(string list)
        {
            ArrayList arrayList = (ArrayList)GA_MiniJSON.JsonDecode(list);

            GA_Wrapper.GA.CallStatic("configureAvailableCustomDimensions03", new object[]
            {
                arrayList.ToArray(typeof(string))
            });
        }
        private static void configureAvailableResourceItemTypes(string list)
        {
            IList <object> iList = GA_MiniJSON.Deserialize(list) as IList <object>;
            ArrayList      array = new ArrayList();

            foreach (object entry in iList)
            {
                array.Add(entry);
            }
            GameAnalyticsSDK.Net.GameAnalytics.ConfigureAvailableResourceItemTypes((string[])array.ToArray(typeof(string)));
        }
        private static void configureAvailableResourceItemTypes(string list)
        {
            IList <object> iList = GA_MiniJSON.Deserialize(list) as IList <object>;
            ArrayList      array = new ArrayList();

            foreach (object entry in iList)
            {
                array.Add(entry);
            }
            GA.CallStatic("configureAvailableResourceItemTypes", array.ToArray(typeof(string)));
        }
        private static void configureAvailableResourceItemTypes(string list)
        {
            IList <object> objectList = GA_MiniJSON.Deserialize(list) as IList <object>;
            ArrayList      arrayList  = new ArrayList();

            foreach (object obj in (IEnumerable <object>)objectList)
            {
                arrayList.Add(obj);
            }
            GameAnalytics.ConfigureAvailableResourceItemTypes((string[])arrayList.ToArray(typeof(string)));
        }
Exemple #14
0
        private static void configureAvailableResourceCurrencies(string list)
        {
            IList <object> obj       = GA_MiniJSON.Deserialize(list) as IList <object>;
            ArrayList      arrayList = new ArrayList();

            foreach (object item in obj)
            {
                arrayList.Add(item);
            }
            GA.CallStatic("configureAvailableResourceCurrencies", arrayList.ToArray(typeof(string)));
        }
Exemple #15
0
        private static void configureAvailableResourceCurrencies(string list)
        {
            IList <object> objs       = GA_MiniJSON.Deserialize(list) as IList <object>;
            ArrayList      arrayLists = new ArrayList();

            foreach (object obj in objs)
            {
                arrayLists.Add(obj);
            }
            GameAnalyticsSDK.Net.GameAnalytics.ConfigureAvailableResourceCurrencies((string[])arrayLists.ToArray(typeof(string)));
        }
        private static string DictionaryToJsonString(IDictionary <string, object> dict)
        {
            Hashtable hashtable = new Hashtable();

            if (dict != null)
            {
                foreach (KeyValuePair <string, object> keyValuePair in (IEnumerable <KeyValuePair <string, object> >)dict)
                {
                    hashtable.Add((object)keyValuePair.Key, keyValuePair.Value);
                }
            }
            return(GA_MiniJSON.Serialize((object)hashtable));
        }
Exemple #17
0
        private static string DictionaryToJsonString(IDictionary <string, object> dict)
        {
            Hashtable hashtables = new Hashtable();

            if (dict != null)
            {
                foreach (KeyValuePair <string, object> keyValuePair in dict)
                {
                    hashtables.Add(keyValuePair.Key, keyValuePair.Value);
                }
            }
            return(GA_MiniJSON.Serialize(hashtables));
        }
Exemple #18
0
    private static void runCallback(string format, MaxSdkBase.AdInfo adInfo, Action <string> callback)
    {
        Dictionary <string, object> dict = new Dictionary <string, object>();

        dict.Add("country", MaxSdk.GetSdkConfiguration().CountryCode);
        dict.Add("network_name", adInfo.NetworkName);
        dict.Add("adunit_id", adInfo.AdUnitIdentifier);
        dict.Add("adunit_format", format);
        dict.Add("placement", adInfo.Placement);
        dict.Add("creative_id", adInfo.CreativeIdentifier);
        dict.Add("revenue", adInfo.Revenue);
        string json = GA_MiniJSON.Serialize(dict);

        callback(json);
    }
    private static IEnumerator <WWW> CheckWebUpdate(WWW www)
    {
        yield return(www);

        try {
            Hashtable returnParam = (Hashtable)GA_MiniJSON.JsonDecode(www.text);
            string    newVersion  = ((Hashtable)returnParam["unity"])["version"].ToString();

            GA_UpdateWindow.SetNewVersion(newVersion);
            if (newVersion != GA_Settings.VERSION)
            {
                GetUpdateChanges();
            }
        }
        catch {}
    }
Exemple #20
0
    private IEnumerator Request(WWW www, RequestType requestType, SubmitSuccessHandler successEvent, SubmitErrorHandler errorEvent)
    {
        yield return(www);

        GA.Log("GameAnalytics: URL " + www.url);

        try
        {
            if (!string.IsNullOrEmpty(www.error))
            {
                throw new Exception(www.error);
            }

            //Get the JSON object from the response
            string text = www.text;
            text = text.Replace("null", "0");
            Hashtable returnParam = (Hashtable)GA_MiniJSON.JsonDecode(text);

            if (returnParam != null)
            {
                GA.Log("GameAnalytics: Result: " + text);


                if (successEvent != null)
                {
                    successEvent(requestType, returnParam, errorEvent);
                }
            }
            else
            {
                throw new Exception(text);
            }
        }
        catch (Exception e)
        {
            if (errorEvent != null)
            {
                errorEvent(e.Message);
            }
        }
    }
    private static IEnumerator <WWW> CheckWebChanges(WWW www)
    {
        yield return(www);

        try {
            Hashtable returnParam = (Hashtable)GA_MiniJSON.JsonDecode(www.text);

            ArrayList unity = ((ArrayList)returnParam["unity"]);
            for (int i = 0; i < unity.Count; i++)
            {
                Hashtable unityHash = (Hashtable)unity[i];
                if (unityHash["version"].ToString() == GA_UpdateWindow.GetNewVersion())
                {
                    i = unity.Count;
                    ArrayList changes    = ((ArrayList)unityHash["changes"]);
                    string    newChanges = "";
                    for (int u = 0; u < changes.Count; u++)
                    {
                        if (string.IsNullOrEmpty(newChanges))
                        {
                            newChanges = "- " + changes[u].ToString();
                        }
                        else
                        {
                            newChanges += "\n- " + changes[u].ToString();
                        }
                    }

                    GA_UpdateWindow.SetChanges(newChanges);
                    string skippedVersion = EditorPrefs.GetString("ga_skip_version", "");

                    if (!skippedVersion.Equals(GA_UpdateWindow.GetNewVersion()))
                    {
                        OpenUpdateWindow();
                    }
                }
            }
        }
        catch {}
    }
Exemple #22
0
	private static IEnumerator<WWW> CheckWebUpdate (WWW www)
	{
		yield return www;
		
		try {
			if (string.IsNullOrEmpty(www.error))
			{
				Hashtable returnParam = (Hashtable)GA_MiniJSON.JsonDecode(www.text);
				string newVersion = ((Hashtable)returnParam["unity"])["version"].ToString();
				
				GA_UpdateWindow.SetNewVersion(newVersion);

				int newV = int.Parse(newVersion.Replace(".",""));
				int oldV = int.Parse(GA_Settings.VERSION.Replace(".",""));

				if (newV > oldV)
				{
					GetUpdateChanges();
				}
			}
		}
		catch {}
	}
    /// <summary>
    /// Gets data which has previously been archived due to lack of internet connectivity.
    /// The file containing the archived data is then deleted.
    /// </summary>
    /// <returns>
    /// The archived data as a list of items with parameters and category
    /// </returns>
    public List <GA_Submit.Item> GetArchivedData()
    {
                #if UNITY_WEBPLAYER || UNITY_NACL || UNITY_FLASH || UNITY_METRO
        return(null);
                #else
        List <GA_Submit.Item> items = new List <GA_Submit.Item>();

        StreamReader fileReader = null;
        string       fileName   = Application.persistentDataPath + "/" + FILE_NAME;

        if (File.Exists(fileName))
        {
            fileReader = File.OpenText(fileName);
        }

        if (fileReader != null)
        {
            string line = null;
            while ((line = fileReader.ReadLine()) != null)
            {
                string[] lineSplit = line.Split(' ');
                if (lineSplit.Length >= 2)
                {
                    string categoryString = lineSplit[0];
                    string json           = line.Substring(lineSplit[0].Length + 1);

                    bool saveData = false;
                    GA_Submit.CategoryType category = GA_Submit.CategoryType.GA_User;

                    foreach (KeyValuePair <GA_Submit.CategoryType, string> kvp in GA_Submit.Categories)
                    {
                        if (kvp.Key.ToString().Equals(categoryString))
                        {
                            category = kvp.Key;
                            saveData = true;
                        }
                    }

                    if (saveData)
                    {
                        ArrayList itemsParameters = (ArrayList)GA_MiniJSON.JsonDecode(json);                        //JsonMapper.ToObject<List<Dictionary<string, object>>>(json);

                        foreach (Hashtable parameters in itemsParameters)
                        {
                            GA_Submit.Item item = new GA_Submit.Item
                            {
                                Type       = category,
                                Parameters = parameters,
                                AddTime    = Time.time
                            };

                            items.Add(item);
                        }
                    }
                }
            }
            fileReader.Close();

            File.Delete(fileName);
        }

        return(items);
                #endif
    }
Exemple #24
0
    /// <summary>
    /// Checks the internet connectivity, and sets INTERNETCONNECTIVITY
    /// </summary>
    public IEnumerator CheckInternetConnectivity(bool startQueue)
    {
        // Application.internetReachability returns the type of Internet reachability currently possible on the device, but does not check if the there is an actual route to the network. So we can check this instantly.
        if (Application.internetReachability == NetworkReachability.ReachableViaCarrierDataNetwork && !GA.SettingsGA.AllowRoaming)
        {
            InternetConnectivity = false;
        }
        else
        {
            //Try to ping the server
            WWW www = new WWW(GA.API.Submit.GetBaseURL(true) + "/ping");

            //Wait for response
            yield return(www);

            try
            {
                if (GA.API.Submit.CheckServerReply(www))
                {
                    InternetConnectivity = true;
                }
                else if (!string.IsNullOrEmpty(www.error))
                {
                    InternetConnectivity = false;
                }
                else
                {
                    //Get the JSON object from the response
                    Hashtable returnParam = (Hashtable)GA_MiniJSON.JsonDecode(www.text);

                    //If the response contains the key "status" with the value "ok" we know that we are connected
                    if (returnParam != null && returnParam.ContainsKey("status") && returnParam["status"].ToString().Equals("ok"))
                    {
                        InternetConnectivity = true;
                    }
                    else
                    {
                        InternetConnectivity = false;
                    }
                }
            }
            catch
            {
                InternetConnectivity = false;
            }
        }

        if (startQueue)
        {
            if (InternetConnectivity)
            {
                GA.Log("GA has confirmed internet connection..");
            }
            else
            {
                GA.Log("GA detects no internet connection..");
            }

            //Try to add additional IDs
            if (AddUniqueIDs())
            {
                //Start the submit queue for sending messages to the server
                GA.RunCoroutine(GA_Queue.SubmitQueue());
                GA.Log("GameAnalytics: Submission queue started.");

                                #if UNITY_EDITOR
                GameObject gaTracking = new GameObject("GA_Tracking");
                gaTracking.AddComponent <GA_Tracking>();
                                #else
                GameObject fbGameObject = new GameObject("GA_FacebookSDK");
                fbGameObject.AddComponent <GA_FacebookSDK>();
                                #endif
            }
            else
            {
                GA.LogWarning("GA failed to add unique IDs and will not send any data. If you are using iOS or Android please see the readme file in the iOS/Android folder in the GameAnalytics/Plugins directory.");
            }
        }
    }
    /// <summary>
    /// Takes a dictionary with a item list for each category type. All items in each category are submitted together to the GA server.
    /// </summary>
    /// <param name="item">
    /// The list of items, each holding a message and service type <see cref="Item"/>
    /// </param>
    /// <param name="successEvent">
    /// If successful this will be fired <see cref="SubmitSuccessHandler"/>
    /// </param>
    /// <param name="errorEvent">
    /// If an error occurs this will be fired <see cref="SubmitErrorHandler"/>
    /// </param>
    /// <returns>
    /// A <see cref="IEnumerator"/>
    /// </returns>
    public IEnumerator Submit(Dictionary <CategoryType, List <Item> > categories, SubmitSuccessHandler successEvent, SubmitErrorHandler errorEvent, bool gaTracking, string pubKey, string priKey)
    {
        if (pubKey.Equals(""))
        {
            pubKey = _publicKey;
        }

        if (priKey.Equals(""))
        {
            priKey = _privateKey;
        }

        //For each existing category, submit a message containing all the items of that category type
        foreach (KeyValuePair <CategoryType, List <Item> > kvp in categories)
        {
            List <Item> items = kvp.Value;

            if (items.Count == 0)
            {
                yield break;
            }

            //Since all the items must have the same category (we make sure they do below) we can get the category from the first item
            CategoryType serviceType = items[0].Type;
            string       url         = GetURL(Categories[serviceType], pubKey);

            //Make sure that all items are of the same category type, and put all the parameter collections into a list
            List <Hashtable> itemsParameters = new List <Hashtable>();

            for (int i = 0; i < items.Count; i++)
            {
                if (serviceType != items[i].Type)
                {
                    GA.LogWarning("GA Error: All messages in a submit must be of the same service/category type.");
                    if (errorEvent != null)
                    {
                        errorEvent(items);
                    }
                    yield break;
                }

                // if user ID is missing from the item add it now (could f.x. happen if custom user id is enabled,
                // and the item was added before the custom user id was provided)
                if (!items[i].Parameters.ContainsKey(GA_ServerFieldTypes.Fields[GA_ServerFieldTypes.FieldType.UserID]))
                {
                    items[i].Parameters.Add(GA_ServerFieldTypes.Fields[GA_ServerFieldTypes.FieldType.UserID], GA.API.GenericInfo.UserID);
                }
                else if (items[i].Parameters[GA_ServerFieldTypes.Fields[GA_ServerFieldTypes.FieldType.UserID]] == null)
                {
                    items[i].Parameters[GA_ServerFieldTypes.Fields[GA_ServerFieldTypes.FieldType.UserID]] = GA.API.GenericInfo.UserID;
                }

                Hashtable parameters;

                if (items[i].Count > 1)
                {
                    /* so far we don't do anything special with stacked messages - we just send a single message
                     * GA_TODO: stacked messages should be handle correctly.*/
                    parameters = items[i].Parameters;
                }
                else
                {
                    parameters = items[i].Parameters;
                }

                itemsParameters.Add(parameters);
            }

            //Make a JSON array string out of the list of parameter collections
            string json = DictToJson(itemsParameters);

            /* If we do not have access to a network connection (or we are roaming (mobile devices) and GA_static_api.Settings.ALLOWROAMING is false),
             * and data is set to be archived, then archive the data and pretend the message was sent successfully */
            if (GA.SettingsGA.ArchiveData && !gaTracking && !GA.SettingsGA.InternetConnectivity)
            {
                if (GA.SettingsGA.DebugMode)
                {
                    GA.Log("GA: Archiving data (no network connection).");
                }

                GA.API.Archive.ArchiveData(json, serviceType);
                if (successEvent != null)
                {
                    successEvent(items, true);
                }
                yield break;
            }
            else if (!GA.SettingsGA.InternetConnectivity)
            {
                if (!gaTracking)
                {
                    GA.LogWarning("GA Error: No network connection.");
                }

                if (errorEvent != null)
                {
                    errorEvent(items);
                }
                yield break;
            }

            //Prepare the JSON array string for sending by converting it to a byte array
            byte[] data = Encoding.UTF8.GetBytes(json);

            WWW www = null;

                        #if !UNITY_WP8 && !UNITY_METRO
            //Set the authorization header to contain an MD5 hash of the JSON array string + the private key
            Hashtable headers = new Hashtable();
            headers.Add("Authorization", CreateMD5Hash(json + priKey));
            //headers.Add("Content-Length", data.Length);

            //Try to send the data
            www = new WWW(url, data, headers);
                        #else
            //Set the authorization header to contain an MD5 hash of the JSON array string + the private key

            Dictionary <string, string> headers = new Dictionary <string, string>();
            headers.Add("Authorization", CreateMD5Hash(json + priKey));
            headers.Add("Content-Length", data.Length.ToString());

            //Try to send the data
            www = new WWW(url, data, headers);
                        #endif

                        #if !UNITY_FLASH && !UNITY_WP8 && !UNITY_METRO
            //Set thread priority low
            www.threadPriority = ThreadPriority.Low;
                        #endif

            //Wait for response
            yield return(www);

            if (GA.SettingsGA.DebugMode && !gaTracking)
            {
                GA.Log("GA URL: " + url);
                GA.Log("GA Submit: " + json);
                GA.Log("GA Hash: " + CreateMD5Hash(json + priKey));
            }

            try
            {
                if (www.error != null && !CheckServerReply(www))
                {
                    throw new Exception(www.error);
                }

                //Get the JSON object from the response
                Hashtable returnParam = (Hashtable)GA_MiniJSON.JsonDecode(www.text);

                //If the response contains the key "status" with the value "ok" we know that the message was sent and recieved successfully
                if ((returnParam != null &&
                     returnParam.ContainsKey("status") && returnParam["status"].ToString().Equals("ok")) ||
                    CheckServerReply(www))
                {
                    if (GA.SettingsGA.DebugMode && !gaTracking)
                    {
                        GA.Log("GA Result: " + www.text);
                    }

                    if (successEvent != null)
                    {
                        successEvent(items, true);
                    }
                }
                else
                {
                    /* The message was not sent and recieved successfully: Stop submitting all together if something
                     * is completely wrong and we know we will not be able to submit any messages at all..
                     * Such as missing or invalid public and/or private keys */
                    if (returnParam != null &&
                        returnParam.ContainsKey("message") && returnParam["message"].ToString().Equals("Game not found") &&
                        returnParam.ContainsKey("code") && returnParam["code"].ToString().Equals("400"))
                    {
                        if (!gaTracking)
                        {
                            GA.LogWarning("GA Error: " + www.text + " (NOTE: make sure your Game Key and Secret Key match the keys you recieved from the Game Analytics website. It might take a few minutes before a newly added game will be able to recieve data.)");
                        }

                        //An error event with a null parameter will stop the GA wrapper from submitting messages
                        if (errorEvent != null)
                        {
                            errorEvent(null);
                        }
                    }
                    else
                    {
                        if (!gaTracking)
                        {
                            GA.LogWarning("GA Error: " + www.text);
                        }

                        if (errorEvent != null)
                        {
                            errorEvent(items);
                        }
                    }
                }
            }
            catch (Exception e)
            {
                if (!gaTracking)
                {
                    GA.LogWarning("GA Error: " + e.Message);
                }

                /* If we hit one of these errors we should not attempt to send the message again
                 * (if necessary we already threw a GA Error which may be tracked) */
                if (e.Message.Contains("400 Bad Request"))
                {
                    //An error event with a null parameter will stop the GA wrapper from submitting messages
                    if (errorEvent != null)
                    {
                        errorEvent(null);
                    }
                }
                else
                {
                    if (errorEvent != null)
                    {
                        errorEvent(items);
                    }
                }
            }
        }
    }
    private void DeleteMeshes()
    {
        _loaded = false;

        if (meshSelected == null)
        {
            return;
        }

        for (int i = 0; i < meshSelected.Length; i++)
        {
            if (meshSelected[i])
            {
                WWWForm form = new WWWForm();

                form.AddField("gamekey", GA.SettingsGA.GameKey);
                form.AddField("authorization", GA_Submit.CreateMD5Hash(GA.SettingsGA.GameKey + meshNames[i] + ".unity3d" + GA.SettingsGA.SecretKey));
                form.AddField("meshname", meshNames[i] + ".unity3d");

                WWW w = new WWW("https://go.gameanalytics.com/api/heatmap/mesh/delete", form);

                while (!w.isDone)
                {
                }

                if (w.error != null)
                {
                    Debug.LogWarning("Failed to delete mesh: " + meshNames[i]);
                }
                else
                {
                    Hashtable data = (Hashtable)GA_MiniJSON.JsonDecode(w.text);

                    ArrayList errorArray = data["errors"] as ArrayList;

                    if (errorArray.Count > 0)
                    {
                        foreach (Hashtable ht in errorArray)
                        {
                            string msg = (string)ht["message"];
                            if (msg.Equals("404"))
                            {
                                Debug.LogWarning("Game key or mesh not found! Have you input the correct game key in GA_Settings?");
                            }
                            else if (msg.Equals("401"))
                            {
                                Debug.LogWarning("Authorization failed! Have you input the correct secret key in GA_Settings?");
                            }
                            else if (msg.Equals("400"))
                            {
                                Debug.LogWarning("Failed to delete mesh.");
                            }
                            else if (msg.Equals("503"))
                            {
                                Debug.LogWarning("Service unavailable, please try again later!");
                            }
                        }
                    }
                    else
                    {
                        Debug.Log("Deleted mesh: " + meshNames[i]);
                    }
                }
            }
        }
        UpdateMeshList();
    }