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); } }
/// <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); }
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); }
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); } }
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; }