贺州人民医院电子沙盘
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.
 
 
 
 

215 lines
7.1 KiB

using AX.MessageSystem;
using System;
using System.Collections.Generic;
using UnityEngine;
[RequireComponent(typeof(BaseGameObjInfo))]
public class ObjSelectCtrl : MonoBehaviour
{
public bool selected;//是否被选中
public int Layer;
void Awake()
{
}
public void AddRecordEventSelect(RecordEventType type, GameObject selectobj)
{
if (ReplaySetting.PlayStatus == PlayStatus.isEditor && RecordManager.Instance.recordStatus == RecordStatus.normal)
{
var eventData = new EventData
{
time = RecordManager.Instance.RecordTimer,
cloneObjType = GetComponent<BaseGameObjInfo>().gameObjType,
eventType = type,
json = selectobj == null ? "null" : selectobj.name
};
RecordManager.Instance.jsonData.eventDataList.Add(eventData);
}
}
void OnEnable()
{
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);
}
void OnDisable()
{
MessageDispatcher.RemoveListener("RADIO_SELECTED_COMMAND", RadioSelect);
MessageDispatcher.RemoveListener("CANCEL_SELECTED_COMMAND", EscCancelSelected);
MessageDispatcher.RemoveListener("CANCEL_OBJ_SELECTED", CancelObjSelected);
MessageDispatcher.RemoveListener("OBJ_RECT_SELECTED", ObjRectSelected);
}
void OnDestroy()
{
MessageDispatcher.RemoveListener("RADIO_SELECTED_COMMAND", RadioSelect);
MessageDispatcher.RemoveListener("CANCEL_SELECTED_COMMAND", EscCancelSelected);
MessageDispatcher.RemoveListener("CANCEL_OBJ_SELECTED", CancelObjSelected);
MessageDispatcher.RemoveListener("OBJ_RECT_SELECTED", ObjRectSelected);
}
private void RadioSelect(IMessage obj)
{
var gameObjID = (long)obj.Sender;
var hitObj = EntitiesManager.Instance.GetEntityByID(gameObjID);
if (hitObj == gameObject)
{
clearSelection();
if (hitObj.tag != "Player")
{//除消防员外其他可选中物体的单选
SelectedObjs.selectedObj = hitObj;
}
else
{//消防员单选
if (!SelectedObjs.selectedCharacters.Contains(hitObj))
SelectedObjs.selectedCharacters.Add(hitObj);
}
DoSelect(gameObject);
//AttributeSetting.Instance.ShowButton(hitObj);
if (!RecordEvent.IsReplay())
MessageDispatcher.SendMessage("SelectChange", gameObject);
}
}
private void EscCancelSelected(IMessage obj)
{
if (SelectedObjs.selectedObj == gameObject || SelectedObjs.selectedCharacters.Contains(gameObject))
clearSelection();
}
private void CancelObjSelected(IMessage obj)
{
//AddRecordEventSelect(RecordEventType.CancelObjSelected);
//如果框选之前有不能框选的物体被单选选中,框选时,需要取消它的选中
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);
}
}
private void ObjRectSelected(IMessage obj)
{
//AddRecordEventSelect(RecordEventType.ObjRectSelected);
var gameObj = (GameObject)obj.Sender;
//框选范围内的物体,如果没有选中,进行选中处理,如果已经被选中,则不做处理,保持原来选中状态
if (!SelectedObjs.selectedCharacters.Contains(gameObj))
{
SelectedObjs.selectedCharacters.Add(gameObj);
DoSelect(gameObj);
}
if (SelectedObjs.selectedCharacters.Count>1)
{
if (FireManSkillsPanel.GetInstance.gameObject.activeInHierarchy)
{
FireManSkillsPanel.GetInstance.gameObject.SetActive(false);
}
if (TruckSkillSPanel.GetInstance.gameObject.activeInHierarchy)
{
TruckSkillSPanel.GetInstance.gameObject.SetActive(false);
}
}
}
private void DoSelect(GameObject obj)
{
AddRecordEventSelect(RecordEventType.RadioSelect, obj);
if (obj&&obj.GetComponent<ObjSelectCtrl>())
{
obj.GetComponent<ObjSelectCtrl>().selected = true;
SetLayerRecursively(obj, 28);
}
}
private void DoDisSelect(GameObject obj)
{
AddRecordEventSelect(RecordEventType.EscCancelSelected, obj);
if (obj&&obj.GetComponent<ObjSelectCtrl>())
{
obj.GetComponent<ObjSelectCtrl>().selected = false;
SetLayerRecursively(obj, obj.GetComponent<CloneGameObjInfo>().Layer);
}
}
private void clearSelection()
{
if (SelectedObjs.selectedObj)
{
DoDisSelect(SelectedObjs.selectedObj);
SelectedObjs.selectedObj = null;
}
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);
}
}
}
public void SetSelect(string json)
{
var jsonData = JsonUtility.FromJson<RecordObjectBase>(json);
if (gameObject.name == jsonData.objectName)
{
if (jsonData.IsSelect)
{
if (gameObject.CompareTag("Player"))
{//消防员
if (!SelectedObjs.selectedCharacters.Contains(gameObject))
{
SelectedObjs.selectedCharacters.Add(gameObject);
}
}
else
{
SelectedObjs.selectedObj = gameObject;
}
DoSelect(gameObject);
}
else
{
DoDisSelect(gameObject);
}
}
}
}