You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
316 lines
12 KiB
316 lines
12 KiB
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<BaseGameObjInfo>().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<BaseGameObjInfo>().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>()) |
|
{ |
|
TrappedMoveFree trapped = gameObject.GetComponent<TrappedMoveFree>(); |
|
if (trapped.isBefirstAirOrMoving || trapped.Guidance || trapped.OverMoveOrGuidance) |
|
{ |
|
LoadPromptWin.Instance.LoadTextPromptWindow("不能操作当前被困人员", 1f); |
|
return; |
|
} |
|
} |
|
if (gameObject.GetComponent<WoundedSave>()) |
|
{ |
|
WoundedSave wound = gameObject.GetComponent<WoundedSave>(); |
|
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<Bags>(); |
|
|
|
if (bagData!=null) |
|
{ |
|
// 设置当前背包为选中对象背包,可以为null |
|
EquipManager.Instance.CurrentSelectedBag = hitObj.GetComponent<Bags>(); |
|
} |
|
else |
|
{ |
|
if (GameObject.Find("UIViewBag")) |
|
{ |
|
// 没有背包的对象关闭背包 |
|
UIManager.HideView<UIViewBag>(); |
|
|
|
} |
|
if (GameObject.Find("UIViewEquipLib")) |
|
{ |
|
// 关闭仓库界面 |
|
UIManager.HideView<UIViewEquipLib>(); |
|
} |
|
} |
|
} |
|
} |
|
|
|
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<CameraManager>().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<ObjSelectCtrl>().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<ObjSelectCtrl>().selected = false; |
|
//取消选中后设置为原来的层 |
|
CloneGameObjInfo info = obj.GetComponent<CloneGameObjInfo>(); |
|
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<SelectedHighLightRemoved>()) |
|
{ |
|
obj.layer = newLayer; |
|
foreach (Transform child in obj.transform) |
|
{ |
|
SetLayerRecursively(child.gameObject, newLayer); |
|
} |
|
} |
|
} |
|
}
|
|
|