com.unity.uiextensions.nosa.../Scripts/Utilities/Serialization/ExampleScriptsAndClasses/TestScript.cs

82 lines
3.2 KiB
C#

using UnityEngine;
using UnityEngine.UI.Extensions;
public class TestScript : MonoBehaviour {
public string testString = "Hello";
public GameObject someGameObject;
public string someGameObject_id;
public TestClass testClass = new TestClass();
public TestClass[] testClassArray = new TestClass[2];
[DontSaveField] public Transform TransformThatWontBeSaved;//The [DontSaveField] attribute we wrote ourselves prevents the field from being included in the packed component data
public void OnSerialize() {
//This is an example of a OnSerialize method, called before a gameobject is packed into serializable form.
//In this case, the GameObject variable "someGameObject" and those in the testClass and testclass Array instances of TestClass should be reconstructed after loading.
//Since GameObject (and Transform) references assigned during runtime can't be serialized directly,
//we keep a seperate string variable for each GO variable that holds the ID of the GO instead.
//This allows us to just save the ID instead.
//This example is one way of dealing with GameObject (and Transform) references. If a lot of those occur in your project,
//it might be more efficient to go directly into the static SaveLoad.PackComponent method. and doing it there.
if(someGameObject != null && someGameObject.GetComponent<ObjectIdentifier>()) {
someGameObject_id = someGameObject.GetComponent<ObjectIdentifier>().id;
}
else {
someGameObject_id = null;
}
if(testClassArray != null) {
foreach(TestClass testClass_cur in testClassArray) {
if(testClass_cur.go != null && testClass_cur.go.GetComponent<ObjectIdentifier>()) {
testClass_cur.go_id = testClass_cur.go.GetComponent<ObjectIdentifier>().id;
}
else {
testClass_cur.go_id = null;
}
}
}
}
public void OnDeserialize() {
//Since we saved the ID of the GameObject references, we can now use those to recreate the references.
//We just iterate through all the ObjectIdentifier component occurences in the scene, compare their id value to our saved and loaded someGameObject id (etc.) value,
//and assign the component's GameObject if it matches.
//Note that the "break" command is important, both because it elimitates unneccessary iterations,
//and because continuing after having found a match might for some reason find another, wrong match that makes a null reference.
ObjectIdentifier[] objectsIdentifiers = FindObjectsOfType(typeof(ObjectIdentifier)) as ObjectIdentifier[];
if(string.IsNullOrEmpty(someGameObject_id) == false) {
foreach(ObjectIdentifier objectIdentifier in objectsIdentifiers) {
if(string.IsNullOrEmpty(objectIdentifier.id) == false) {
if(objectIdentifier.id == someGameObject_id) {
someGameObject = objectIdentifier.gameObject;
break;
}
}
}
}
if(testClassArray != null) {
foreach(TestClass testClass_cur in testClassArray) {
if(string.IsNullOrEmpty(testClass_cur.go_id) == false) {
foreach (ObjectIdentifier objectIdentifier in objectsIdentifiers) {
if(string.IsNullOrEmpty(objectIdentifier.id) == false) {
if(objectIdentifier.id == testClass_cur.go_id) {
testClass_cur.go = objectIdentifier.gameObject;
break;
}
}
}
}
}
}
}
}