北海美人鱼地下场景演练
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.
 
 
 
 
 

415 lines
17 KiB

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using AX.MessageSystem;
using System;
using AX.InputSystem;
using UnityEngine.UI;
[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;
}
{
if (SelectedObjs.selectedObj != null )
{
CloneGameObjInfo info = SelectedObjs.selectedObj.GetComponent<CloneGameObjInfo>();
FloorsPanelManager data = GameObject.Find("Canvas").transform.GetComponentInChildren<FloorsPanelManager>(false);
if (info && data)
{
if (info.buildNum == data.CurrentFloor.buildNum)
{
if (data.CurrentFloor.floorNum!=0)
{
if (info.floorNum > data.CurrentFloor.floorNum ||
(info.floorNum == data.CurrentFloor.floorNum && info.interlayerNum > data.CurrentFloor.interlayerNum))
{
Renderer[] renderers = SelectedObjs.selectedObj.GetComponentsInChildren<Renderer>();
for (int i = 0; i < renderers.Length; i++)
{
renderers[i].enabled = false;
}
if (SelectedObjs.selectedObj.GetComponent<CreatHaemalUI>()) //如果是被困人员/伤员,绑定了UI
{
Transform ui = SelectedObjs.selectedObj.GetComponent<CreatHaemalUI>().haemal.transform;
Image[] images = ui.GetComponentsInChildren<Image>(true);
for (int j = 0; j < images.Length; j++)
{
images[j].enabled = false;
}
Text[] texts = ui.GetComponentsInChildren<Text>(true);
for (int j = 0; j < texts.Length; j++)
{
texts[j].enabled = false;
}
}
if (SelectedObjs.selectedObj.GetComponent<CloneGameObjInfo>().gameObjType == CloneObjType.fireman ||
SelectedObjs.selectedObj.GetComponent<TruckMessage>() ||
SelectedObjs.selectedObj.GetComponent<CloneGameObjInfo>().gameObjType == CloneObjType.Trailer ||
SelectedObjs.selectedObj.GetComponent<CloneGameObjInfo>().gameObjType == CloneObjType.OilSupplyTruck ||
SelectedObjs.selectedObj.GetComponent<CloneGameObjInfo>().gameObjType == CloneObjType.LiquipSupplyTruck ||
SelectedObjs.selectedObj.GetComponent<CloneGameObjInfo>().gameObjType == CloneObjType.RescueCarrierCar ||
SelectedObjs.selectedObj.GetComponent<CloneGameObjInfo>().gameObjType == CloneObjType.LifeGuaranteeCar)
{
UINameItem[] names = GameObject.Find("Canvas").transform.Find("TheHeadName").GetComponentsInChildren<UINameItem>(true);
for (int j = 0; j < names.Length; j++)
{
if (names[j].Target == SelectedObjs.selectedObj.gameObject)
{
names[j].gameObject.SetActive(false);
}
}
}
}
}
}
}
}
if (SelectedObjs.selectedCharacters.Count > 0 )
{
FloorsPanelManager data = GameObject.Find("Canvas").transform.GetComponentInChildren<FloorsPanelManager>(false);
UINameItem[] names = GameObject.Find("Canvas").transform.Find("TheHeadName").GetComponentsInChildren<UINameItem>(true);
for (int i = 0; i < SelectedObjs.selectedCharacters.Count; i++)
{
CloneGameObjInfo info = SelectedObjs.selectedCharacters[i].GetComponent<CloneGameObjInfo>();
if (info && data)
{
if (info.buildNum == data.CurrentFloor.buildNum)
{
if (data.CurrentFloor.floorNum!=0)
{
if (info.floorNum > data.CurrentFloor.floorNum ||
(info.floorNum == data.CurrentFloor.floorNum && info.interlayerNum > data.CurrentFloor.interlayerNum))
{
Renderer[] renderers = SelectedObjs.selectedCharacters[i].GetComponentsInChildren<Renderer>();
for (int j = 0; j < renderers.Length; j++)
{
renderers[j].enabled = false;
}
for (int j = 0; j < names.Length; j++)
{
if (names[j].Target == SelectedObjs.selectedCharacters[i])
{
names[j].gameObject.SetActive(false);
}
}
}
}
}
}
}
}
}
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);
}
}
}
}