public void RegisterLevelBuilderEvent(UserEditableObject[] ueos, LevelBuilderEventType type)
    {
        if (debug)
        {
            Debug.Log("<color=fff>Register</color> " + type);
        }
        List <LevelBuilderEventObject> lbeos = new List <LevelBuilderEventObject>();

        foreach (UserEditableObject ueo in ueos)
        {
            if (!TypeIsRegisterable(ueo))
            {
                continue;
            }
            if (!ueo.isSerializeableForClass)
            {
                continue;
            }
            lbeos.Add(new LevelBuilderEventObject(ueo, ueo.GetUuid(), JsonUtil.GetUeoBaseProps(new SimpleJSON.JSONClass(), ueo, SceneSerializationType.Class)));
            if (debug)
            {
                Debug.Log("....<color=fff>uuid</color>:" + ueo.GetUuid());
            }
        }
        if (lbeos.Count > 0)
        {
            LevelBuilderEvent ev = new LevelBuilderEvent(lbeos, type);
            pastEvents.Add(ev);
        }
    }
    public void Undo()
    {
        if (pastEvents.Count > 0)
        {
            LevelBuilderEvent ue = pastEvents[pastEvents.Count - 1];
            if (debug)
            {
                Debug.Log("<color=#9f9>Undo: " + ue.type + "</color> ueos:");
            }
            switch (ue.type)
            {
            case LevelBuilderEventType.Create:
                foreach (LevelBuilderEventObject lbeo in ue.lbeos)
                {
                    if (lbeo.ueo)
                    {
                        Destroy(lbeo.ueo.gameObject);
                    }
                }
                break;

            case LevelBuilderEventType.Delete:
                List <LevelBuilderEventObject> replacementGroup = new List <LevelBuilderEventObject>();

                foreach (LevelBuilderEventObject lbeo in ue.lbeos)
                {
                    if (debug)
                    {
                        Debug.Log("<color=5f5>Creating (undo)</color>: " + lbeo.uuid);
                    }
                    UserEditableObject ueo = LevelBuilderObjectManager.inst.PlaceObject(lbeo.N, SceneSerializationType.Class, lbeo.uuid);
                    replacementGroup.Add(new LevelBuilderEventObject(ueo, lbeo.uuid, JsonUtil.GetUeoBaseProps(new SimpleJSON.JSONClass(), ueo, SceneSerializationType.Class)));
                    ReconnectBrokenUuidsForUndeletedObjects(ueo, lbeo.uuid);
                }
                ue.lbeos = replacementGroup;

                break;

            case LevelBuilderEventType.Modified:
                foreach (LevelBuilderEventObject lbeo in ue.lbeos)
                {
//					Debug.Log("undo mod;"+kvp.Key.myName);
                    lbeo.ueo.SetProperties(lbeo.N);
                    lbeo.ueo.SetTransformProperties(lbeo.N);

//					JsonUtil.SetUeoTransformProps(kvp.key,	kvp.Value);
                }
                break;

            default: break;
            }
            futureEvents.Add(ue);
            pastEvents.Remove(ue);
        }
    }
    public void Redo()
    {
        if (futureEvents.Count > 0)
        {
            LevelBuilderEvent ue = futureEvents[futureEvents.Count - 1];
            if (debug)
            {
                Debug.Log("<color=#9f9>Redo: " + ue.type + "</color> ueos:");
            }
            switch (ue.type)
            {
            case LevelBuilderEventType.Create:
                List <LevelBuilderEventObject> replacementGroup = new List <LevelBuilderEventObject>();
                foreach (LevelBuilderEventObject lbeo in ue.lbeos)
                {
                    if (debug)
                    {
                        Debug.Log("<color=5f5>Creating (</color><color=44f>do</color>): " + lbeo.uuid);
                    }
                    UserEditableObject ueo = LevelBuilderObjectManager.inst.PlaceObject(lbeo.N, SceneSerializationType.Class, lbeo.uuid);
                    replacementGroup.Add(new LevelBuilderEventObject(ueo, ueo.GetUuid(), JsonUtil.GetUeoBaseProps(new SimpleJSON.JSONClass(), ueo, SceneSerializationType.Class)));
                    ReconnectBrokenUuidsForUndeletedObjects(ueo, ueo.GetUuid());
                }
                ue.lbeos = replacementGroup;
                break;

            case LevelBuilderEventType.Delete:
                foreach (LevelBuilderEventObject lbeo in ue.lbeos)
                {
                    if (lbeo.ueo)
                    {
                        Destroy(lbeo.ueo.gameObject);
                    }
                }
                break;

            case LevelBuilderEventType.Modified:
                foreach (LevelBuilderEventObject lbeo in ue.lbeos)
                {
                    lbeo.ueo.SetProperties(lbeo.N);
                    lbeo.ueo.SetTransformProperties(lbeo.N);
                }
                break;

            default: break;
//				Debug.Log("redoing properties of:"+ue.obj.name+", set prop to:"+ue.prop.ToString());
//				ue.obj.GetComponent<UserEditableObject>().SetProperties(ue.prop);
            }
            futureEvents.Remove(ue);
            pastEvents.Add(ue);
        }
    }