using System.Collections; using System.Collections.Generic; using UnityEngine; using AX.MessageSystem; using System; using AX.InputSystem; [RequireComponent(typeof(BaseGameObjInfo))] public class ObjSelectCtrl : MonoBehaviour { public bool selected;//是否被选中 // Use this for initialization void Start() { } // Update is called once per frame void Update() { } void OnEnable() { MessageDispatcher.AddListener("police_call", EscCancelSelected); MessageDispatcher.AddListener("RADIO_SELECTED_COMMAND", RadioSelect);//单选选中处理 MessageDispatcher.AddListener("CANCEL_SELECTED_COMMAND", EscCancelSelected);//ESC取消选中处理 //接收DrawRectSelectRange中框选画框处理时,处理框选是否选中逻辑发出的消息:处理框选操作之前选中对象的取消选中 MessageDispatcher.AddListener("CANCEL_OBJ_SELECTED", CancelObjSelected); //接收DrawRectSelectRange中框选画框处理时,处理框选是否选中逻辑发出的消息:处理框选操作选中对象 MessageDispatcher.AddListener("OBJ_RECT_SELECTED", ObjRectSelected); MessageDispatcher.AddListener("CloneCharacterSelected", EscCancelSelected); } void OnDisable() { MessageDispatcher.RemoveListener("police_call", EscCancelSelected); MessageDispatcher.RemoveListener("RADIO_SELECTED_COMMAND", RadioSelect); MessageDispatcher.RemoveListener("CANCEL_SELECTED_COMMAND", EscCancelSelected); MessageDispatcher.RemoveListener("CANCEL_OBJ_SELECTED", CancelObjSelected); MessageDispatcher.RemoveListener("OBJ_RECT_SELECTED", ObjRectSelected); MessageDispatcher.RemoveListener("CloneCharacterSelected", EscCancelSelected); } void OnDestroy() { MessageDispatcher.RemoveListener("police_call", EscCancelSelected); MessageDispatcher.RemoveListener("RADIO_SELECTED_COMMAND", RadioSelect); MessageDispatcher.RemoveListener("CANCEL_SELECTED_COMMAND", EscCancelSelected); MessageDispatcher.RemoveListener("CANCEL_OBJ_SELECTED", CancelObjSelected); MessageDispatcher.RemoveListener("OBJ_RECT_SELECTED", ObjRectSelected); MessageDispatcher.RemoveListener("CloneCharacterSelected", EscCancelSelected); } private void RadioSelect(IMessage obj) { var gameObjID = (long)obj.Sender; var hitObj = EntitiesManager.Instance.GetEntityByID(gameObjID); if (hitObj == gameObject) { if (gameObject.GetComponent().gameObjType != CloneObjType.SafeArea) { if (GameSettings.othersSettings.mode != Mode.DisasterManagement) { if (GameSettings.othersSettings.isSelectedDisaster) { //if (gameObject.transform.parent.parent.name== "P_Disasters") //{//演习模式下不能选中灾情 // return; //} } if (gameObject.GetComponent().UserID == CurrentUserInfo.mySelf.Id) { //if (CurrentUserInfo.mySelf.Id == CurrentUserInfo.room.Owner.UserInfo.Id // && GameSettings.othersSettings.isStartDrill) //{ // return; //} } else { if (gameObject.transform.parent.parent.name == "P_Disasters") { if (CurrentUserInfo.mySelf.Id == CurrentUserInfo.room.Owner.UserInfo.Id) { } else { return; } } else { return; } } } if (GameSettings.othersSettings.mode == Mode.DisasterManagement) { if (!GameSettings.disasterSetting.isCteateDisaster) {//灾情库编辑,查看下 if (!GameSettings.disasterSetting.isEdit) {//灾情库查看下,不能选中 return; } } } //如果点选是伤员且演练已经开始,如果伤员已经被操作(引导或者急救),则不能操作 if (GameSettings.othersSettings.isStartDrill) { if (gameObject.GetComponent()) { TrappedMoveFree trapped = gameObject.GetComponent(); if (trapped.isBefirstAirOrMoving || trapped.Guidance || trapped.OverMoveOrGuidance) { LoadPromptWin.Instance.LoadTextPromptWindow("不能操作当前被困人员", 1f); return; } } if (gameObject.GetComponent()) { WoundedSave wound = gameObject.GetComponent(); if (wound.isBefirstAirOrMoving || wound.OverMoveOrGuidance) { LoadPromptWin.Instance.LoadTextPromptWindow("不能操作当前伤员", 1f); return; } } } clearSelection(); if (hitObj.tag != "Player") {//除消防员外其他可选中物体的单选 SelectedObjs.selectedObj = hitObj; } else {//消防员单选 if (!SelectedObjs.selectedCharacters.Contains(hitObj)) SelectedObjs.selectedCharacters.Add(hitObj); } DoSelect(gameObject); //TODO: 如果选中物体拥有属性面板那么打开所选物体的属性设置按钮 AttributeSetting.Instance.OpenSettingsPanel(hitObj); //如果是中队或者战斗班,选中的是消防员或者车辆或移动水泡 if (SkillTollPanel.Instance) { SkillTollPanel.Instance.SetShowSkillPanel(hitObj); } } else { //安全区特殊处理 if (CurrentUserInfo.generalCommanding) { clearSelection(); SelectedObjs.selectedObj = hitObj; DoSelect(gameObject); } } Bags bagData = hitObj.GetComponent(); if (bagData!=null) { // 设置当前背包为选中对象背包,可以为null EquipManager.Instance.CurrentSelectedBag = hitObj.GetComponent(); } else { if (GameObject.Find("UIViewBag")) { // 没有背包的对象关闭背包 UIManager.HideView(); } if (GameObject.Find("UIViewEquipLib")) { // 关闭仓库界面 UIManager.HideView(); } } } } private void EscCancelSelected(IMessage obj) { if (InputManager.IsGuidance) { LoadPromptWin.Instance.LoadTextPromptWindow("请先完成当前引导", 1f); return; } if (InputManager.isTagSearchRoom) { InputManager.skill = false; InputManager.isTagSearchRoom = false; TagSearchRoomSkillPanel.Instance.Hide(); InputManager.tagSearchRoomPoint = Vector3.zero; } clearSelection(); if (SkillTollPanel.Instance) { SkillTollPanel.Instance.SetSkillPanelHide(); } if (GameObject.Find("Main Camera").GetComponent().viewType == CameraViewState.ThirdPersonView) {//处理总,支,大第三人称情况下,取消安全区等对象的选中时,恢复角色的选中以便其能寻路 if (SelectedObjs.selectedRolePlay == null) { SelectedObjs.selectedRolePlay = GameObject.Find("Character"); } } } private void CancelObjSelected(IMessage obj) { //如果框选之前有不能框选的物体被单选选中,框选时,需要取消它的选中 if (SelectedObjs.selectedObj) { DoDisSelect(SelectedObjs.selectedObj); SelectedObjs.selectedObj = null; } var gameObj = (GameObject)obj.Sender; //如果框选之前有能被框选的物体选中了,且这些物体不在这次框选范围内,取消其的选中 if (SelectedObjs.selectedCharacters.Contains(gameObj)) { DoDisSelect(gameObj); SelectedObjs.selectedCharacters.Remove(gameObj); } if (SkillTollPanel.Instance) { SkillTollPanel.Instance.SetSkillPanelHide(); } } private void ObjRectSelected(IMessage obj) { var gameObj = (GameObject)obj.Sender; //框选范围内的物体,如果没有选中,进行选中处理,如果已经被选中,则不做处理,保持原来选中状态 if (!SelectedObjs.selectedCharacters.Contains(gameObj)) { SelectedObjs.selectedCharacters.Add(gameObj); DoSelect(gameObj); } if (SkillTollPanel.Instance) { SkillTollPanel.Instance.SetSkillPanelHide(); } } private void DoSelect(GameObject obj) { obj.GetComponent().selected = true; //SetLayerRecursively(obj, 28); var layer = LayerMask.NameToLayer("HighLighted"); SetLayerRecursively(obj, layer); //选中物体头顶名称变色处理 // MessageDispatcher.SendMessage("CHANGE_HEAD_NAME_COLOUR", (object)obj.name); //TODO: 管线米数显示处理 } private void DoDisSelect(GameObject obj) { obj.GetComponent().selected = false; //取消选中后设置为原来的层 CloneGameObjInfo info = obj.GetComponent(); SetLayerRecursively(obj, info.Layer); //取消选中物体头顶名称变色处理 // MessageDispatcher.SendMessage("CHANGE_HEAD_NAME_COLOUR_CLEAR", (object)obj.name); } private void clearSelection() { if (SelectedObjs.selectedObj) { DoDisSelect(SelectedObjs.selectedObj); SelectedObjs.selectedObj = null; } if (SelectedObjs.selectedCharacters.Count>0) { for (int i = SelectedObjs.selectedCharacters.Count - 1; i >= 0; i--) { DoDisSelect(SelectedObjs.selectedCharacters[i]); SelectedObjs.selectedCharacters.Remove(SelectedObjs.selectedCharacters[i]); } } } private void SetLayerRecursively(GameObject obj, int newLayer) { if (!obj.GetComponent()) { obj.layer = newLayer; foreach (Transform child in obj.transform) { SetLayerRecursively(child.gameObject, newLayer); } } } }