using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using AX.MessageSystem; using AX.NetworkSystem; using UnityEngine.AI; public class FireSpreadPanel : BaseAttributeSet { private static FireSpreadPanel instance; public static FireSpreadPanel Instance { get { if (instance == null) { GameObject obj = Resources.Load<GameObject>("Common/FireSpreadPanel"); GameObject clone = Instantiate(obj, GameObject.Find("Canvas").transform); clone.transform.SetAsLastSibling(); clone.name = "FireSpreadPanel"; clone.transform.position = Vector3.zero; instance = clone.GetComponent<FireSpreadPanel>(); instance.Init(); } return instance; } } InputField combustibleInputField;//燃烧物输入框 Dropdown combustibleDropdown;//燃烧物选择下拉框 Toggle combustibleToggle;//燃烧物输入和选择之间的切换 Dropdown InitialSizeDropdown;//火源初始大小设置下来框 InputField firePostion;//位置 Toggle roadSpread;//路径蔓延 Toggle areSpread;//区域蔓延 public Toggle aroundSpread;//四周蔓延 Toggle aotoSpread;//自动蔓延 Dropdown spreadSpeedDropdown;//蔓延速度 public bool isLoad;//是否是加载而不是换选蔓延方式和重置 Button sure; Button Reset; void Init() { combustibleInputField = transform.Find("Comburent/InputField").GetComponent<InputField>(); combustibleDropdown = transform.Find("Comburent/Dropdown").GetComponent<Dropdown>(); combustibleToggle = transform.Find("Comburent/Toggle").GetComponent<Toggle>(); firePostion = transform.Find("Position/InputField").GetComponent<InputField>(); InitialSizeDropdown = transform.Find("InitialSize/Dropdown").GetComponent<Dropdown>(); InitialSizeDropdown.onValueChanged.AddListener(InitialSizeSet); roadSpread = transform.Find("FireSpread/SpreadType/RoadSpread").GetComponent<Toggle>(); roadSpread.onValueChanged.AddListener(RoadSpreadSelected); areSpread = transform.Find("FireSpread/SpreadType/AreSpread").GetComponent<Toggle>(); areSpread.onValueChanged.AddListener(AreSpreadSelected); aroundSpread = transform.Find("FireSpread/SpreadType/AroundSpread").GetComponent<Toggle>(); aroundSpread.onValueChanged.AddListener(AroundSpreadSelected); aotoSpread = transform.Find("FireSpread/SpreadType/AotoSpread").GetComponent<Toggle>(); aotoSpread.onValueChanged.AddListener(AotoSpreadSelected); spreadSpeedDropdown = transform.Find("FireSpread/SpreadSpeed/Dropdown").GetComponent<Dropdown>(); sure = transform.Find("Sure").GetComponent<Button>(); Reset = transform.Find("Reset").GetComponent<Button>(); } public override void OnDisable() { base.OnDisable(); Close(); } public override void OnDestroy() { base.OnDestroy(); InitialSizeDropdown.onValueChanged.RemoveListener(InitialSizeSet); roadSpread.onValueChanged.RemoveListener(RoadSpreadSelected); areSpread.onValueChanged.RemoveListener(AreSpreadSelected); aroundSpread.onValueChanged.RemoveListener(AroundSpreadSelected); aotoSpread.onValueChanged.RemoveListener(AotoSpreadSelected); } private void LoadUIDisaster() { if (GameSettings.othersSettings.isSelectedDisaster) { if (GameSettings.othersSettings.mode != Mode.DisasterManagement) {//若是练习或演习模式进入导调组界面,则不可以修改 //combustibleInputField.interactable = false; //combustibleDropdown.interactable = false; //combustibleToggle.interactable = false; //firePostion.interactable = false; //InitialSizeDropdown.interactable = false; //roadSpread.interactable = false; //areSpread.interactable = false; //aroundSpread.interactable = false; //aotoSpread.interactable = false; //spreadSpeedDropdown.interactable = false; //sure.interactable = false; //Reset.interactable = false; ////控制不能画蔓延范围 //InputManager.skill = false; //InputManager.cloneObjType = CloneObjType.None; } else { if (!GameSettings.disasterSetting.isEdit) {//若是灾情库设置模式的查看,则不可以修改 combustibleInputField.interactable = false; combustibleDropdown.interactable = false; combustibleToggle.interactable = false; firePostion.interactable = false; InitialSizeDropdown.interactable = false; roadSpread.interactable = false; areSpread.interactable = false; aroundSpread.interactable = false; aotoSpread.interactable = false; spreadSpeedDropdown.interactable = false; sure.interactable = false; Reset.interactable = false; //控制不能画蔓延范围 InputManager.skill = false; InputManager.cloneObjType = CloneObjType.None; } else { //若是灾情库设置模式的编辑,则可以修改 } } } } private void InitialSizeSet(int arg0) { int selectedFireScale = int.Parse(InitialSizeDropdown.options[arg0].text.ToString()); MessageDispatcher.SendMessage(chooseObj.GetComponent<BaseGameObjInfo>().gameObjID, "FIRE_INITIALSIZE_SET", selectedFireScale); } private void RoadSpreadSelected(bool arg0) { if (arg0) { ResetSpreadPath(); spreadSpeedDropdown.interactable = true; MessageDispatcher.SendMessage("ROAD_SPREAD_SELECTED", arg0); CloneFireSpreadLine.instance.spreadedFireGameObjID = chooseObj.GetComponent<BaseGameObjInfo>().gameObjID; } else { spreadSpeedDropdown.interactable = false; CloneFireSpreadLine.instance.startPoint = Vector3.zero; MessageDispatcher.SendMessage("ROAD_SPREAD_SELECTED", arg0); CloneFireSpreadLine.instance.spreadedFireGameObjID = -1; } } private void AreSpreadSelected(bool arg0) { if (arg0) { ResetSpreadPath(); spreadSpeedDropdown.interactable = true; MessageDispatcher.SendMessage("ARE_SPREAD_SELECTED", arg0); CloneFireSpreadLine.instance.spreadedFireGameObjID = chooseObj.GetComponent<BaseGameObjInfo>().gameObjID; } else { spreadSpeedDropdown.interactable = false; CloneFireSpreadLine.instance.startPoint = Vector3.zero; MessageDispatcher.SendMessage("ARE_SPREAD_SELECTED", arg0); CloneFireSpreadLine.instance.spreadedFireGameObjID = -1; } } private void AroundSpreadSelected(bool arg0) { if (arg0) { ResetSpreadPath(); spreadSpeedDropdown.interactable = true; CloneFireSpreadLine.instance.startPoint = Vector3.zero; MessageDispatcher.SendMessage("AROUND_SPREAD_SELECTED", arg0); CloneFireSpreadLine.instance.spreadedFireGameObjID = chooseObj.GetComponent<BaseGameObjInfo>().gameObjID; } else { spreadSpeedDropdown.interactable = false; CloneFireSpreadLine.instance.startPoint = Vector3.zero; MessageDispatcher.SendMessage("AROUND_SPREAD_SELECTED", arg0); CloneFireSpreadLine.instance.spreadedFireGameObjID = -1; } } private void AotoSpreadSelected(bool arg0) { if (arg0) { ResetSpreadPath(); spreadSpeedDropdown.interactable = true; MessageDispatcher.SendMessage("AOTO_SPREAD_SELECTED", arg0); CloneFireSpreadLine.instance.spreadedFireGameObjID = chooseObj.GetComponent<BaseGameObjInfo>().gameObjID; } else { spreadSpeedDropdown.interactable = false; CloneFireSpreadLine.instance.startPoint = Vector3.zero; MessageDispatcher.SendMessage("AOTO_SPREAD_SELECTED", arg0); CloneFireSpreadLine.instance.spreadedFireGameObjID = -1; } } public override void OpenPanel() { if (!GameSettings.othersSettings.isStartDrill) { if (chooseObj.GetComponent<FireSpreadCtrl>().isSpreading) { LoadPromptWin.Instance.LoadTextPromptWindow("蔓延过程中不能重新设置!", 1f); return; } } //else //{ // LoadPromptWin.Instance.LoadTextPromptWindow("开始演练后不能设置!", 1f); // return; //} base.OpenPanel(); LoadUIDisaster(); gameObject.SetActive(true); if (chooseObj.GetComponent<FireSpreadCtrl>()) { if (chooseObj.GetComponent<NavMeshObstacle>()) { chooseObj.GetComponent<NavMeshObstacle>().enabled = false; } } } /// <summary> /// 打开火属性设置窗口时,加载数据 /// </summary> public override void LoadObjData() { var fireSpreadCtrl = chooseObj.GetComponent<FireSpreadCtrl>(); //isLoad = true; InputManager.skill = true; InputManager.cloneObjType = CloneObjType.FireSpreadLine; CloneFireSpreadLine.instance.spreadedFireGameObjID = chooseObj.GetComponent<BaseGameObjInfo>().gameObjID; RefreshFireAttribute(fireSpreadCtrl); HideAllSpreadPath(); ShowSelectedFireSpreadPath(); } /// <summary> /// 刷新面板数据 /// </summary> /// <param name="fireSpreadCtrl"></param> private void RefreshFireAttribute(FireSpreadCtrl fireSpreadCtrl) { combustibleToggle.isOn = fireSpreadCtrl.combustibleInputWay;//设置燃烧物的输入方式 var fireAttribute = fireSpreadCtrl.fireAttribute; if (!combustibleToggle.isOn) { List<Dropdown.OptionData> options = combustibleDropdown.options; if (fireAttribute.comburent == "") { combustibleDropdown.value = 0; } else { for (int i = 0; i < options.Count; i++) { if (options[i].text == fireAttribute.comburent) { combustibleDropdown.value = i; break; } } } combustibleInputField.text = ""; } else { combustibleInputField.text = fireAttribute.comburent; combustibleDropdown.value = 0; } firePostion.text = fireAttribute.position; List<Dropdown.OptionData> InitialSizeOptions = InitialSizeDropdown.options; if (fireAttribute.initialSize == 0) { InitialSizeDropdown.value = 2; } else { for (int i = 0; i < InitialSizeOptions.Count; i++) { if (InitialSizeOptions[i].text == fireAttribute.initialSize.ToString()) { InitialSizeDropdown.value = i; break; } } } if (!roadSpread.isOn && !areSpread.isOn && !aroundSpread.isOn && !aotoSpread.isOn) { isLoad = true; } switch (fireAttribute.spreadWay) { case SpreadWay.None: roadSpread.isOn = false; areSpread.isOn = false; aroundSpread.isOn = false; aotoSpread.isOn = false; break; case SpreadWay.Road: roadSpread.isOn = true; areSpread.isOn = false; aroundSpread.isOn = false; aotoSpread.isOn = false; break; case SpreadWay.Are: roadSpread.isOn = false; areSpread.isOn = true; aroundSpread.isOn = false; aotoSpread.isOn = false; break; case SpreadWay.Around: roadSpread.isOn = false; areSpread.isOn = false; aroundSpread.isOn = true; aotoSpread.isOn = false; break; case SpreadWay.Aoto: roadSpread.isOn = false; areSpread.isOn = false; aroundSpread.isOn = false; aotoSpread.isOn = true; break; default: break; } List<Dropdown.OptionData> speedOptions = spreadSpeedDropdown.options; if (fireAttribute.spreadSpeed == 0) { spreadSpeedDropdown.value = 0; } else { for (int i = 0; i < speedOptions.Count; i++) { if (speedOptions[i].text == fireAttribute.spreadSpeed.ToString()) { spreadSpeedDropdown.value = i; break; } } } CloneFireSpreadLine.instance.pathPoints.Clear(); foreach (Vector3 item in fireAttribute.pathPoints) { CloneFireSpreadLine.instance.pathPoints.Add(item); } CloneFireSpreadLine.instance.currentPathPointsCount = CloneFireSpreadLine.instance.pathPoints.Count; if (CloneFireSpreadLine.instance.pathPoints.Count > 0) { CloneFireSpreadLine.instance.startPoint = CloneFireSpreadLine.instance.pathPoints[CloneFireSpreadLine.instance.pathPoints.Count - 1]; } } public override void ResetData(GameObject dataObj) { Cancel(); } /// <summary> /// 点击确定按钮 /// </summary> public void Confirm() { if (roadSpread.isOn || areSpread.isOn || aroundSpread.isOn || aotoSpread.isOn) { if (spreadSpeedDropdown.value == 0) { string textPromptContent = "请选择蔓延速度!"; float stayTime = 1f; LoadPromptWin.Instance.LoadTextPromptWindow(textPromptContent, stayTime); return; } if (CloneFireSpreadLine.instance.pathPoints.Count == 0 || CloneFireSpreadLine.instance.pathPoints.Count == 1) { string textPromptContent = "请设置蔓延路径或范围!"; float stayTime = 1f; LoadPromptWin.Instance.LoadTextPromptWindow(textPromptContent, stayTime); return; } if (areSpread.isOn || aroundSpread.isOn) { if (CloneFireSpreadLine.instance.pathPoints.Count < 3) { string textPromptContent = "没有形成多边形!"; float stayTime = 1f; LoadPromptWin.Instance.LoadTextPromptWindow(textPromptContent, stayTime); return; } } } var fireSpreadCtrl = chooseObj.GetComponent<FireSpreadCtrl>(); var fireAttribute = fireSpreadCtrl.fireAttribute; string comburent = ""; if (!combustibleToggle.isOn) { comburent = combustibleDropdown.options[combustibleDropdown.value].text.ToString(); } else { comburent = combustibleInputField.text; } fireAttribute.comburent = comburent; fireAttribute.position = firePostion.text; int selectedFireScale = int.Parse(InitialSizeDropdown.options[InitialSizeDropdown.value].text.ToString()); fireAttribute.initialSize = selectedFireScale; if (roadSpread.isOn) { fireAttribute.spreadWay = SpreadWay.Road; } else if (areSpread.isOn) { fireAttribute.spreadWay = SpreadWay.Are; } else if (aroundSpread.isOn) { fireAttribute.spreadWay = SpreadWay.Around; } else if (aotoSpread.isOn) { fireAttribute.spreadWay = SpreadWay.Aoto; } if (roadSpread.isOn || areSpread.isOn || aroundSpread.isOn || aotoSpread.isOn) { string spreadSpeed = spreadSpeedDropdown.options[spreadSpeedDropdown.value].text.ToString(); fireAttribute.spreadSpeed = int.Parse(spreadSpeed); CloneFireSpreadLine.instance.SetPathPoints(fireAttribute.pathPoints); CloneFireSpreadLine.instance.currentPathPointsCount = fireAttribute.pathPoints.Count; fireSpreadCtrl.GetSpreadFirePositions(); } //火初始状态同步 if (GameSettings.othersSettings.mode!=Mode.DisasterManagement) { FireOriginAttributeSyncData arg = new FireOriginAttributeSyncData(); arg.FireAttribute = fireAttribute; arg.SendUserID = CurrentUserInfo.mySelf.Id; arg.gameObjID = chooseObj.GetComponent<BaseGameObjInfo>().gameObjID; NetworkManager.Default.SendAsync("FIRE_ORIGINAL_ATTRIBUTE", arg); } gameObject.SetActive(false); if (chooseObj.GetComponent<FireSpreadCtrl>()) { if (chooseObj.GetComponent<NavMeshObstacle>()) { chooseObj.GetComponent<NavMeshObstacle>().enabled = true; } } } public void Close() { HideAllSpreadPath(); CloneFireSpreadLine.instance.pathPoints.Clear(); InputManager.skill = false; InputManager.cloneObjType = CloneObjType.None; isLoad = false; gameObject.SetActive(false); if (chooseObj.GetComponent<FireSpreadCtrl>()) { if (chooseObj.GetComponent<NavMeshObstacle>()) { chooseObj.GetComponent<NavMeshObstacle>().enabled = true; } } } public void Cancel() { HideAllSpreadPath(); //点击取消时执行删除不保存的路径点和已克隆出来的边。因确定而隐藏窗口调了Close()方法,但不执行删除。所以点击取消时单独封装个方法 CloneFireSpreadLine.instance.Cancel(); CloneFireSpreadLine.instance.pathPoints.Clear(); InputManager.skill = false; InputManager.cloneObjType = CloneObjType.None; isLoad = false; gameObject.SetActive(false); } /// <summary> /// 点击重置范围按钮 /// </summary> public void ResetSpreadPath() { //重新初始化起始点 if (aroundSpread.isOn) { CloneFireSpreadLine.instance.startPoint = Vector3.zero; } else { RaycastHit hitDown; Physics.Raycast(chooseObj.transform.position, Vector3.down, out hitDown, Mathf.Infinity); NavMeshHit hit = new NavMeshHit(); bool isFindedPath = NavMesh.SamplePosition(hitDown.point, out hit, 0.5f, NavMesh.AllAreas); Debug.Log("isFindedPath---" + isFindedPath); if (/*hitDown.transform.gameObject.layer == LayerMask.NameToLayer("CarRoad") || hitDown.transform.gameObject.layer == LayerMask.NameToLayer("SoldierRoad")*/ isFindedPath) { CloneFireSpreadLine.instance.startPoint = new Vector3(chooseObj.transform.position.x, hitDown.transform.position.y, chooseObj.transform.position.z); CloneFireSpreadLine.instance.pathPoints.Add(CloneFireSpreadLine.instance.startPoint); } } if (isLoad) { isLoad = false; return; } CloneFireSpreadLine.instance.ResetSpreadPath(chooseObj.GetComponent<BaseGameObjInfo>().GameObjID); chooseObj.GetComponent<FireSpreadCtrl>().ResetSpreadPathsAndPoints(); DeleteSpreadedFire(chooseObj.transform.parent); //重置完后,初始化下一次蔓延范围的初始点 if (CloneFireSpreadLine.instance.pathPoints.Count == 0 && !aroundSpread.isOn) { RaycastHit hitDown; Physics.Raycast(chooseObj.transform.position, Vector3.down, out hitDown, Mathf.Infinity); NavMeshHit hit = new NavMeshHit(); bool isFindedPath = NavMesh.SamplePosition(hitDown.point, out hit, 0.5f, NavMesh.AllAreas); if (/*hitDown.transform.gameObject.layer == LayerMask.NameToLayer("CarRoad") || hitDown.transform.gameObject.layer == LayerMask.NameToLayer("SoldierRoad")*/ isFindedPath) { CloneFireSpreadLine.instance.startPoint = new Vector3(chooseObj.transform.position.x, hitDown.transform.position.y, chooseObj.transform.position.z); CloneFireSpreadLine.instance.pathPoints.Add(CloneFireSpreadLine.instance.startPoint); } } } private void DeleteSpreadedFire(Transform spreadedFireParent) { foreach (Transform child in spreadedFireParent) { if (child.GetComponent<SpreadedFireCtrl>() && child.GetComponent<SpreadedFireCtrl>().fireGameObjID == chooseObj.GetComponent<BaseGameObjInfo>().gameObjID) { EntitiesManager.Instance.DeleteObj(child.gameObject); } } } public void FireSpreadPreview() { } private void HideAllSpreadPath() { MessageDispatcher.SendMessage("HIDE_ALL_SPREADPATH"); } private void ShowSelectedFireSpreadPath() { MessageDispatcher.SendMessage("SHOW_SELECTEDFIRE_SPREADPATH", chooseObj.GetComponent<BaseGameObjInfo>().GameObjID); } }