网上演练贵港万达广场(人员密集)
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

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