|
|
|
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);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|