using System; using System.Collections; using System.Collections.Generic; using System.IO; using UnityEngine; using XFramework; public class Subject2EditorCtrl : SubjectEditorBase { const string panelName = "Panel_subjects2Editor"; public EditorContentCtrl equipContent; //public EditorContentCtrl childEquipContent; //public EditorContentCtrl personContent; public CarDetailCtrl CarDetail; public GameObject carInstacnePrefab; public GameObject onboardInstancePrefab; public List onMapCars = new List();//放置在地图上的图标 不包括生成未完成放置的 List allCarNames = new List();//记录已经放置在地图上的车辆名称 避免重名 string personPath = Application.streamingAssetsPath + "/Config/人员库.txt"; private IconBase currentDragIcon; Sub2RecordClass recordClass ; public Subject2EditorCtrl():base(panelName) { } // Start is called before the first frame update protected override void InitEvent() { base.InitEvent(); //EventCenter.Instance.AddEventListener("CreatOnboard", CreatOnboardInstance); //无需摆放人员 暂时注释 carInstacnePrefab = Resources.Load(ResourcesManager.GetPath("Image_carInstance")); onboardInstancePrefab = Resources.Load(ResourcesManager.GetPath("Image_onboardInstance")); equipContent = ActivePanel.FindChildTrans("Content_equip").GetComponent(); //personContent = ActivePanel.FindChildTrans("Content_person").GetComponent(); CarDetail = ActivePanel.transform.Find("Image_装备详情").GetComponent(); recordClass = null; InitContentIcon(); } //弹出本窗口时 隐藏详情界面 注册界面监听事件 public override void OnStart() { base.OnStart(); CarDetail.Hide(); EventCenter.Instance.AddEventListener("SelectCarEditor", AddOrRemoveCarOnMap); EventCenter.Instance.AddEventListener("CreatCar", CreatCarInstanceForDrag); } //本界面销毁时清空已经创建的物体 注销监听事件 public override void OnDestroy(bool isDestroy = false) { base.OnDestroy(isDestroy); for (int i = 0; i < onMapCars.Count; i++) { GameObject.Destroy(onMapCars[i].gameObject); } onMapCars.Clear(); allCarNames.Clear(); EventCenter.Instance.RemoveEnvetListener("SelectCarEditor", AddOrRemoveCarOnMap); EventCenter.Instance.RemoveEnvetListener("CreatCar", CreatCarInstanceForDrag); } //放置/删除一辆车 并生成唯一名称 private void AddOrRemoveCarOnMap(CarIconInstanceCtrl arg0, bool arg1) { string carTypeName = arg0.text_IconName.text; if (arg1) { onMapCars.Add(arg0); int number = 1; string tempName = carTypeName; while (allCarNames.Contains(tempName)) { tempName = $"{carTypeName}({number})"; number++; } carTypeName = tempName; arg0.SetName(carTypeName); allCarNames.Add(carTypeName); } else { onMapCars.Remove(arg0); allCarNames.Remove(carTypeName); } if (arg0 == currentDragIcon) currentDragIcon = null; } ////创建一个待放置的 车载物体示例图标 //private void CreatOnboardInstance(IconBase arg1) //{ // if (tempIcon != null) return; // IconCreaterCtrl iconCreater = arg1 as IconCreaterCtrl; // tempIcon = GameObject.Instantiate(onboardInstancePrefab, image_Map.transform).GetComponent(); // tempIcon.SetName(arg1.text_IconName.text); // tempIcon.SetSprite(arg1.image_Icon.sprite); // tempIcon.SetUpdateIconMsg(iconCreater.createrType); //} //创建一个待放置的汽车图标实例 private void CreatCarInstanceForDrag(IconBase arg1) { if (currentDragIcon != null) return;//当前有拖拽的物体 currentDragIcon= CreatCarInstance(arg1.text_IconName.text, arg1.image_Icon.sprite); } /// /// 创建一个设为地图子物体的车辆图标 /// /// 车辆名称 /// 图标 private IconBase CreatCarInstance(string name, Sprite sprite) { IconBase newIcon = GameObject.Instantiate(carInstacnePrefab, image_Map.transform).GetComponent(); newIcon.SetName(name); newIcon.SetSprite(sprite); CarIconIntacneInitData initData = new CarIconIntacneInitData(); if (OnboardManager.Instance.onboardDic.ContainsKey(name)) initData.onboardEquipDic[OnboardManager.Instance.onboardDic[name]] = 1; newIcon.SetUpdateIconMsg(initData, "Init"); return newIcon; } //教员编辑时 无需分配人员 只关注车辆位置 void InitContentIcon() { string[] carsName = DBManager.Instance.GetABNames(ABType.装备);//File.ReadAllLines(equipPath); equipContent.CreatChildren(carsName, IconLoadedOver); //string[] personNames = File.ReadAllLines(personPath); //personContent.CreatChildren(personNames); //string[] childEquipNames = DBManager.Instance.GetABNames(ABType.工具); //childEquipContent.CreatChildren(childEquipNames); } public override void SaveFile() { recordClass = new Sub2RecordClass(); recordClass.TerrainName = dropdown_Terrain.options[ dropdown_Terrain.value].text; recordClass.taskIntr = input_TaskIntr.text; recordClass.fileIntr = input_FileIntr.text; recordClass.onMapCars.Clear(); for (int i = 0; i < onMapCars.Count; i++) { //recordClass.onMapCars.Add(new OnMapCarData(onMapCars[i].text_IconName.text, onMapCars[i].GetComponent().anchoredPosition, // onMapCars[i].transform.localEulerAngles.z, onMapCars[i].personNames, onMapCars[i].chidlEquipNames)); recordClass.onMapCars.Add(onMapCars[i].GetCarIconData()); } string path = $"{Application.streamingAssetsPath}/XML/修理所展开/修理所展开科目{DateTime.Now.ToString().Replace('/', '_').Replace(':', ' ')}.xml"; bool result= XmlHelper.SerializeObjectXML(recordClass, typeof(Sub2RecordClass), path); if (result) { Push(new PromptWindows()).Change(new PromptWindowInitData("想定文件生成成功!文件路径为:{0}", new object[] { path }, null)); } } bool loadedOver = false; /// /// 图标资源加载完成 后创建想定文件中记录的车辆 仅首次加载本界面时触发 /// void IconLoadedOver() { loadedOver = true; if (recordClass != null) { CreatOnMapCar(recordClass.onMapCars); } } //根据想定文件初始化界面 public override void Change(object value) { recordClass = value as Sub2RecordClass; if(loadedOver)//首次无法触发 CreatOnMapCar(recordClass.onMapCars); } //直接在地图上创建车辆信息 private async void CreatOnMapCar( List onMapCars) { for (int i = 0; i < recordClass.onMapCars.Count; i++)//创建车辆图标 并放置在地图上 { string equipTypeName = onMapCars[i].name.Split('(')[0]; string path = StreamingAssetsManager.GetPath($"{equipTypeName}_Tex"); Sprite sprite = await OutSpriteLoader.LoadSprite(path); IconBase iconBase= CreatCarInstance(onMapCars[i].name, sprite); iconBase.GetComponent()?.SetFixedAnchoredPos(new Vector2(onMapCars[i].aPX, onMapCars[i].aPY)); AddOrRemoveCarOnMap(iconBase as CarIconInstanceCtrl,true); } } }