// Copyright (c) Pixel Crushers. All rights reserved. using UnityEngine; using System; namespace PixelCrushers { /// /// Saves the active/inactive state of a GameObject. This component should be /// on a different GameObject that's guaranteed to be active, or it won't /// take effect. When applying data (i.e., setting active/inactive state), if /// it activates an inactive target, it will call ApplyData on the target's /// other savers. /// [AddComponentMenu("")] public class ActiveSaver : Saver { [Serializable] public class Data { public bool active; } [Tooltip("GameObject to watch.")] [SerializeField] private GameObject m_gameObjectToWatch; public GameObject gameObjectToWatch { get { return m_gameObjectToWatch; } set { m_gameObjectToWatch = value; } } private Data m_data = new Data(); public override string RecordData() { var value = (gameObjectToWatch != null) ? gameObjectToWatch.activeSelf : false; m_data.active = value; return SaveSystem.Serialize(m_data); } public override void ApplyData(string s) { if (gameObjectToWatch == null || string.IsNullOrEmpty(s)) return; var data = SaveSystem.Deserialize(s, m_data); if (data == null) return; m_data = data; var applyDataToOtherSavers = data.active && !gameObjectToWatch.activeSelf; if (!data.active) { gameObjectToWatch.BroadcastMessage("OnBeforeSceneChange", SendMessageOptions.DontRequireReceiver); gameObjectToWatch.BroadcastMessage("OnLevelWillBeUnloaded", SendMessageOptions.DontRequireReceiver); } gameObjectToWatch.SetActive(data.active); if (applyDataToOtherSavers) { var savers = gameObjectToWatch.GetComponentsInChildren(); for (int i = 0; i < savers.Length; i++) { var saver = savers[i]; if (saver == this || !saver.enabled) continue; saver.ApplyData(SaveSystem.currentSavedGameData.GetData(saver.key)); } } } } }