1
\$\begingroup\$

I'm making a game using Unity, and I'd really appreciate knowing how to save and then load my player's position and rotation. I'm not very experienced at c#, so I only run into compiler errors when I try to do it by myself. I need to be able to save down to the thousandths, like 1.111. If it helps, My character is first-person so it's actually just a camera; and I won't be needing to save the scale, either. Unfortunately, I need to know how to add it into my "SaveLoad" script and not make a whole new script, because I already have Saving and Loading scripts, and I want to save and load attributes from one script and not multiple scripts. Sorry for the inconvenience! Here's my current SaveLoad script. It works fine:

 using UnityEngine;    // For Debug.Log, etc.
 
 using System.Text;
 using System.IO;
 using System.Runtime.Serialization.Formatters.Binary;
 
 using System;
 using System.Runtime.Serialization;
 using System.Reflection;
 
 // === This is the info container class ===
 [Serializable ()]
 public class SaveData : ISerializable {
 
   // === Values ===
   // Edit these during gameplay
   public bool foundKeyCard1 = false;
   public bool foundKeyCard2 = false;
   public bool foundKeyCard3 = false;
   public bool foundKeyCard4 = false;
   public bool foundKeyCard5 = false;
   public bool foundKeyCard6 = false;
   public bool foundKeyCard7 = false;
   public bool foundKeyCard8 = false;
   public bool foundKeyCard9 = false;
   public bool foundKeyCard10 = false;
   public bool foundCarKeys1 = false;
   public float expscore = 0;
   public int levelReached = 1;
   // === /Values ===
 
   // The default constructor. Included for when we call it during Save() and Load()
   public SaveData () {}
 
   // This constructor is called automatically by the parent class, ISerializable
   // We get to custom-implement the serialization process here
   public SaveData (SerializationInfo info, StreamingContext ctxt)
   {
     // Get the values from info and assign them to the appropriate properties. Make sure to cast each variable.
     // Do this for each var defined in the Values section above
     foundKeyCard1 = (bool)info.GetValue("foundKeyCard1", typeof(bool));
     foundKeyCard2 = (bool)info.GetValue("foundKeyCard2", typeof(bool));
     foundKeyCard3 = (bool)info.GetValue("foundKeyCard3", typeof(bool));
     foundKeyCard4 = (bool)info.GetValue("foundKeyCard4", typeof(bool));
     foundKeyCard5 = (bool)info.GetValue("foundKeyCard5", typeof(bool));
     foundKeyCard6 = (bool)info.GetValue("foundKeyCard6", typeof(bool));
     foundKeyCard7 = (bool)info.GetValue("foundKeyCard7", typeof(bool));
     foundKeyCard8 = (bool)info.GetValue("foundKeyCard8", typeof(bool));
     foundKeyCard9 = (bool)info.GetValue("foundKeyCard9", typeof(bool));
     foundKeyCard10 = (bool)info.GetValue("foundKeyCard10", typeof(bool));
     foundCarKeys1 = (bool)info.GetValue("foundCarKeys1", typeof(bool)); 
     expscore = (float)info.GetValue("expscore", typeof(float));
 
     levelReached = (int)info.GetValue("levelReached", typeof(int));
   }
 
   // Required by the ISerializable class to be properly serialized. This is called automatically
   public void GetObjectData (SerializationInfo info, StreamingContext ctxt)
   {
     // Repeat this for each var defined in the Values section
     info.AddValue("foundKeyCard1", (foundKeyCard1));
     info.AddValue("foundKeyCard2", (foundKeyCard2));
     info.AddValue("foundKeyCard3", (foundKeyCard3));
     info.AddValue("foundKeyCard4", (foundKeyCard4));
     info.AddValue("foundKeyCard5", (foundKeyCard5));
     info.AddValue("foundKeyCard6", (foundKeyCard6));
     info.AddValue("foundKeyCard7", (foundKeyCard7));
     info.AddValue("foundKeyCard8", (foundKeyCard8));
     info.AddValue("foundKeyCard9", (foundKeyCard9));
     info.AddValue("foundKeyCard10", (foundKeyCard10));
     info.AddValue("foundCarKeys1", (foundCarKeys1));
     info.AddValue("expscore", expscore);
     info.AddValue("levelReached", levelReached);
   }
 }
 
 // === This is the class that will be accessed from scripts ===
 public class SaveLoad {
 
   public static string currentFilePath = "SaveData.cjc";    // Edit this for different save files
 
   // Call this to write data
   public static void Save ()  // Overloaded
   {
     Save (currentFilePath);
   }
   public static void Save (string filePath)
   {
     SaveData data = new SaveData ();
 
     Stream stream = File.Open(filePath, FileMode.Create);
     BinaryFormatter bformatter = new BinaryFormatter();
     bformatter.Binder = new VersionDeserializationBinder(); 
     bformatter.Serialize(stream, data);
     stream.Close();
   }
 
   // Call this to load from a file into "data"
   public static void Load ()  { Load(currentFilePath);  }   // Overloaded
   public static void Load (string filePath) 
   {
     SaveData data = new SaveData ();
     Stream stream = File.Open(filePath, FileMode.Open);
     BinaryFormatter bformatter = new BinaryFormatter();
     bformatter.Binder = new VersionDeserializationBinder(); 
     data = (SaveData)bformatter.Deserialize(stream);
     stream.Close();
 
     // Now use "data" to access your Values
   }
 
 }
 
 // === This is required to guarantee a fixed serialization assembly name, which Unity likes to randomize on each compile
 // Do not change this
 public sealed class VersionDeserializationBinder : SerializationBinder 
 { 
     public override Type BindToType( string assemblyName, string typeName )
     { 
         if ( !string.IsNullOrEmpty( assemblyName ) && !string.IsNullOrEmpty( typeName ) ) 
         { 
             Type typeToDeserialize = null; 
 
             assemblyName = Assembly.GetExecutingAssembly().FullName; 
 
             // The following line of code returns the type. 
             typeToDeserialize = Type.GetType( String.Format( "{0}, {1}", typeName, assemblyName ) ); 
 
             return typeToDeserialize; 
         } 
 
         return null; 
     } 
 }
```
\$\endgroup\$
3
  • 3
    \$\begingroup\$ "I already have Saving and Loading scripts" - great. Show us! We can't help you modify code that we've never seen. If you get compiler errors, tell us the specific errors, and the code that caused them. We need these specifics to be able to give you useful, accurate answers. \$\endgroup\$ Commented Jan 25, 2021 at 22:20
  • \$\begingroup\$ Thank you so much! I didn't think I would ever be able to simply show someone my code and the compiler errors, and they'll fix it! \$\endgroup\$ Commented Jan 25, 2021 at 23:54
  • \$\begingroup\$ Since you’re using Unity, why not use JsonUtility to do your serialization for you? Also, I remember from long ago that you have to create serializable versions of quaternions and vector3 to save them, but that’s just a tiny bit of work to get going. Perhaps that’s been changed in more recent unity versions. \$\endgroup\$ Commented Feb 2, 2021 at 5:14

0

You must log in to answer this question.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.