x


How to store a boolean for each variable in a class

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.

more ▼

asked Apr 03 '11 at 12:15 AM

GibTreaty gravatar image

GibTreaty
199 2 4 6

(comments are locked)
10|3000 characters needed characters left

1 answer: sort voted first

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 += "\n" + 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[i]);
        }

        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[i].PropertyType)) {
                    GUILayout.BeginHorizontal();

                    GUILayout.BeginHorizontal();
                    foldout.variableSavable[i] = EditorGUILayout.Toggle(foldout.variableSavable[i], GUILayout.ExpandWidth(false), GUILayout.MaxWidth(20));
                    GUILayout.Label("." + propertyInfo[i].Name, GUILayout.ExpandWidth(false));
                    GUILayout.EndHorizontal();

                    GUILayout.Label(propertyInfo[i].PropertyType.Name, GUILayout.ExpandWidth(false));
                    GUILayout.EndHorizontal();
                }
            }
        }
    }

    bool IsSaveable(object variable) {
        object a = variable;

        return
            a == typeof(bool)
            |
            a == typeof(int)
            |
            a == typeof(float)
            |
            a == typeof(string)
            |
            a == typeof(System.Enum)
            |
            a == typeof(Color)
            |
            a == typeof(Vector2)
            |
            a == typeof(Vector3)
            |
            a == typeof(Quaternion)
            //|
            //a == typeof(GameObject)
            //|
            //a == typeof(Component)
            ;
    }
}
more ▼

answered Apr 03 '11 at 10:19 PM

GibTreaty gravatar image

GibTreaty
199 2 4 6

(comments are locked)
10|3000 characters needed characters left
Your answer
toggle preview:

Up to 2 attachments (including images) can be used with a maximum of 524.3 kB each and 1.0 MB total.

Follow this question

By Email:

Once you sign in you will be able to subscribe for any updates here

By RSS:

Answers

Answers and Comments

Topics:

x822
x455
x442
x249
x1

asked: Apr 03 '11 at 12:15 AM

Seen: 963 times

Last Updated: Apr 03 '11 at 12:15 AM