using Newtonsoft.Json; using PublicTools.XMLDataBase; using ShadowStudio.Tool; using Studio.Scripts; using System; using System.Collections; using System.Collections.Generic; using System.IO; #if UNITY_EDITOR using UnityEditor; #endif using UnityEngine; using XRTool.UI; using XRTool.Util; namespace ShadowStudio.Model { /// /// 资源映射表 /// 读取,获取资源映射表 /// 按照id和类型建立资源映射。通过artid获取对应的artinfo /// 通过资源类型获取对应的artinfo /// 创建一个美术资源: /// public class ArtInfoMgr : Singleton { private string tableName; private TableInterface table; private bool isInit = false; /// /// 所有的资源列表,此列表当前服务器和本地各有一份。后期读取服务器列表数据 /// private List artInfoList; /// /// 资源id对应的资源信息 /// private Dictionary artInfoMap; private Dictionary otherArtInfoMap; /// /// 资源类型对应的资源列表 /// private Dictionary> artInfoTypeMap; /// /// 组件的集合 /// private Dictionary artComponentMap = new Dictionary(); /// /// 资源的引用 /// private Dictionary resArtMap; /// /// 资源对应的工具类 /// private Dictionary artHandlerMap = new Dictionary(); /// /// 对应资源类型的容器,例如视频播放器,图片浏览器,模型浏览器 /// private Dictionary> artContainerMap = new Dictionary>(); /// /// 数据初始化 /// public event Action InitComplete; /// /// 对应资源存储的最大的id /// 本地生成goods的一种辅助方案,此方案即将移除 /// 此方案已移除,请勿使用2020-09-14 /// private Dictionary goodsIdMap = new Dictionary(); /// /// 使用变量缓存服务器下发的物体信息数据 /// private GoodsInfo serverCacheData = new GoodsInfo(); /// /// 此为上传至服务器的物体的数据缓存,理论上上传多个物体列表信息,实际处理中每次只会上传一条物体的同步信息 /// private List goodsDataList = new List(); /// /// 创建容器的事件,某个容器被上传的事件 /// public event Action ContainerCreate; /// /// 删除容器,某个容器被删除的事件 /// public event Action ContainerDel; /// /// 容器被选中或者容器非选中状态的事件 /// public static Action ContainerSelect; /// /// 编辑菜单的名称 /// private string ModelEditBtnGroup = "ModelEditBtnDlg"; public ArtEditorContainer ModelEditBtn; /// /// 容器缓存 /// 非即时同步容器缓存 /// private Dictionary containerCache = new Dictionary(); public event Action UserChange; public void AddCacheContainer(string id, ArtContainer container) { if (!ContainerCache.ContainsKey(id)) { ContainerCache.Add(id, container); } } public void SetContainerSelect(ArtContainer container, bool isSelect) { ContainerSelect?.Invoke(container, isSelect); } public bool IsSingleMan() { if (GameNode.Instance) { return GameNode.Instance.UserMap == null || GameNode.Instance.UserMap.Count < 2; } return true; } public void RemoveArtInfo(List resModelList) { for (int i = 0; i < resModelList.Count; i++) { string artid = "ArtId_" + resModelList[i].name; table.DeleteData(artid); } } /// /// 将数据添加至xml /// /// /// /// public void AddArtInfo(List resModelList, ArtType artType, InstaceType references, bool isForceUpdate, string url = "") { if (table == null) { if (BuildConfigMgr.Instance.IsInit) { ReadArtInfo(Path.Combine(ResourcesManager.LocalPath, BuildConfig.Instance.artInfoPath)); } } if (table == null) { UnityLog.Instance.Log("Read ArtInfo error"); } if (ArtInfoList == null) { ArtInfoList = new List(); } for (int i = 0; i < resModelList.Count; i++) { UnityEngine.Object obj = resModelList[i]; string artid = "ArtId_" + obj.name; if (isForceUpdate || !ArtInfoContains(artid)) { ArtInfo info = new ArtInfo(); info.ArtId = artid; info.ArtName = obj.name; info.ArtType = artType; info.Distance = 1f; ///Icon info.Icon = "ArtIcon/" + artType + "/" + obj.name; info.InstaceType = references; info.Size = 1; if (artType == ArtType.Prefab) { info.Distance = (obj as GameObject).transform.localPosition.z; info.Size = (obj as GameObject).transform.localScale.x; } if (references == InstaceType.References) { info.Url = url; } else if (references == InstaceType.ResourceLoad) { #if UNITY_EDITOR string path = AssetDatabase.GetAssetPath(obj); int index = path.LastIndexOf("Resources"); path = path.Substring((index += "Resources".Length + 1), path.Length - index - 1); path = path.Replace(Path.GetExtension(path), ""); info.Url = path; #endif } info.Version = Application.version; table.InsertData(info); if (!ArtInfoContains(artid)) { ArtInfoList.Add(info); } } } table.Save(); } public bool ArtInfoContains(string artId) { for (int i = 0; i < ArtInfoList.Count; i++) { if (ArtInfoList[i].ArtId == artId) { return true; } } return false; } public bool IsInit { get => isInit; set => isInit = value; } public List ArtInfoList { get => artInfoList; set => artInfoList = value; } public Dictionary ContainerCache { get => containerCache; set => containerCache = value; } public Dictionary OtherArtInfoMap { get { if (otherArtInfoMap == null) { otherArtInfoMap = new Dictionary(); } return otherArtInfoMap; } } /// /// 房间内物体的映射 /// 房间id与对应的物体资源映射 /// public void LoadModelEditBtn() { if (!ModelEditBtn) { var tmp = Resources.Load(ModelEditBtnGroup); if (tmp) { ModelEditBtn = GameObject.Instantiate(tmp); GameNode.Instance.SetParent(ObjNode.WorldCanvas, ModelEditBtn.transform, Vector3.zero, Vector3.zero, Vector3.one * 0.001f, false); ModelEditBtn.gameObject.SetActive(false); } } } public ArtInfoMgr() { var artResList = Resources.LoadAll("ArtConf"); resArtMap = new Dictionary(); if (artResList != null) { for (int i = 0; i < artResList.Length; i++) { resArtMap.Add(artResList[i].name, artResList[i]); } } var containers = Resources.LoadAll("Container"); if (containers != null) { for (int i = 0; i < containers.Length; i++) { var container = containers[i].GetComponent(); if (container != null) { if (!artContainerMap.ContainsKey(container.GetArtType())) { List list = new List(); list.Add(container); artContainerMap.Add(container.GetArtType(), list); } else { List list = artContainerMap[container.GetArtType()]; list.Add(container); } } } } var components = Resources.LoadAll("Container/Component"); if (components != null) { for (int i = 0; i < components.Length; i++) { var component = containers[i].GetComponent(); if (component != null) { if (!artComponentMap.ContainsKey(containers[i].name)) { artComponentMap.Add(containers[i].name, component); } } } } //if (BuildConfigMgr.Instance.IsInit) //{ // ReadArtInfo(Path.Combine(ResourcesManager.LocalPath, BuildConfig.Instance.artInfoPath)); //} else { UnityLog.Instance.LogError("配置文件丢失!"); } WSHandler.Room.OnBroadcastGood += SyncGoods; ContainerSelect += OnContainerSelect; } public void ListenUser() { if (ShowViewMgr.Instance) { ShowViewMgr.Instance.OnUserChange -= OnUserChange; ShowViewMgr.Instance.OnUserChange += OnUserChange; } else { ShowViewMgr.InitComplte += () => { if (ShowViewMgr.Instance) { ShowViewMgr.Instance.OnUserChange -= OnUserChange; ShowViewMgr.Instance.OnUserChange += OnUserChange; } }; } } public void ListenPage() { if (ShowViewMgr.Instance) { ShowViewMgr.Instance.OnRoomPageChange -= OnChangePage; ShowViewMgr.Instance.OnRoomPageChange += OnChangePage; } else { ShowViewMgr.InitComplte += () => { if (ShowViewMgr.Instance) { ShowViewMgr.Instance.OnRoomPageChange -= OnChangePage; ShowViewMgr.Instance.OnRoomPageChange += OnChangePage; } }; } } private void OnContainerSelect(ArtContainer container, bool isSelect) { if (container.GetGoodsInfo().art_id == "ArtId_PlayerView") { return; } if (!ModelEditBtn) { LoadModelEditBtn(); } if (ModelEditBtn) { if (ModelEditBtn.gameObject.activeSelf != isSelect) { ModelEditBtn.gameObject.SetActive(isSelect); } if (isSelect) { ModelEditBtn.SetTarget(container, false); } } if (ArtMoreEditor.Instance) { if (isSelect) { ArtMoreEditor.Instance.SetTarget(container, false); } } } /// /// 读取美术资源 /// /// private void ReadArtInfo(string path) { //languageIndex = SystemSettingMgr.Instance.settings.Language; tableName = typeof(ArtInfo).Name; #if UNITY_EDITOR || !UNITY_ANDROID table = XSql.Instance.OpenTable(path, tableName, ".xml", true); OpenTable(); #else string fullPath = Path.Combine(path, tableName + ".xml"); GameNode.Instance.StartCoroutine(XSql.Instance.ReadServerData(fullPath, (List packList) => { InitPackage(packList); })); #endif } public void OpenLocalData() { ReadArtInfo(Path.Combine(ResourcesManager.LocalPath, BuildConfig.Instance.artInfoPath)); } private void OpenTable() { if (!table.Open()) { table.Create(tableName); UnityLog.Instance.Log("create table" + tableName); } var list = table.FindAllData(); if (list != null) { for (int i = 0; i < list.Count; i++) { //list[i].ArtType = CommonMethod.getArtType((int)list[i].ArtType); } } //table.Save(); //languagePackList = table.FindAllData(); InitPackage(list); } /// /// 初始化包 /// /// public void InitPackage(List lists) { #if UNITY_EDITOR for (int i = 0; i < lists.Count; i++) { UnityLog.Instance.Log("InitPackage:" + JsonConvert.SerializeObject(lists[i])); } //if (DataConfMgr.Instance.TableHelper == null) //{ // DataConfMgr.Instance.OpenData(Application.persistentDataPath); //} //if (!DataConfMgr.Instance.TableHelper.isInit) //{ // DataConfMgr.Instance.OpenTable("ArtId"); //} //for (int i = 0; i < lists.Count; i++) //{ // DataConfMgr.Instance.TableHelper.AddData(lists[i],false); //} //DataConfMgr.Instance.TableHelper.SaveData(); #endif ArtInfoList = lists; if (ArtInfoList == null || ArtInfoList.Count < 1) { UnityLog.Instance.LogError("美术资源不存在!"); #if UNITY_EDITOR //AddDefaultArt(ArtType.Model); //InitPackage(ArtInfoList); #endif return; } else { if (artInfoMap == null) { artInfoMap = new Dictionary(); } if (artInfoTypeMap == null) { artInfoTypeMap = new Dictionary>(); } for (int i = 0; i < ArtInfoList.Count; i++) { if (!artInfoMap.ContainsKey(ArtInfoList[i].ArtId)) { artInfoMap.Add(ArtInfoList[i].ArtId, ArtInfoList[i]); UnityLog.Instance.Log(ArtInfoList[i].Url, 3); } if (artInfoTypeMap.ContainsKey(ArtInfoList[i].ArtType)) { List list = artInfoTypeMap[ArtInfoList[i].ArtType]; if (list != null && !list.Contains(ArtInfoList[i])) { list.Add(ArtInfoList[i]); } } else { List list = new List(); list.Add(ArtInfoList[i]); artInfoTypeMap.Add(ArtInfoList[i].ArtType, list); } } } IsInit = true; InitComplete?.Invoke(); } /// /// 添加Unity基本资源到文本 /// public void AddDefaultArt(ArtType artType) { if (ArtInfoList == null) { ArtInfoList = new List(); } if (artType == ArtType.Model) { foreach (PrimitiveType primitive in Enum.GetValues(typeof(PrimitiveType))) { ArtInfo info = new ArtInfo(); info.ArtId = "ArtId_" + (int)primitive; info.ArtName = primitive.ToString(); info.ArtType = ArtType.Model; info.Distance = 1f; ///Icon info.Icon = "PrimitiveType/" + primitive.ToString(); info.InstaceType = InstaceType.UnityBase; info.Size = 1; info.Url = "" + (int)primitive; info.Version = Application.unityVersion; table.InsertData(info); ArtInfoList.Add(info); } } else { ArtInfo info = new ArtInfo(); info.ArtId = "ArtId_GameObject"; info.ArtName = "GameObject"; info.ArtType = ArtType.Prefab; info.Distance = 1f; ///Icon info.Icon = ""; info.InstaceType = InstaceType.UnityBase; info.Size = 1; info.Url = "New"; info.Version = Application.unityVersion; table.InsertData(info); ArtInfoList.Add(info); } table.Save(); } /// /// 根据资源id获取对应的资源 /// /// /// public ArtInfo GetArtInfo(string artId) { if (IsInit && artInfoMap.ContainsKey(artId)) { return artInfoMap[artId]; } return null; } /// /// 根据资源id获取对应的资源 /// /// /// public List GetArtInfoList(ArtType artType) { if (IsInit)// { if (artInfoTypeMap.ContainsKey(artType)) { return artInfoTypeMap[artType]; } List tmp = new List(); foreach (var item in artInfoTypeMap) { ///包含此key if ((item.Key & artType) == item.Key) { tmp.AddRange(item.Value); } } artInfoTypeMap.Add(artType, tmp); return tmp; } return null; } ///// ///// 根据资源id获取对应的资源 ///// ///// ///// //public List GetArtInfoList(ArtType[] artType) //{ // if (IsInit)// // { // List ArtInfoList = new List(); // for (int i = 0; i < artType.Length; i++) // { // if (artInfoTypeMap.ContainsKey(artType[i])) // { // ArtInfoList.AddRange(artInfoTypeMap[artType[i]]); // } // } // return ArtInfoList; // } // return null; //} /// /// 根据资源id获取对应的资源 /// /// /// public List GetArtInfoListSingle(ArtType artType) { if (IsInit)// { return artInfoTypeMap[artType]; } return null; } /// /// 创建一个资源ArtHandler,注意内存回收 /// /// public ArtHandler CreateArtHandler(ArtInfo art, string containerName = "") { if (string.IsNullOrEmpty(containerName)) { containerName = art.ContainerName; } if (artHandlerMap.ContainsKey(art)) { return artHandlerMap[art]; } ArtHandler handler = new ArtHandler(); handler.SetData(art, containerName); artHandlerMap.Add(art, handler); return handler; } /// /// 删除资源帮助类ArtHandler /// /// public void DestrorArtHandler(ArtInfo art) { if (artHandlerMap.ContainsKey(art)) { var handler = artHandlerMap[art]; handler = null; artHandlerMap.Remove(art); } } /// /// 实例化组件 /// /// /// public ArtComponent InstanceComponent(string componentName) { if (artComponentMap != null && artComponentMap.ContainsKey(componentName)) { ArtComponent component = artComponentMap[componentName]; var tmp = GameObject.Instantiate(component.GetInstace()); return tmp.GetComponent(); } return null; } /// /// 实例化出一个容器 /// /// /// public ArtContainer CreateContainer(ArtType artType, string containerName = "") { if (artContainerMap != null && artContainerMap.ContainsKey(artType)) { var containerList = artContainerMap[artType]; if (containerList != null) { ArtContainer container = null; if (containerList.Count == 1) { container = containerList[0]; } else { for (int i = 0; i < containerList.Count; i++) { if (containerList[i].GetInstace().name == containerName) { container = containerList[i]; break; } } } if (container != null) { var tmp = GameObject.Instantiate(container.GetInstace()); return tmp.GetComponent(); } } } return null; } /// /// 获取对应的配置文件 /// /// /// public ArtResConf GetResConf(string resName) { if (resArtMap.ContainsKey(resName)) { return resArtMap[resName]; } UnityLog.Instance.LogError(resName + " is not at resArtMap"); return null; } /// /// 物品的自增id设计 /// /// public int GetGoodsId(ArtInfo info) { int id = 1; if (goodsIdMap.ContainsKey(info)) { id = goodsIdMap[info] + 1; goodsIdMap[info] = id; } else { goodsIdMap.Add(info, id); } return id; } /// /// 同步物体: /// 创建物体时,接收到广播消息时的数据同步都调用此方法 /// /// 用户id,物体的创建者 /// 美术资源id /// 物体名称 /// 物体额外信息 /// 物体id /// 物体的姿态信息 public void SyncGoods(int rid, int status, string art_id, string goods_name, string goods_extended, int id, string goods_info) { serverCacheData.rid = rid; serverCacheData.art_id = art_id; serverCacheData.goods_name = goods_name; serverCacheData.goods_extended = goods_extended; serverCacheData.id = id; serverCacheData.goods_info = goods_info; serverCacheData.status = status; SyncGoods(serverCacheData); } public void SyncGoods(List goodDataList) { if (goodDataList != null) { for (int i = 0; i < goodDataList.Count; i++) { SyncGoods(goodDataList[i]); } } } /// /// 同步物体数据 /// 服务器同步或者翻页时同步,服务器同步时开始缓存数据 /// 翻页时同步不添加缓存数据 /// /// /// public void SyncGoods(GoodsInfo goodData, bool isServer = true) { if (GameNode.Instance.GoodsContainerMap == null) { GameNode.Instance.GoodsContainerMap = new Dictionary(); } ArtContainer container = null; bool isCreate = false; if (SynUser(goodData)) { container = GameNode.Instance.UserMap[goodData.art_id].Container; } else if (goodData.id != 0) { ///先检查此数据是否在此页面 ///如果数据不在当前页,则只缓存起来 ///如果在当前页,则缓存后实例化进行同步 ///如果不是服务器的数据,仅同步设置,不缓存数据 if (isServer && goodData.scene_id > 0) { if (!GameNode.Instance.PageGoods.ContainsKey(goodData.id)) { GameNode.Instance.PageGoods.Add(goodData.id, goodData); } else { GameNode.Instance.PageGoods[goodData.id] = goodData; } if (!GameNode.Instance.PageGoodsId.ContainsKey(goodData.scene_id)) { var list = new List(); list.Add(goodData.id); if (goodData.art_id != "ArtId_GameObject") { GameNode.Instance.AddGoodData(goodData); } GameNode.Instance.PageGoodsId.Add(goodData.scene_id, list); } else { var list = GameNode.Instance.PageGoodsId[goodData.scene_id]; if (list == null) { list = new List(); } if (!list.Contains(goodData.id)) { list.Add(goodData.id); if (goodData.art_id != "ArtId_GameObject") { GameNode.Instance.AddGoodData(goodData); } } } if (goodData.scene_id != CommonMethod.currentScene.Id) { return; } } ///对象已存在,进行同步 if (GameNode.Instance.GoodsContainerMap.ContainsKey(goodData.id)) { container = GameNode.Instance.GoodsContainerMap[goodData.id]; } else { //Debug.LogError(" 请求物品信息===:" + goodData.art_id); ArtInfo info = GetArtInfo(goodData.art_id); if (info == null) { if (OtherArtInfoMap.ContainsKey(goodData.art_id)) { info = OtherArtInfoMap[goodData.art_id]; } else { HomeProxy.Instance.GetArtInfoDetailByArtID(goodData.art_id, (artInfo) => { //Debug.LogWarning("回包信息 goodData.art_id "+ goodData.art_id+" "+artInfo.AID+"QQQ" + artInfo.ArtId + "UUU" + artInfo.Url + "RRR" + artInfo.ArtType); if (goodData.art_id == artInfo.ArtId) { //Debug.LogWarning("确认回包信息"); if (!OtherArtInfoMap.ContainsKey(goodData.art_id)) { info = artInfo; if (info != null) { //Debug.LogWarning($"添加数据到字典 key:{goodData.art_id} value:{info.ArtId} {info.ArtName} {info.ArtType}"); OtherArtInfoMap.Add(goodData.art_id, info); SyncGoods(goodData, isServer); //UnityLog.Instance.LogError("创建完毕 find artinfo:" + goodData.art_id + "info" + info.ArtId); return; } else { UnityLog.Instance.LogError("Error find artinfo:" + goodData.art_id); } } } }); } } if (info != null) { ///容器缓存 if (ContainerCache.ContainsKey(goodData.art_id)) { container = ContainerCache[goodData.art_id]; ContainerCache.Remove(goodData.art_id); } else { ArtHandler handler = CreateArtHandler(info); //Debug.LogError($"创建 info aid {info.AID } artid {info.ArtId} InstaceType {info.InstaceType} handler {handler.Instancer}"); container = handler.CreateArt(); } GameNode.Instance.GoodsContainerMap.Add(goodData.id, container); isCreate = true; } else { UnityLog.Instance.LogError(goodData.art_id); } } } try { if (container != null && container.GetInstace()) { container.TransferSyn(goodData, goodData.status == (int)TransferState.Doing); if (isCreate) { ContainerCreate?.Invoke(container); } } } catch { UnityLog.Instance.LogError("SyncGoods Error:" + JsonConvert.SerializeObject(goodData)); ///某个物体可能被删掉了 ///此种情况不在处理 } } //Dictionary form; //Dictionary header; ///// ///// 读取资源信息 ///// ///// //public IEnumerator ReqOtherArtInfo(string artId, Action onReadComplete) //{ // if (header == null) // { // header = new Dictionary(); // header.Add("Content-Type", "application/x-www-form-urlencoded"); // } // if (form == null) // { // form = new Dictionary(); // form.Add("action", ""); // } // yield return 0; //} /// /// 同步用户 /// /// /// private bool SynUser(GoodsInfo goodData) { if (GameNode.Instance.UserMap == null) { GameNode.Instance.UserMap = new Dictionary(); } if (string.IsNullOrEmpty(goodData.art_id)) { return false; } return GameNode.Instance.UserMap.ContainsKey(goodData.art_id); } /// /// 删除物体 /// 可能由用户主动删除,主动删除传参true.删除相关的数据缓存 /// 翻页时是被动删除。被动删除不移除相关的数据缓存 /// /// 物体的id /// 是否真实删除,默认真实删除 public void GoodsDelSync(int id, bool isRealDel = true) { if (GameNode.Instance.GoodsContainerMap == null) { GameNode.Instance.GoodsContainerMap = new Dictionary(); } ArtContainer container = null; ///对象已存在,进行同步 if (GameNode.Instance.GoodsContainerMap.ContainsKey(id)) { container = GameNode.Instance.GoodsContainerMap[id]; //if (ModelEditBtn) //{ // ModelEditBtn.SetTarget(container, true); //} if (ArtMoreEditor.Instance) { ArtMoreEditor.Instance.SetTarget(container, true); } ContainerDel?.Invoke(container); if (container != null) { container.DestroyArt(); } GameNode.Instance.GoodsContainerMap.Remove(id); } ///真实删除 if (isRealDel) { ///删除物体的id ///先查找物体id对应的Goods if (GameNode.Instance.PageGoods.ContainsKey(id)) { ///获得Goods var good = GameNode.Instance.PageGoods[id]; ///查找页对应的物体的id if (GameNode.Instance.PageGoodsId.ContainsKey(good.scene_id)) { ///获取页对应的id列表,并 var list = GameNode.Instance.PageGoodsId[good.scene_id]; if (list != null && list.Contains(id)) { list.Remove(id); if (good.art_id != "ArtId_GameObject") { GameNode.Instance.RemoveGoodData(good); } } } GameNode.Instance.PageGoods.Remove(id); ContainerDel?.Invoke(null); } } } public void SendGoodsTransfer(GoodsInfo info) { goodsDataList.Add(info); WSHandler.Room.BroadcastGood(goodsDataList); goodsDataList.Clear(); } public void SendTransfer(GoodsInfo info) { goodsDataList.Add(info); WSHandler.Room.TransmitGood(goodsDataList); goodsDataList.Clear(); } /// /// 当新用户进入时的事件 /// /// public void OnUserChange(List userList, bool isJoin) { if (GameNode.Instance.UserMap == null) { GameNode.Instance.UserMap = new Dictionary(); } if (userList != null) { for (int i = 0; i < userList.Count; i++) { if (GameNode.Instance.UserMap.ContainsKey(userList[i].PeerId)) { if (isJoin) { continue; } else { var container = GameNode.Instance.UserMap[userList[i].PeerId]; container.StopSyn(); container.DestroyArt(); UserChange?.Invoke(userList[i].PeerId, false); GameNode.Instance.UserMap.Remove(userList[i].PeerId); } } else { if (isJoin) { ArtInfo info = GetArtInfo(PlayerContainer.userArtId); if (info != null) { //string cName = info.ContainerName; //if (string.IsNullOrEmpty(cName)) //{ // cName = PlayerContainer.containerName; //} //ArtHandler handler = CreateArtHandler(info, PlayerContainer.containerName); ArtHandler handler = CreateArtHandler(info); var container = handler.CreateArt(); if (container != null) { if (container.ArtComponent != null && container.ArtComponent.GetInstace()) { if (container.ArtComponent is PlayerContainer) { (container.ArtComponent as PlayerContainer).SetPeer(userList[i]); GameNode.Instance.UserMap.Add(userList[i].PeerId, container.ArtComponent as PlayerContainer); UserChange?.Invoke(userList[i].PeerId, true); } } } } else { UnityLog.Instance.LogError(PlayerContainer.userArtId + " cant find art"); } } else { continue; } } } } } /// /// 删除场景的物体 /// /// /// public void DelGoodsById(int id) { bool isCanDel = true; if (GameNode.Instance.PageGoods.ContainsKey(id)) { var goods = GameNode.Instance.PageGoods[id]; if (goods.scene_id == CommonMethod.currentScene.Id) { isCanDel = true; } } if (isCanDel) { WSHandler.Room.DeleteGood(new int[] { id }); } } public void DelGoodsByIds(List ids) { List list = new List(); for (int i = 0; i < ids.Count; i++) { int id = ids[i]; if (GameNode.Instance.PageGoods.ContainsKey(id)) { var goods = GameNode.Instance.PageGoods[id]; if (goods.scene_id == CommonMethod.currentScene.Id) { list.Add(id); } } } if (list.Count > 0) { WSHandler.Room.DeleteGood(list.ToArray()); } } /// /// 翻页的数据处理 /// 翻页时注意,删除旧的数据 /// 同步新的数据 /// /// /// public void OnChangePage(int all, int current) { if (GameNode.Instance) { if (GameNode.Instance.DefaultPageIndex != current) { if (GameNode.Instance.DefaultPageIndex >= 0) { if (GameNode.Instance.PageGoodsId.ContainsKey(GameNode.Instance.DefaultPageIndex)) { var list = GameNode.Instance.PageGoodsId[GameNode.Instance.DefaultPageIndex]; for (int i = 0; i < list.Count; i++) { GoodsDelSync(list[i], false); } } } if (ModelEditBtn) { ModelEditBtn.gameObject.SetActive(false); } GameNode.Instance.DefaultPageIndex = current; if (GameNode.Instance.DefaultPageIndex >= 0) { if (GameNode.Instance.PageGoodsId.ContainsKey(GameNode.Instance.DefaultPageIndex)) { var list = GameNode.Instance.PageGoodsId[GameNode.Instance.DefaultPageIndex]; for (int i = 0; i < list.Count; i++) { if (GameNode.Instance.PageGoods.ContainsKey(list[i])) { SyncGoods(GameNode.Instance.PageGoods[list[i]], false); } } } } } } } } }