コード例 #1
0
        /// <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());
        }
コード例 #2
0
        /// <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);
                    }
                }
            }
        }
コード例 #3
0
        /// <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);
                    }
                }
            }
        }
コード例 #4
0
        /// <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);
            }
        }
コード例 #5
0
        /// <summary>
        /// 销毁时清理watchTable
        /// </summary>
        private void OnDestroy()
        {
            //如果当前的物体是动态创建,则释放其使用的动态id
            DynamicIdSupport.ReleaseUsedId(DataEntity.objectID);

            watchTable.Dispose();
            RestoreSystem.RemoveDataModel(DataEntity.objectID);
        }
コード例 #6
0
 /// <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);
 }
コード例 #7
0
 /// <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);
     }
 }
コード例 #8
0
        /// <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);
            }
        }
コード例 #9
0
        /// <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);
                }
            }
        }