Here's a link to an example of what I'm asking about
http://www.anbsoft.com/middleware/ezs/overview/
At around 2:50 it shows a list of variables each with a toggle button. I am wanting to know how you would create the boolean for each of those variables and save them. What I'm trying to do is recreate what EZ Game Saver does since I don't have $99 to just throw on it and I'd want it to be my own anyways.
SaveMe.cs
Make a GameObject and put this script on it
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class SaveMe : MonoBehaviour {
public Component[] components;
}
SaveMeEditor.cs
Make a folder in the main Assets folder named Editor and put this script in it
using UnityEngine;
using UnityEditor;
using System;
using System.Reflection;
[CustomEditor(typeof(SaveMe))]
public class SaveMeEditor : Editor {
public SaveMe saveMe;
void Awake() {
saveMe = target as SaveMe;
}
public override void OnInspectorGUI() {
saveMe.components = saveMe.GetComponents(typeof(Component));
int i = 0;
foreach(Component a in saveMe.components) {
Type type = a.GetType();
if(saveMe.components.Length > 0) {
GUI.color = Color.Lerp(new Color(.2f, 1, .2f), Color.white, (float)i / saveMe.components.Length);
}
GUILayout.Button(type.Name);
GUI.color = Color.white;
if(!(a == saveMe)) {
foreach(PropertyInfo p in type.GetProperties(BindingFlags.Public | BindingFlags.Instance)) {
if(IsSaveable(p.PropertyType)) {
GUILayout.BeginHorizontal();
GUILayout.BeginHorizontal();
EditorGUILayout.Toggle(false, GUILayout.ExpandWidth(false), GUILayout.MaxWidth(20));
GUILayout.Label("." + p.Name, GUILayout.ExpandWidth(false));
GUILayout.EndHorizontal();
GUILayout.Label(p.PropertyType.Name, GUILayout.ExpandWidth(false));
GUILayout.EndHorizontal();
}
}
}
i++;
}
}
bool IsSaveable(object variable) {
object a = variable;
return
a == typeof(bool)
|
a == typeof(int)
|
a == typeof(float)
|
a == typeof(double)
|
a == typeof(string)
|
a == typeof(Vector3)
|
a == typeof(Quaternion)
;
}
}
What you will see when you go back to the GameObject with the SaveMe script on it, you should see at least one button named Transform and a few variables listed. On the left side is a toggle button. The toggle button is what I need the booleans for. If the boolean is True then I want to be able to save that variable. If someone can give me some ideas of how I could do that I'd appreciate it.
I got it working.. mostly. It doesn't seem to notice variables that I add into my own scripts but oh well I'll worry about that later.
SaveMe.cs
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class SaveMe : MonoBehaviour {
public Component[] components;
public List<Foldout> foldout = new List<Foldout>();
public bool cFoldout = false;
public bool Contains(Component item) {
foreach(Foldout a in foldout) {
if(a.component.Equals(item)) { return true; }
}
return false;
}
[System.Serializable]
public class Foldout {
public Component component;
public bool componentEnabled = false;
public bool[] variableSavable = new bool[0];
public Foldout() { }
public Foldout(Component component) {
this.component = component;
}
}
}
SaveMeEditor.cs
using UnityEngine;
using UnityEditor;
using System;
using System.Reflection;
using System.Collections.Generic;
[CustomEditor(typeof(SaveMe))]
public class SaveMeEditor : Editor {
public SaveMe saveMe;
void Awake() {
saveMe = target as SaveMe;
}
public override void OnInspectorGUI() {
saveMe.components = saveMe.GetComponents(typeof(Component));
#region Add Components To List
string added = "Added - ";
foreach(Component a in saveMe.components) {
if(a != saveMe) {
if(!saveMe.Contains(a)){
added += "
" + a.GetType().Name + " ID - " + a.GetInstanceID();
saveMe.foldout.Insert(saveMe.foldout.Count, new SaveMe.Foldout(a));
}
}
}
if(added != "Added - ") {
Debug.Log(added);
}
#endregion
#region Remove Null Components From List
List<int> remove = new List<int>(saveMe.foldout.Count);
for(int n = 0; n < saveMe.foldout.Count; n++){
if(saveMe.foldout[n].component == null) {
remove.Add(n);
}
}
foreach(int r in remove) {
saveMe.foldout.RemoveAt(r);
}
#endregion
#region Draw Foldout Buttons
for(int i = 0; i < saveMe.foldout.Count; i++){
if(saveMe.foldout.Count > 1) {
GUI.color = Color.Lerp(new Color(.2f, 1, .2f), Color.white, (float)i / (float)(saveMe.foldout.Count - 1));
}
SaveMeGUI(saveMe.foldout*);*
*}*
*GUI.color = Color.white;*
*#endregion*
*#region Component Foldout*
*saveMe.cFoldout = EditorGUILayout.Foldout(saveMe.cFoldout, "Foldout");*
*if(saveMe.cFoldout) {*
*for(int f = 0; f < saveMe.foldout.Count; f++) {*
*EditorGUILayout.BeginHorizontal();*
*EditorGUILayout.PrefixLabel(saveMe.foldout[f].component.GetType().Name);*
*saveMe.foldout[f].componentEnabled = EditorGUILayout.Toggle(saveMe.foldout[f].componentEnabled);*
*EditorGUILayout.EndHorizontal();*
*}*
*}*
*#endregion*
*}*
*void SaveMeGUI(SaveMe.Foldout foldout) {*
*Type type = foldout.component.GetType();*
*if(GUILayout.Button(type.Name)) {*
*foldout.componentEnabled = !foldout.componentEnabled;*
*}*
*if(foldout.componentEnabled) {*
*GUI.color = Color.white;*
*//Get all variables*
*PropertyInfo[] propertyInfo = type.GetProperties(BindingFlags.Public | BindingFlags.Instance);*
*int fields = 0;*
*foreach(PropertyInfo b in propertyInfo) {*
*if(IsSaveable(b.PropertyType)) {*
*fields++;*
*}*
*}*
*if(foldout.variableSavable.Length != fields) {*
*Array.Resize<bool>(ref foldout.variableSavable, fields);*
*}*
*for(int i = 0; i < fields; i++) {*
_if(IsSaveable(propertyInfo*.PropertyType)) {*_
_*GUILayout.BeginHorizontal();*_
_*GUILayout.BeginHorizontal();*_
<em><em>foldout.variableSavable _= EditorGUILayout.Toggle(foldout.variableSavable*, GUILayout.ExpandWidth(false), GUILayout.MaxWidth(20));*_</em></em>
<em><em><em>_GUILayout.Label("." + propertyInfo*.Name, GUILayout.ExpandWidth(false));*_</em></em></em>
<em><em><em>_*GUILayout.EndHorizontal();*_</em></em></em>
<em><em><em><em>_GUILayout.Label(propertyInfo*.PropertyType.Name, GUILayout.ExpandWidth(false));*_</em></em></em></em>
<em><em><em><em>_*GUILayout.EndHorizontal();*_</em></em></em></em>
<em><em><em><em>_*}*_</em></em></em></em>
<em><em><em><em>_*}*_</em></em></em></em>
<em><em><em><em>_*}*_</em></em></em></em>
<em><em><em><em>_*}*_</em></em></em></em>
<em><em><em><em>_*bool IsSaveable(object variable) {*_</em></em></em></em>
<em><em><em><em>_*object a = variable;*_</em></em></em></em>
<em><em><em><em>_*return*_</em></em></em></em>
<em><em><em><em>_*a == typeof(bool)*_</em></em></em></em>
<em><em><em><em>_*|*_</em></em></em></em>
<em><em><em><em>_*a == typeof(int)*_</em></em></em></em>
<em><em><em><em>_*|*_</em></em></em></em>
<em><em><em><em>_*a == typeof(float)*_</em></em></em></em>
<em><em><em><em>_*|*_</em></em></em></em>
<em><em><em><em>_*a == typeof(string)*_</em></em></em></em>
<em><em><em><em>_*|*_</em></em></em></em>
<em><em><em><em>_*a == typeof(System.Enum)*_</em></em></em></em>
<em><em><em><em>_*|*_</em></em></em></em>
<em><em><em><em>_*a == typeof(Color)*_</em></em></em></em>
<em><em><em><em>_*|*_</em></em></em></em>
<em><em><em><em>_*a == typeof(Vector2)*_</em></em></em></em>
<em><em><em><em>_*|*_</em></em></em></em>
<em><em><em><em>_*a == typeof(Vector3)*_</em></em></em></em>
<em><em><em><em>_*|*_</em></em></em></em>
<em><em><em><em>_*a == typeof(Quaternion)*_</em></em></em></em>
<em><em><em><em>_*//|*_</em></em></em></em>
<em><em><em><em>_*//a == typeof(GameObject)*_</em></em></em></em>
<em><em><em><em>_*//|*_</em></em></em></em>
<em><em><em><em>_*//a == typeof(Component)*_</em></em></em></em>
<em><em><em><em>_*;*_</em></em></em></em>
<em><em><em><em>_*}*_</em></em></em></em>
<em><em><em><em>_*}*_</em></em></em></em>
<em><em><em><em>_*```*_</em></em></em></em>