/// <summary> /// 如果有场景变换,采用异步等待方式还原数据 /// </summary> /// <param name="name"></param> /// <returns></returns> System.Collections.IEnumerator LoadScene(string name) { if (!UnityEngine.SceneManagement.SceneManager.GetActiveScene().name.Equals(name)) { AsyncOperation asyncOperation = UnityEngine.SceneManagement.SceneManager.LoadSceneAsync(name); asyncOperation.allowSceneActivation = false; while (asyncOperation.isDone) { yield return(null); } asyncOperation.allowSceneActivation = true; //等待1秒,初始化结束(场景物体) yield return(new WaitForSeconds(1)); } //将所有物体设置为激活状态,随后在还原 RestoreSystem.ClearDataModel(); var allDataModels = Resources.FindObjectsOfTypeAll <DataModelBehaviour>(); foreach (var item in allDataModels) { if (item.hideFlags != (HideFlags.NotEditable | HideFlags.HideInHierarchy)) { RestoreSystem.AddDataModel(item.GetComponent <UniqueID>().UniqueId, item); item.gameObject.SetActive(true); } } //等待1秒,初始化结束(DataModel脚本) yield return(new WaitForSeconds(1)); //执行数据写入,设置自身状态 _restoreSystem.LoadStorageData(); StartCoroutine(RestoreSceneCallBack()); }
/// <summary> /// Unity Method /// </summary> private void Awake() { //初始化实验室管理交互接口 LabInterSystem.Init(); //当存储系统初始化时,即开始记录,设置开始记录时的当前帧数 if (!StartRecord) { RecordSystem.StartRecordFrame = Time.frameCount; StartRecord = true; } RestoreSystem.ClearDataModel(); //场景初始化是,将场景中当前的DataModel保存起来 var allDataModels = Resources.FindObjectsOfTypeAll <DataModelBehaviour>(); foreach (var item in allDataModels) { if (item.hideFlags != (HideFlags.NotEditable | HideFlags.HideInHierarchy)) { if (item.GetComponent <UniqueID>() == null) { Debug.Log("当前挂有DataModel的物体:[+" + item.name + "] 未添加 [UniqueID]"); } else { //报空对象,检查预制体问题 RestoreSystem.AddDataModel(item.GetComponent <UniqueID>().UniqueId, item); } } } }
/// <summary> /// 场景还原前,预制体准备操作 /// </summary> public override void LoadStorageData() { ReplayEntity data = (ReplayEntity)DataEntity; //多次点击 还原 if (data.sceneIdNameOfPrefab.Count == _sceneIdNameOfPrefab.Count) { return; } _sceneIdNameOfPrefab.Clear(); data.sceneIdNameOfPrefab.ForEach(p => _sceneIdNameOfPrefab.Add(p)); string sceneName = SceneManager.GetActiveScene().name; //生成所有的预制体 for (int i = 0; i < data.sceneIdNameOfPrefab.Count; i++) { //生成属于当前场景的预制体 if (data.sceneIdNameOfPrefab[i].Split('=')[0].Equals(sceneName)) { string name = data.sceneIdNameOfPrefab[i].Split('=')[2]; GameObject go = GetInstance(name, Vector3.zero); RegisterPrefab(go); DataModelBehaviour dataModel = go.GetComponent <DataModelBehaviour>(); if (dataModel != null) { RestoreSystem.AddDataModel(dataModel.DataEntity.objectID, dataModel); } } } }
/// <summary> /// 设置动态物体的唯一ID(同时设置UniqueID和objectID) /// </summary> /// <param name="obj"></param> /// <param name="inStorage">是否将生成的DataModel添加到存储系统中</param> /// <returns></returns> public static int SetId(GameObject obj, bool inStorage = true) { DataModelBehaviour data = obj.GetComponent <DataModelBehaviour>(); if (data == null) { Debug.Log("当前gameobject未挂载DataModelBehaviour"); return(0); } else { int id = Instance[indexOffect]; data.DataEntity.objectID = id; data.GetComponent <UniqueID>().UniqueId = Instance[indexOffect]; //下一id indexOffect += 1; if (inStorage) { RestoreSystem.AddDataModel(id, data); } return(id); } }
/// <summary> /// 销毁时清理watchTable /// </summary> private void OnDestroy() { //如果当前的物体是动态创建,则释放其使用的动态id DynamicIdSupport.ReleaseUsedId(DataEntity.objectID); watchTable.Dispose(); RestoreSystem.RemoveDataModel(DataEntity.objectID); }
/// <summary> /// Unity Method /// </summary> private void Start() { _restoreSystem = new RestoreSystem(); testFilePath = Path.Combine(Application.dataPath, testFilePath); filePath = Path.Combine(Application.dataPath, filePath); igcsPath = Path.Combine(Application.dataPath, igcsPath); _storgaeDataWrapper = new StorgaeDataWrapper(); InjectService.InjectInto(this); }
/// <summary> /// 设置动态物体的唯一ID(同时设置UniqueID和objectID) /// </summary> /// <param name="obj"></param> /// <param name="inStorage">是否将生成的DataModel添加到存储系统中</param> /// <returns></returns> public static int SetId(DataModelBehaviour obj, bool inStorage = true) { if (obj == null) { Debug.Log("当前DataModelBehaviour为空"); return(0); } else { int id = Instance[indexOffect]; obj.DataEntity.objectID = id; obj.GetComponent <UniqueID>().UniqueId = id; //下一id indexOffect += 1; if (inStorage) { RestoreSystem.AddDataModel(id, obj); } return(id); } }
/// <summary> /// 重新绑定实体对象 /// </summary> /// <param name="entity"></param> public void Rebinding(BaseDataModelEntity entity) { //如果绑定对象为空则返回 if (entity == null) { return; } //如果绑定对象为空实体则返回 if (entity is EmptyEntity) { return; } //取消绑定、Watch、初始化状态 RestoreSystem.RemoveDataModel(DataEntity.objectID); _bindingTable.Reset(); isViewInitialized = false; //重新设置实体对象并监听实体对象 this.DataEntity = entity; //当entity的ID为-1时表示对象为新创建对象, //此时需要生成一个ID if (entity.objectID == -1) { // this.DataEntity.objectID = ObjectIdentity.GenerateRuntimeId().id; //注册动态id,并添加到存储字典中 DynamicIds.SetId(this); } //重监听 ReWatch(this); //根据继承类属性和字段的Binding注解添加绑定条目 PropertyInfo[] pInfos = this.GetType().GetProperties(); FieldInfo[] fInfos = this.GetType().GetFields(); //获取公有属性 foreach (PropertyInfo info in pInfos) { Binding attr = info.GetCustomAttribute <Binding>(); if (attr == null) { continue; } _bindingTable.AddItem(this.DataEntity, attr.EntityPropertyName, info.GetValue(this), "Value"); } //获取公有字段 foreach (FieldInfo info in fInfos) { Binding attr = info.GetCustomAttribute <Binding>(); if (attr == null) { continue; } _bindingTable.AddItem(this.DataEntity, attr.EntityPropertyName, info.GetValue(this), "Value"); } //执行绑定过程 List <BindingItem> items = _bindingTable.GetItems(); foreach (BindingItem item in items) { this.watchTable.Watch(item.BindedView, item.BindedViewProperty, OnViewValueChanged); } }
/// <summary> /// 回放设置对应的属性值 /// </summary> /// <param name="item"></param> public void UpdateEntityValue(RecordItem item) { //获取实体对象实例 BaseDataModelEntity targetEntity = GetModelEntityByUuid(item.ObjectId); if (targetEntity == null) { targetEntity = RestoreSystem.GetEntity(item.ObjectId); } if (targetEntity == null) { return; } if (item.PropertyPath.Contains("#")) { UpdateWatchable(targetEntity, item.PropertyPath, item.NewValue); } //通过Property方式查找属性并设置属性值 PropertyInfo propertyInfo = null; propertyInfo = targetEntity.GetType().GetProperty(item.PropertyPath); if (propertyInfo != null) { if (propertyInfo.PropertyType == typeof(System.Single)) { System.Single _value = System.Convert.ToSingle(item.NewValue); propertyInfo.SetValue(targetEntity, _value); } else if (propertyInfo.PropertyType == typeof(System.Int32)) { System.Int32 _value = System.Convert.ToInt32(item.NewValue); propertyInfo.SetValue(targetEntity, _value); } else { propertyInfo.SetValue(targetEntity, item.NewValue, null); } return; } //通过Field方式查找属性并设置属性值 FieldInfo fieldInfo = targetEntity.GetType().GetField(item.PropertyPath); if (fieldInfo != null) { if (fieldInfo.FieldType == typeof(System.Single)) { System.Single _value = System.Convert.ToSingle(item.NewValue); fieldInfo.SetValue(targetEntity, _value); } else if (fieldInfo.FieldType == typeof(System.Int32)) { System.Int32 _value = System.Convert.ToInt32(item.NewValue); fieldInfo.SetValue(targetEntity, _value); } else { fieldInfo.SetValue(targetEntity, item.NewValue); } } }