public ObjectState(GameObject go)
    {
        SavableObjectInfo info = go.GetComponent <SavableObjectInfo>();

        objectId = info.Id;
        saveState(go);
    }
    public int             spawnStateId;//the game state id in which this object was spawned

    public SavableObjectInfoData(SavableObjectInfo soi)
    {
        this.id            = soi.Id;
        this.prefabGUID    = soi.PrefabGUID;
        this.prefabAddress = soi.PrefabAddress;
        this.spawnStateId  = soi.spawnStateId;
    }
    public override void OnInspectorGUI()
    {
        DrawDefaultInspector();
        SavableObjectInfo info = (SavableObjectInfo)target;

        GUI.enabled = isPrefab(info.gameObject);
        if (GUILayout.Button("Autoset (Prefab Only)"))
        {
            info.autoset();
            EditorUtility.SetDirty(info);
        }
    }
Example #4
0
    /// <summary>
    /// Instantiates a GameObject so that it can be rewound.
    /// Only works on game objects that are "registered" to be rewound
    /// </summary>
    /// <param name="prefab"></param>
    /// <returns></returns>
    public static GameObject Instantiate(GameObject prefab)
    {
        //Checks to make sure it's rewindable
        bool isContainer = prefab.containsSavables();
        bool isSavable   = prefab.isSavable();

        if (!isContainer)
        {
            if (!isSavable)
            {
                throw new UnityException("Prefab " + prefab.name + " cannot be instantiated as a rewindable object because it does not have a RigidBody2D or a SavableMonoBehaviour.");
            }
            bool hasInfo = prefab.GetComponent <ObjectInfo>();
            if (!hasInfo)
            {
                throw new UnityException("Prefab " + prefab.name + " cannot be instantiated as a rewindable object because it does not have an ObjectInfo.");
            }
        }
        //Instantiate
        GameObject newObj   = GameObject.Instantiate(prefab);
        int        baseId   = (int)System.DateTime.Now.Ticks;
        string     spawnTag = "---" + baseId;

        newObj.name += spawnTag;
        if (isSavable)
        {
            SavableObjectInfo soi = newObj.GetComponent <SavableObjectInfo>();
            soi.Id           = getUniqueId(baseId, 0);
            soi.spawnStateId = Managers.Rewind.GameStateId;
            Managers.Object.addNewObject(newObj);
            Managers.Scene.registerObjectInScene(newObj);
        }
        //Container children
        if (isContainer)
        {
            ISavableContainer container = newObj.GetComponent <ISavableContainer>();
            int nextId = 1;
            container.Savables.ForEach(savable =>
            {
                savable.name         += spawnTag;
                SavableObjectInfo soi = savable.GetComponent <SavableObjectInfo>();
                soi.Id           = getUniqueId(baseId, nextId);
                soi.spawnStateId = Managers.Rewind.GameStateId;
                nextId++;
                Managers.Object.addNewObject(savable);
                Managers.Scene.registerObjectInScene(savable);
            });
        }
        //Return spawned object
        return(newObj);
    }
Example #5
0
    public static bool ensureSavableObjectsHaveObjectInfo()
    {
        List <GameObject> savables = new List <GameObject>();

        GameObject.FindObjectsOfType <SceneSavableList>().ToList()
        .ForEach(ssl => savables.AddRange(ssl.savables));
        //Missing ObjectInfo
        List <GameObject> missingInfo = savables
                                        .FindAll(go => !go.GetComponent <SavableObjectInfo>());

        missingInfo.ForEach(
            go => Debug.LogError(go.name + " does not have an SavableObjectInfo!", go)
            );
        //Null info in ObjectInfo
        List <GameObject> nullInfo = savables
                                     .FindAll(go =>
        {
            SavableObjectInfo info = go.GetComponent <SavableObjectInfo>();
            return(info && (info.PrefabGUID == null || info.PrefabGUID == ""));
        }
                                              );

        nullInfo.ForEach(
            go => Debug.LogError(go.name + " has SavableObjectInfo with missing prefabGUID!", go)
            );
        //Spawn State 0
        List <GameObject> spawn0 = savables
                                   .FindAll(go =>
        {
            SavableObjectInfo info = go.GetComponent <SavableObjectInfo>();
            return(info && info.spawnStateId != 0);
        }
                                            );

        spawn0.ForEach(
            go =>
        {
            SavableObjectInfo info = go.GetComponent <SavableObjectInfo>();
            Debug.LogWarning(
                go.name + " has non-zero spawn state; zeroing it out..."
                + info.spawnStateId,
                go
                );
            info.spawnStateId = 0;
            EditorUtility.SetDirty(info);
            EditorSceneManager.MarkSceneDirty(info.gameObject.scene);
        }
            );
        return(missingInfo.Count > 0 || nullInfo.Count > 0 || spawn0.Count > 0);
    }
