Search Unity

Easy Save - The Complete Save Data & Serialization Asset

Discussion in 'Assets and Asset Store' started by JoelAtMoodkie, May 28, 2011.

  1. JoelAtMoodkie

    JoelAtMoodkie

    Joined:
    Oct 18, 2009
    Posts:
    914
    Hi Steven,

    You can save an array to a file without tags using an ES2Writer sequentially (see this guide). However, this wouldn't actually provide much benefit over saving your array as a single tag to a file (note that the array itself is stored sequentially, so each item of the array is not stored as a tag).

    If you let me know what you're looking to achieve, I'll see if I can offer some insight :) Feel free to email me on my usual address if that's easier for you (or at moodkie.com/contact).

    As always, hope your apps are going well!

    All the best,
    Joel
     
  2. stevenatunity

    stevenatunity

    Joined:
    Apr 17, 2015
    Posts:
    114
    Thanks, Joel, I will drop you a note next week :)
     
  3. Desoro

    Desoro

    Joined:
    Apr 30, 2016
    Posts:
    9
    Hello!

    I am having issues getting the reader/writer to read/write the correct child class of a parent. Here's a quick breakdown of my setup:

    TileManager - Manages and holds the data for all Tiles in an int[,] array.

    Tile - Manages and holds the data for all Entity present. The essential data here is the List<Entity> of all Entities present.

    Entity - Parent class for all tangible and intangible objects in the game. Sub classes include types like Wall, Doors, Floors an etc.

    Both Tile and Entity are serializable classes that have no inheritance, just basic data classes.

    Now when I write the data and then read it back, the TileManager gets all the Tile data back correctly and the Tile gets the List<Entity> back correctly, but they are all the base class of Entity and have lost their child data and identification. What do I need to do to make sure the child classes are getting saved to disk, instead of only as the base class of Entity?
     
  4. JoelAtMoodkie

    JoelAtMoodkie

    Joined:
    Oct 18, 2009
    Posts:
    914
    Hi there,

    In Easy Save 2 doesn't support inheritance automatically. However, you can create a custom ES2Type to support it. I describe how to do this in the final post of this thread.

    Note that Easy Save 3 supports inheritance out of the box, and is currently in beta.

    All the best,
    Joel
     
  5. MarcopoloR

    MarcopoloR

    Joined:
    Feb 4, 2015
    Posts:
    114
    Hi, forgive me if I sound ignorant I am a newbie at all this save/load stuff. My question is if I use the autosave feature can I make it so it will save load with a specific method other than application.quit? I want saving the game and loading the game to be accessible by menu where the player pushes a button, rather than just automatically saving and loading where they left off. I went through the video tutorials that speedtutor put up but they didn't mention anything about saving/loading prefabs that are instantiated at runtime, but the autosave feature does it so that is why I need to use that. Thank you.
     
  6. JoelAtMoodkie

    JoelAtMoodkie

    Joined:
    Oct 18, 2009
    Posts:
    914
    Hi there,

    There's information on manually triggering Auto Save at the bottom of the Auto Save guide.

    All the best,
    Joel
     
  7. MarcopoloR

    MarcopoloR

    Joined:
    Feb 4, 2015
    Posts:
    114
    Thank you, I must have overlooked that part when I looked at it before.
     
  8. MarcopoloR

    MarcopoloR

    Joined:
    Feb 4, 2015
    Posts:
    114
    Hi Joel,
    I have another little issue I cannot figure out. If I destroy a prefab that was in the scene at the beginning of the game, it will not stay destroyed. For instance, I chop down a tree and then it destroys itself after 10 seconds. Then when I reload the game it is there in its original spot again. I have tried marking for save every attribute of the prefab. when I mark the transform it will stay in its changed position, like if I chop it down it will stay chopped down, but I cannot figure out how to destroy it completely and leave it out of the scene after that. I am not talking about prefabs that are instantiated in the scene at runtime, the ones I have tried seem to stay out after they are destroyed, but the ones in at the start of the game, like all of the trees, will not stay destroyed. Is it possible to do this with the autosave? Thanks.for any help you can give
    Mark
     
  9. JoelAtMoodkie

    JoelAtMoodkie

    Joined:
    Oct 18, 2009
    Posts:
    914
    Hi Mark,

    This won't be possible with Auto Save. However, you could attach a short script to your objects which would manage this. I've attached an example script below. For this to work, in your project you will need to call this scripts Destroy method instead of calling Unity's Destroy(object) method:

    Code (CSharp):
    1. using System.Collections;
    2. using System.Collections.Generic;
    3. using UnityEngine;
    4.  
    5. public class DestroyPrefab : MonoBehaviour
    6. {
    7.     public string guid = System.Guid.NewGuid().ToString();
    8.  
    9.     public void Start()
    10.     {
    11.         if(ES2.Exists("myFile.txt?tag=" + guid))
    12.             Destroy(this);
    13.     }
    14.  
    15.     public void Destroy()
    16.     {
    17.         ES2.Save(true, "myFile.txt?tag="+guid);
    18.         Destroy(this);
    19.     }
    20. }
    All the best,
    Joel
     
  10. MarcopoloR

    MarcopoloR

    Joined:
    Feb 4, 2015
    Posts:
    114
    Thank you for taking the time to write this. I will definitely try it out. Overnight I thought about this and came up with the idea that instead of destroying the object just do a SetActive(false) to the gameobject and make sure the script is included in the autosave. Not sure if my idea would work either as I haven't tested it yet, but what you have is probably more efficient anyway. Thanks again,
    Mark
     
    Last edited: Oct 13, 2017
  11. MarcopoloR

    MarcopoloR

    Joined:
    Feb 4, 2015
    Posts:
    114
    Okay, i tried this but unfortunately it didn't work for me, not sure why. Here is my copy of your script and the script I am trying to use it on-
    Code (CSharp):
    1. using System.Collections;
    2. using System.Collections.Generic;
    3. using UnityEngine;
    4.  
    5. public class DestroyPrefab : MonoBehaviour {
    6.  
    7.     public string guid = System.Guid.NewGuid().ToString();
    8.  
    9.     // Use this for initialization
    10.     void Start () {
    11.  
    12.         if (ES2.Exists("Myfile.txt?tag=" + guid))
    13.             Destroy(this);
    14.      
    15.     }
    16.  
    17.     public void Destroy()
    18.     {
    19.         ES2.Save(true, "myFile.txt?tag=" + guid);
    20.         Destroy(this);
    21.     }
    22. }
    23.  
    and the code I am using it in
    Code (CSharp):
    1. using System.Collections;
    2. using System.Collections.Generic;
    3. using UnityEngine;
    4.  
    5. public class ChoppableTree : MonoBehaviour {
    6.  
    7.     public GameObject thisTree;
    8.     public int TreeHealth = 5;
    9.     private bool isFallen = false;
    10.  
    11.     //public DestroyPrefab killTree;
    12.  
    13.     AudioSource audio;
    14.  
    15.  
    16.     // Use this for initialization
    17.     void Start () {
    18.  
    19.         thisTree = transform.parent.gameObject;
    20.  
    21.         audio = GetComponent<AudioSource>();
    22.  
    23.  
    24.     }
    25.  
    26.     // Update is called once per frame
    27.     void Update () {
    28.         if (TreeHealth <= 0 && isFallen == false)
    29.         {
    30.             Rigidbody rb = thisTree.AddComponent<Rigidbody>();
    31.             rb.isKinematic = false;
    32.             rb.useGravity = true;
    33.             rb.AddForce(Vector3.forward, ForceMode.Impulse);
    34.             StartCoroutine(destroyTree());
    35.             Debug.Log("this Tree");
    36.             audio.Play();
    37.         }
    38.  
    39.     }
    40.  
    41.     private IEnumerator destroyTree()
    42.     {
    43.         yield return new WaitForSeconds(10);
    44.         DestroyPrefab.Destroy(thisTree);
    45.         //thisTree.SetActive(false);
    46.     }
    47.  
    48. }
    49.  
    Since I am not a professional programmer, it is probably some stupid obvious error so sorry about that. I am using your asset because I am not a professional programmer but just an intermediate level self taught(still self teaching) one :)
    My SetActive Idea does seem to work, but I would rather do it the right way than my hacky way. Is there a major disadvantage to using SetActive instead of your cutom destroy, other than stay in the hierarchy greyed out for the rest of of the game? This is assuming I am using it on hundreds or possibly thousands of trees and other resources in the scene.

    Other important info: I did attach your script to an empty game object in the scene, is this right?
     
  12. JoelAtMoodkie

    JoelAtMoodkie

    Joined:
    Oct 18, 2009
    Posts:
    914
    Hi there,

    You have a typo in the save path of your version of the DestroyPrefab script. If you copy and paste my version, it should work properly.

    Just to clarify, the DestroyPrefab script should be attached to every object which can be destroyed.

    SetActive is also a valid way of doing it if you prefer to do it that way.

    All the best,
    Joel
     
  13. MarcopoloR

    MarcopoloR

    Joined:
    Feb 4, 2015
    Posts:
    114
    Hi Joel,
    Thanks, that explains it, a typo.
     
  14. wethecom

    wethecom

    Joined:
    Jun 24, 2015
    Posts:
    75
    hello i need to save the health and transform of 1600 prefabs
    do you have a solution for this or example code you can reference me
     
  15. JoelAtMoodkie

    JoelAtMoodkie

    Joined:
    Oct 18, 2009
    Posts:
    914
    Hi there,

    Assuming the number of prefabs is always going to be the same, and in the same order, the easiest performance-friendly way would be to create an array of the health values, and another array of the Transforms, and save these. i.e.

    Code (CSharp):
    1. ES2.Save(healthArray, "myFile.txt?tag=healthArray");
    2. ES2.Save(transformArray, "myFile.txt?tag=transformArray");
    And then to load them back, load the health array and apply each value to your prefabs, and use self-assigning load to load the saved Transforms directly into their appropriate prefabs. i.e.

    Code (CSharp):
    1. var healthArray = ES2.LoadArray<int>("myFile.txt?tag=healthArray");
    2. /* Put your code here to iterate through the health array
    3. and apply each health value to it's corresponding prefab. */
    4.  
    5. // Use self-assigning load to load the Transforms directly into the prefabs.
    6. ES2.LoadArray<Transform>("myFile.txt?tag=transformArray", transformArray);
    All the best,
    Joel
     
  16. wethecom

    wethecom

    Joined:
    Jun 24, 2015
    Posts:
    75
    no they wont be the same..its a tower defence game and i want to save what the player has built...eventually enemies will destroy things...i just need to tally or store changes in health and what towers survived...
    i think this will work...
     
  17. JoelAtMoodkie

    JoelAtMoodkie

    Joined:
    Oct 18, 2009
    Posts:
    914
    In that case after loading your health array you will want to instantiate a tower for each item in the array, which you can load your health and Transform into. If you have different types of tower, you should also save another array which contains what type each tower is, so you know what prefab to instantiate.

    All the best,
    Joel
     
  18. MoribitoMT

    MoribitoMT

    Joined:
    Jun 1, 2013
    Posts:
    301
    Hi,

    I have been using EasySave for 2 years, greatly satisfied with it. I am making games for iOS and Android, and all my data stored via EasySave.

    My question is a bit technical.

    I have huge amount of game data, and I save all it in 3 conditions.
    1. A game play end
    2. A game play pause
    3. User quits applications

    My questions is crash conditions if app is crashes on iOS / Android, Do I need to do something special to save the data before crash occurs ?

    Regards
     
  19. JoelAtMoodkie

    JoelAtMoodkie

    Joined:
    Oct 18, 2009
    Posts:
    914
    Hi there,

    It's not possible to do this because when a crash occurs in Unity, all execution stops, so no code can be run after this happens.

    All the best,
    Joel
     
    MoribitoMT likes this.
  20. ksam2

    ksam2

    Joined:
    Apr 28, 2012
    Posts:
    1,080
    Can I create Database with Easy Save? I need a database of string variables.
     
  21. JoelAtMoodkie

    JoelAtMoodkie

    Joined:
    Oct 18, 2009
    Posts:
    914
    Hi there,

    Easy Save files act more like a Dictionary, allowing you store and retrieve data in a file using a key (or a tag, as it's referred to in Easy Save 2).

    There's basic information on this in the following pages: Easy Save 2, Easy Save 3 (beta)

    All the best,
    Joel
     
    ksam2 likes this.
  22. ksam2

    ksam2

    Joined:
    Apr 28, 2012
    Posts:
    1,080
    Thanks. I find Easy Save very useful.
    Is that possible to place all files that placed on plugins directory to a single sub folder? lots of files on plugins root directory feels bad.
     
  23. JoelAtMoodkie

    JoelAtMoodkie

    Joined:
    Oct 18, 2009
    Posts:
    914
    Hi there,

    The plugins directory is a special folder which Unity requires us to put plugins in, so unfortunately it's not possible to move them out of there without breaking Easy Save.

    All the best,
    Joel
     
  24. ksam2

    ksam2

    Joined:
    Apr 28, 2012
    Posts:
    1,080
    I know but isn't that possible to create a subfolder in the plugins directory? Like final ik and PlayMaker?
     
  25. JoelAtMoodkie

    JoelAtMoodkie

    Joined:
    Oct 18, 2009
    Posts:
    914
    If you're referring to the DLLs in Plugins, I believe later versions of Unity allow you to move them into a sub-folder, though you will need to change the 'placeholder' field of all of the platform-specific plugins to the new location of the DLL.
     
    ksam2 likes this.
  26. Fowi

    Fowi

    Joined:
    Dec 2, 2013
    Posts:
    30
    Good morning.
    I have a method "Save" with this:
    ES3.Save<Vector3>("PlayerPosition", GameObject.FindGameObjectWithTag("Player").transform.position);
    And a "Load" method with this:
    GameObject.FindGameObjectWithTag("Player").transform.position = ES3.Load<Vector3>("PlayerPosition");
    I save and load, and it works, but the console show me more or less 15 lines of errors:
    FormatException: Expected ',' separating properties or '"' before property name, found ''.
    Etc, etc...
    Do you know it?
    But well, the important question I have is the added lines:
    Save: ES3.Save<SoCollectionItem>("PlayerItems", PlayerScript.CollectionItem);
    Load: PlayerScript.CollectionItem = ES3.Load<SoCollectionItem>("PlayerItems");
    It not work! why? SoCollectionItem is a scriptable object and the documentation says it is
    Automatically supported.
    What is wrong?
     
  27. JoelAtMoodkie

    JoelAtMoodkie

    Joined:
    Oct 18, 2009
    Posts:
    914
    Hi there,

    It sounds like a previous error has written incomplete data to the file. Going to Window > Easy Save 3 > Tools > Open Persistent Data Path, and deleting the file from there should fix this.

    Regarding your second error, please could you tell me how it isn't working? Also as noted in the docs, being a ScriptableObject doesn't guarantee that all of the fields inside it will be supported.

    All the best,
    Joel
     
  28. Fowi

    Fowi

    Joined:
    Dec 2, 2013
    Posts:
    30
    Yeah, first problem solved and also I alredy know where is located that persistent data path. Thanks.
    The second error: I try to save the variable CollectionItem of type "SoCollectionItem" of the Player.
    This variable/type has a list of "Item" which is other type of scriptable object. This Item type has variables of type:
    enum, string, sprite, int, gameobject, audioclip. Maybe EasySave3 don't support one of this, so the saving is interrupted? Because I try to consume/drop items from the inventory, then save the game, stop editor player, play, and load the game and the inventory is the original from the begining, and throwing errors, (but the position of the player is changed).
    Or maybe could you say me an example of code of how you would save a scriptableobject in two methods (Load/Save)?
     
    Last edited: Nov 18, 2017
  29. JoelAtMoodkie

    JoelAtMoodkie

    Joined:
    Oct 18, 2009
    Posts:
    914
    Hi there,

    Unfortunately I'm not able to replicate it with the information you've given. Please could you make a new project and create the bare minimum to replicate this error, and PM me a link to it?

    All the best,
    Joel
     
  30. skinwalker

    skinwalker

    Joined:
    Apr 10, 2015
    Posts:
    509
    Hey, I still don't have the asset, but I'm wondering if you can you keep data between scenes without using static classes or saving (unless the player hits "Save"). For example I have scene 1 the player kills every npc and he teleports to scene 2, then he saves, in that save he should have the information that the npcs were killed in scene 1 so when he loads it and goes to scene 1 they will be dead.
     
  31. JoelAtMoodkie

    JoelAtMoodkie

    Joined:
    Oct 18, 2009
    Posts:
    914
    Hi there,

    This is indeed possible, but the best idea is to take a look at our Guides and Documentation to see how you would achieve this in your project.

    Generally the idea would be to save an array containing a bool for each of your NPCs which says whether they're dead or not. Then whenever you load Scene 1, load this array and use it to determine which NPCs to disable.

    All the best,
    Joel
     
  32. yaffa

    yaffa

    Joined:
    Nov 21, 2016
    Posts:
    41
    Hi Joel ,
    I'm trying to save a Excel sheet on Android , localy. Can you help me with the path to saving? Where do i save it so that I can access it and export it later?
     
  33. JoelAtMoodkie

    JoelAtMoodkie

    Joined:
    Oct 18, 2009
    Posts:
    914
    Hi there,

    Due to the security sandbox of Android, it's not possible to access files stored on the device. However, you should be able to write to an SD card by setting your Write Access to External (SD Card) in your Unity Player settings. You can then find the location of this by outputting Unity's Application.persistentDataPath variable to console at runtime.

    All the best,
    Joel
     
  34. Artaani

    Artaani

    Joined:
    Aug 5, 2012
    Posts:
    423
    Hello. This is a good place to send some feedback about EasySave3 Beta?
    There is some quick issues which I found:

    1. In the start-up home window, links almost unreadable, they have dark blue color which is hard to read on dark grey background (if dark theme of Unity enabled in Pro version)

    2. I tried to save and load entire GameObject using
    ES3.Save<GameObject>("myGameObject", go);
    And material was not loaded, so the object have "magenta no material surface"

    3. I have an object and script attached to it. In this script I have a variable public GameObject target;
    If target = null and I will try to save this GameObject, the console will throw an error:
    UnassignedReferenceException: The variable target of TestClass has not been assigned.

    And also, if target will be != null, in that case console will throw another error:
    FormatException: Missing closing brace detected, as end of stream was reached before finding it.
     
  35. JoelAtMoodkie

    JoelAtMoodkie

    Joined:
    Oct 18, 2009
    Posts:
    914
    Hi there,

    Thanks for the feedback. We've only added the bare minimum for the GUI at the moment as we're working on core functionality first, but it will have suitable colours for the dark theme before release.

    Would you be able to email me a link to a basic project which replicates the UnassignedReferenceException error you're receiving? You can contact me at moodkie.com/contact.

    Also with regards to the missing material, I believe there might be a bug fix which solves this in the next version. If you email me, I'll send you the latest package to see if that fixes the issue. If not, I'll also need a repro project for this.

    With regards to the 'closing brace' error, it sounds like there's incomplete data in the file due to one of the previous errors you encountered. If you go to Window > Easy Save 3 > Tools, press Open Persistent Data Path and delete the file from there, it should fix the error.

    In the release version this won't happen as the file will only be written if no errors occurred, but during development we make it write the data anyway as it lets us see where it failed.

    All the best,
    Joel
     
    Artaani likes this.
  36. Artaani

    Artaani

    Joined:
    Aug 5, 2012
    Posts:
    423
    Also I have some general question \ suggestion which is probably related to both ES2 and ES3.

    One of the most important task in save loading it is saving and restoring instantiated prefabs and their links on another objects.

    ES3 will be able to save entire GameObjects, it is good.
    However, as far as I understood, ES3 just saves entire information about GameObject including all of him components and data inside them.

    For example if I will try save default Unity cube with some components attached to it, ES3 will save every component and every variable inside them, even if this variable will not be changed during runtime.

    That right?

    If so, it will fill the save file with a lot of unnecessary data and size of file will be too big. For example if we have prefab of weapon, and there is a variables such as "damage", " fire rate" etc which will not be changed during runtime - there is no necessary to save them.


    If I am correct, I would suggest to implement the next system:

    There will be a global class with the list of all prefabs of the game. And each prefab will have its unique ID.
    In that case, when user press Save. EasySave will save only prefab ID of each objects + some data which marked as "changeable" (can be changed during runtime), such as position or amount of ammo in the weapon.

    Seems like such approach will be much faster and will create save files of smaller size?
     
  37. JoelAtMoodkie

    JoelAtMoodkie

    Joined:
    Oct 18, 2009
    Posts:
    914
    Easy Save 3's ES3.Save<GameObject> method will save all supported Components on the GameObject.

    If you wish to save only specific Components on a GameObject, you can save the Components individually i.e. ES3.Save<MyComponentType> and load them into an existing instance using ES3.LoadInto<MyComponentType>.

    But it's already possible to choose which variables are saved for a given type. You can go to Window > Easy Save 3 > Types, select a type from the list, and manually select what variables you want to save for that type. Or deselect the ones you don't want to be saved.

    All the best,
    Joel
     
    Artaani likes this.
  38. Aiursrage2k

    Aiursrage2k

    Joined:
    Nov 1, 2009
    Posts:
    4,835
    Hello when I try to save a string using upload UploadRaw in the webgl it gives an error ("unity has reported an upload errror"). It works fine for upload texture, the str variable is json data
    yield return StartCoroutine(web.UploadRaw(str));
     
  39. JoelAtMoodkie

    JoelAtMoodkie

    Joined:
    Oct 18, 2009
    Posts:
    914
    Hi there,

    We've had no other reports of errors using UploadRaw, and it appears to be working fine for me. Please could you create a basic test script which replicates this and PM it to me so I can try to replicate it at my end?

    All the best,
    Joel
     
  40. Artaani

    Artaani

    Joined:
    Aug 5, 2012
    Posts:
    423
    Hello. A question about ES2.

    I noticed that loading process is relatively very slow due the fact that tag is saved as a string and the system need to find this string each time.
    I will clarify:

    For example I have a 1000 prefabs in the scene which should be saved.
    So I am creating a "for" loop with 1000 iterations:

    Code (CSharp):
    1. void SaveEasySave2 () {
    2.  
    3.  
    4.         ES2Writer    writer         = ES2Writer.Create ("D:/SaveFile.save");
    5.         ModuleCore[] AllModuleCores = FindObjectsOfType <ModuleCore> ();
    6.  
    7.  
    8.         writer.Write (AllModuleCores.Length ,"AmountOfObjects");
    9.  
    10.  
    11.         for (int i = 0; i < AllModuleCores.Length; i++) {
    12.          
    13.             writer.Write (AllModuleCores[i], i+"data");
    14.         }
    15.          
    16.  
    17.         writer.Save    ();
    18.         writer.Dispose ();
    19.     }
    I want to save them all in the same file. So I need to assign a tag for each of them. i+"data" Right?
    It is fast and okay.

    But when I need to load them using this code:

    Code (CSharp):
    1. void LoadEasySave2 () {
    2.  
    3.  
    4.         ES2Reader reader          = ES2Reader.Create ("D:/SaveFile.save");
    5.         int       AmountOfObjects = reader.Read <int> ("AmountOfObjects");
    6.  
    7.  
    8.         for (int i = 0; i < AmountOfObjects; i++) {
    9.          
    10.             int        PrefabID = reader.Read <int> (i+"PrefabID");
    11.             ModuleCore instance = Instantiate (Prefabs[PrefabID]) as ModuleCore;
    12.  
    13.             reader.Read <ModuleCore> (i+"data", instance);
    14.         }
    15.  
    16.         reader.Dispose ();
    17.     }
    The process will took approximately 1200 ms for 1000 objects. And I understood why. Because the system need to find a tag i+"data" each iteration.

    And it happens each time when I need to load a something with tag. For example there is two load operations per loop iteration in lines 10 and 13. As result entire loading process will took 2400 ms.

    I tried to compare performance with my own save load solution where I am using saving into object[] array, and in that case loading process took only 120 ms.

    So I want to ask, Is there a way to speed up this process in the ES2? Or maybe I am doing something wrong and if I want to save 1000 objects I need to use different approach?
     
  41. JoelAtMoodkie

    JoelAtMoodkie

    Joined:
    Oct 18, 2009
    Posts:
    914
    Hi there,

    In your case you should use the ES2Writer/ES2Reader sequentially rather than using tags, otherwise you're not removing the overhead of random access.

    Alternatively you could create an ES2Type for your ModuleCore class and save an array of them instead of saving them individually, which would provide the same performance benefit.

    The above methods don't require reflection either, so it's essentially the fastest away there is to serialise data.

    All the best,
    Joel
     
    Artaani likes this.
  42. Artaani

    Artaani

    Joined:
    Aug 5, 2012
    Posts:
    423
    joeltebbett
    Wow, ES2 is capably to do that, amazing! Sorry, I just read manual not carefully enough.
    Nice! The new method even faster than my own solution. Only 85 ms for 1000 objects. And the size of file also smaller. Great tool! Thanks for the help.
     
    hopeful likes this.
  43. JoelAtMoodkie

    JoelAtMoodkie

    Joined:
    Oct 18, 2009
    Posts:
    914
    You're welcome :)
     
  44. Aiursrage2k

    Aiursrage2k

    Joined:
    Nov 1, 2009
    Posts:
    4,835
    Okay I am not sure what the problem was, i think it was because i was using http://www. in the url I wrote my own php scripts to upload it and realized that was the issue
     
  45. JoelAtMoodkie

    JoelAtMoodkie

    Joined:
    Oct 18, 2009
    Posts:
    914
    Glad to hear you've fixed your problem. You might want to ask your server provider to modify your .htaccess file so that it accepts the www prefix to HTTP requests.

    All the best,
    Joel
     
  46. Nitrox32

    Nitrox32

    Joined:
    May 9, 2017
    Posts:
    161
    Hi Joel,

    I just bought ES2. I'm getting the error "CS0103 The name ES2 does not exist in the current context". I'm using monodevelop and unity 2017.3. I'm relativity new to Unity and Coding.
     
  47. Nitrox32

    Nitrox32

    Joined:
    May 9, 2017
    Posts:
    161
    I'm following the directions on your Basic Saving and Loading Guide on your site.
     
  48. JoelAtMoodkie

    JoelAtMoodkie

    Joined:
    Oct 18, 2009
    Posts:
    914
    Hi there,

    The error you're receiving signifies that Easy Save hasn't been imported into your project, because it can't find the Easy Save scripts. Please could you PM me the link to a project which replicates this error so I can check whether this is the case?

    All the best,
    Joel
     
  49. Vince_DD

    Vince_DD

    Joined:
    Jul 15, 2014
    Posts:
    8
    Hey Joel,

    I bought Easy Save today, works great so far. I've run into a small issue though: Once I start the scene and the "Easy Save 3 Manager" is added, all UI text turns black (see image). The color property of the text is still set correctly, but it shows up as black for some reason. When I stop the scene, the text still shows up as black. Once I save the scene after that though, it turns back to the correct color. Any idea what could be causing that? I've made a minimal working example that I can send you if you want, but it's literally just an otherwise empty scene with a GUI text on a Canvas.

    Best,
    Vincent
     

    Attached Files:

  50. JoelAtMoodkie

    JoelAtMoodkie

    Joined:
    Oct 18, 2009
    Posts:
    914
    Hi there,

    This appears to be a bug at Unity's end which sometimes happens when refreshing assets, as happens when you import an asset from the Asset Store.

    There's a solution in this post on the Unity forums: https://forum.unity.com/threads/all-ui- ... st-2289169

    All the best,
    Joel