/// <summary> /// 添加DataModelBehaviour /// </summary> /// <param name="dataModelBehaviour"></param> public static void AddDataModel(int id, DataModelBehaviour dataModelBehaviour) { if (!AllDataModel.ContainsKey(id)) { AllDataModel.Add(id, dataModelBehaviour); } }
/// <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> /// 观察另一个对象并指明回调函数 /// </summary> /// <param name="obj"></param> /// <param name="callback"></param> public virtual void Watch(DataModelBehaviour obj, DelOnValueChanged callback) { if (obj.DataEntity == null) { throw new BindingException("The DataEntity is null."); } watchTable.Watch(obj.DataEntity, "*", callback); }
/// <summary> /// 观察另外一个对象 /// </summary> /// <param name="obj"></param> public virtual void Watch(DataModelBehaviour obj) { if (obj.DataEntity == null) { throw new BindingException("The DataEntity is null."); } watchTable.Watch(obj.DataEntity, "*", OnEvent); }
/// <summary> /// 绑定物体DataModelBehaviour的数据实体,如果不能获取,则抛出异常; /// </summary> /// <param name="observer"></param> /// <param name="subject"></param> public void Binding(DataModelBehaviour observer, BaseDataModelEntity subject) { if (observer != null && subject != null) { observer.Watch(subject); } else { throw new BindingException("observer or subject could not be found."); } }
/// <summary> /// 取消绑定物体,本函数中自动获取gameObject的DataModelBehaviour对象, /// 如果不能获取,则抛出异常; /// </summary> /// <param name="goObserver"></param> /// <param name="goSubject"></param> public void Unbinding(DataModelBehaviour observer, BaseDataModelEntity subject, string propertyPath) { if (observer != null && subject != null) { observer.Unwatch(subject, propertyPath); } else { throw new BindingException("observer or subject could not be found."); } }
/// <summary> /// 将动态生成的物体,注册到回放和还原系统当中 /// </summary> /// <param name="obj"></param> public static void RegisterPrefab(GameObject obj) { number += 1; if (obj.GetComponent <DataModelBehaviour>() != null) { DataModelBehaviour dataModel = obj.GetComponent <DataModelBehaviour>(); int id = DynamicIds.SetId(dataModel); } string sceneName = SceneManager.GetActiveScene().name; _sceneIdNameOfPrefab.Add(sceneName + "=" + number.ToString() + "=" + obj.name.Split('(')[0]); }
/// <summary> /// 获取对应ID的数据实体 /// </summary> /// <param name="objectID"></param> /// <returns></returns> public static BaseDataModelEntity GetEntity(int objectID) { DataModelBehaviour dm = null; AllDataModel.TryGetValue(objectID, out dm); if (dm != null) { return(dm.DataEntity); } else { return(null); } }
/// <summary> /// 绑定物体,本函数中自动获取gameObject的DataModelBehaviour对象, /// 如果不能获取,则抛出异常; /// </summary> /// <param name="goObserver"></param> /// <param name="goSubject"></param> public void Binding(GameObject goObserver, GameObject goSubject) { DataModelBehaviour observer = null; DataModelBehaviour subject = null; observer = goObserver.GetComponent <DataModelBehaviour>(); subject = goSubject.GetComponent <DataModelBehaviour>(); if (observer != null && subject != null) { observer.Watch(subject); } else { throw new BindingException("observer or subject could not be found."); } }
/// <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="obj"></param> public virtual void Unwatch(DataModelBehaviour obj) { watchTable.Unwatch(obj.DataEntity); }
/// <summary> /// 取消观察另外一个对象 /// </summary> /// <param name="obj"></param> public virtual void Unwatch(DataModelBehaviour obj, string propertyName) { watchTable.Unwatch(obj.DataEntity, propertyName); }
/// <summary> /// 重新watch一个数据实体对象 /// </summary> /// <param name="obj"></param> public virtual void ReWatch(DataModelBehaviour obj) { Unwatch(obj); Watch(obj); }
/// <summary> /// 观察另外一个对象 /// </summary> /// <param name="obj"></param> public override void Watch(DataModelBehaviour obj) { watchTable.Watch(obj.DataEntity, "*", OnModelValueChanged); }