Example #6
0
    public override void OnInspectorGUI()
    {
        DrawDefaultInspector();
        ObjectInfo info = (ObjectInfo)target;

        GUI.enabled = isPrefab(info.gameObject);
        if (GUILayout.Button("Convert to SavableObjectInfo (Prefab Only)"))
        {
            GameObject go = info.gameObject;
            DestroyImmediate(info, true);
            SavableObjectInfo soi = go.AddComponent <SavableObjectInfo>();
            soi.autoset();
            EditorUtility.SetDirty(soi);
        }
    }
Example #7
0
 private void registerDelegates()
 {
     //Scene delegates
     Managers.Scene.onSceneLoaded   += sceneLoaded;
     Managers.Scene.onSceneUnloaded += sceneUnloaded;
     Managers.Scene.onPauseForLoadingSceneIdChanged +=
         (id) => Managers.Time.setPause(Managers.Scene, id >= 0);
     Managers.Scene.onSceneObjectsLoaded += Managers.Rewind.LoadSceneObjects;
     Managers.Scene.onSceneObjectsLoaded += Managers.Object.LoadSceneObjects;
     Managers.Scene.onSceneLoaded        += (s) => Managers.Power.generateConnectionMap();
     Managers.Scene.onSceneUnloaded      += (s) => Managers.Power.generateConnectionMap();
     //Menu delegates
     MenuManager.onOpenedChanged +=
         (open) => Managers.Time.setPause(this, open);
     MenuManager.onOpenedChanged +=
         (open) =>
     {
         Managers.Camera.cameraMoveFactor = (open) ? 5 : 1.5f;
         Managers.Camera.cameraZoomSpeed  = (open) ? 5 : 1.5f;
     };
     //Time delegates
     Managers.Time.onPauseChanged += Managers.NPC.pauseCurrentNPC;
     Managers.Time.onPauseChanged += (paused) =>
                                     Cursor.lockState = (paused) ? CursorLockMode.None : CursorLockMode.Confined;
     Managers.Time.endGameTimer.onTimeFinished       += Managers.Rewind.RewindToStart;
     //Rewind delegates
     Managers.Rewind.onPreGameStateSaved += Managers.Object.onPreGameStateSaved;
     Managers.Rewind.onGameStateSaved    += Managers.Scene.updateSceneLoadersForward;
     Managers.Rewind.onRewindStarted     += processRewindStart;
     Managers.Rewind.onRewindFinished    += processRewindEnd;
     Managers.Rewind.onRewindFinished    += Managers.Object.LoadObjectsPostRewind;
     Managers.Rewind.onRewindFinished    += (gameStates, gameStateId) =>
     {
         if (gameStateId == 0)
         {
             Managers.File.saveToFile();
         }
     };
     //Object delegates
     Managers.Object.onObjectRecreated += Managers.Rewind.LoadObjectAndChildren;
     Managers.Object.onObjectRecreated +=
         (go, lastStateSeen) => Managers.Scene.registerObjectInScene(go);
     Managers.Object.onObjectRecreated +=
         (go, lastStateSeen) =>
     {
         //Don't load if it should actually not exist anymore
         SavableObjectInfo soi = go.GetComponent <SavableObjectInfo>();
         if (soi.spawnStateId > Managers.Rewind.GameStateId)
         {
             Debug.Log("Recreation of object " + go.name + "(" + soi.Id + ") " +
                       "is too late! Destroying permananetly.", go);
             //(it's possible for an object recreation to be finished
             //after it should have been rewound out of existence)
             Managers.Object.destroyAndForgetObject(go);
         }
         else
         {
             Debug.Log("Recreation of object " + go.name + "(" + soi.Id + ") " +
                       "is ok. GameState Id: " + Managers.Rewind.GameStateId, go);
         }
     };
     //File delegates
     Managers.File.onFileSave += Managers.Rewind.saveToFile;
     Managers.File.onFileSave += Managers.Object.saveToFile;
     Managers.File.onFileSave += Managers.Settings.saveSettings;
     Managers.File.onFileLoad += Managers.Rewind.loadFromFile;
     Managers.File.onFileLoad += Managers.Object.loadFromFile;
     Managers.File.onFileLoad += Managers.Settings.loadSettings;
     //NPC delegates
     Managers.NPC.onNPCSpeakingChanged += (speaking) => Managers.Music.Quiet = !speaking;
 }