大连中石油电子沙盘
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.
 
 
 
 

194 lines
6.3 KiB

using AX.InputSystem;
using AX.MessageSystem;
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class DrawRectSelectRange : MonoBehaviour
{
private Vector3 mousePosition = Vector3.zero;//记录刚进入框选状态时鼠标的位置
private bool drawRectStart;//框选画框是否开始
private Vector3 endPosition = Vector3.zero;
private Material rectMat = null;
public Color rectColor = Color.green;
public Shader LinesColorShader;
private Camera mainCamera = null;
private float farPlane = 100;
// Use this for initialization
void Start()
{
rectMat = new Material(LinesColorShader);//生成画线材质
rectMat.hideFlags = HideFlags.HideAndDontSave;
//rectMat.shader.hideFlags = HideFlags.HideAndDontSave;
mainCamera = GetComponent<Camera>();
farPlane = mainCamera.farClipPlane;
}
// Update is called once per frame
void Update()
{
}
void OnEnable()
{
MessageDispatcher.AddListener("RECTDRAW_ENTER_COMMAND", DrawRectSelectRangeEnter);
MessageDispatcher.AddListener("RECTDRAWING_COMMAND", DrawRectSelectRanging);
MessageDispatcher.AddListener("RECTDRAW_EXIT_COMMAND", DrawRectSelectRangeExit);
}
void OnDisable()
{
MessageDispatcher.RemoveListener("RECTDRAW_ENTER_COMMAND", DrawRectSelectRangeEnter);
MessageDispatcher.RemoveListener("RECTDRAWING_COMMAND", DrawRectSelectRanging);
MessageDispatcher.RemoveListener("RECTDRAW_EXIT_COMMAND", DrawRectSelectRangeExit);
}
void OnDestroy()
{
MessageDispatcher.RemoveListener("RECTDRAW_ENTER_COMMAND", DrawRectSelectRangeEnter);
MessageDispatcher.RemoveListener("RECTDRAWING_COMMAND", DrawRectSelectRanging);
MessageDispatcher.RemoveListener("RECTDRAW_EXIT_COMMAND", DrawRectSelectRangeExit);
}
private void DrawRectSelectRangeEnter(IMessage obj)
{
var data = (DrawRectSelectRangeCmdArgs)obj.Data;
mousePosition = data.mousePosition;
drawRectStart = data.drawRectStart;
}
private void DrawRectSelectRanging(IMessage obj)
{
var data = (DrawRectSelectRangeCmdArgs)obj.Data;
endPosition = data.mousePosition;
drawRectStart = data.drawRectStart;
}
private void DrawRectSelectRangeExit(IMessage obj)
{
var data = (DrawRectSelectRangeCmdArgs)obj.Data;
mousePosition = data.mousePosition;
drawRectStart = data.drawRectStart;
}
void OnPostRender()
{
if (drawRectStart)
{
DrawSelectionRectangle(mousePosition, endPosition);
//没有选中克隆按钮时,画框同时判断是否框选选中并做选中处理;选中克隆按钮时只画框,不做框选选中处理
if (InputManager.cloneObjType == CloneObjType.None)
{
checkSelection(mousePosition, endPosition);
}
}
}
private void DrawSelectionRectangle(Vector3 start, Vector3 end)
{
GL.PushMatrix();//保存摄像机变换矩阵
if (!rectMat)
return;
rectMat.SetPass(0);
GL.LoadPixelMatrix();//设置用屏幕坐标绘图
GL.Begin(GL.QUADS);
GL.Color(new Color(rectColor.r, rectColor.g, rectColor.b, 0.1f));
GL.Vertex3(start.x, start.y, 0);
GL.Vertex3(end.x, start.y, 0);
GL.Vertex3(end.x, end.y, 0);
GL.Vertex3(start.x, end.y, 0);
GL.End();
GL.Begin(GL.LINES);
GL.Color(rectColor);//设置方框的边框颜色 边框不透明
GL.Vertex3(start.x, start.y, 0);
GL.Vertex3(end.x, start.y, 0);
GL.Vertex3(end.x, start.y, 0);
GL.Vertex3(end.x, end.y, 0);
GL.Vertex3(end.x, end.y, 0);
GL.Vertex3(start.x, end.y, 0);
GL.Vertex3(start.x, end.y, 0);
GL.Vertex3(start.x, start.y, 0);
GL.End();
GL.PopMatrix();//恢复摄像机矩阵
}
private void checkSelection(Vector3 start, Vector3 end)
{
Vector3 p1 = Vector3.zero;
Vector3 p2 = Vector3.zero;
//这些判断是用来确保p1的xy坐标小于p2的xy坐标,因为画的框不见得就是左下到右上或者左上到右下这个方向
if (start.x > end.x)
{
p1.x = end.x;
p2.x = start.x;
}
else
{
p1.x = start.x;
p2.x = end.x;
}
if (start.y > end.y)
{
p1.y = end.y;
p2.y = start.y;
}
else
{
p1.y = start.y;
p2.y = end.y;
}
if (SelectedObjs.characters.Count>0)
{
for (int i = 0; i < SelectedObjs.characters.Count; i++)
{
if (SelectedObjs.characters[i] == null)
{
SelectedObjs.characters.Remove(SelectedObjs.characters[i]);
}
}
}
foreach (GameObject obj in SelectedObjs.characters)
{
if (obj==null)
{
return;
}
Vector3 location = mainCamera.WorldToScreenPoint(obj.transform.position);
if (location.x < p1.x || location.x > p2.x || location.y < p1.y || location.y > p2.y
|| location.z < 0 || location.z > farPlane)
{//框选范围之外及摄像头视线范围外,不需要选择
MessageDispatcher.SendMessage(obj, "CANCEL_OBJ_SELECTED");
// AddRecordEventSelect(RecordEventType.CancelObjSelected, obj);
}
else
{//否则就进行选中操作
MessageDispatcher.SendMessage(obj, "OBJ_RECT_SELECTED");
// AddRecordEventSelect(RecordEventType.ObjRectSelected, obj);
}
}
}
private void AddRecordEventSelect(RecordEventType type, GameObject obj)
{
if (ReplaySetting.PlayStatus == PlayStatus.isEditor && RecordManager.Instance.recordStatus == RecordStatus.normal)
{
var eventData = new EventData();
eventData.time = RecordManager.Instance.RecordTimer;
eventData.cloneObjType = CloneObjType.None;
eventData.eventType = type;
eventData.json = obj.name;
RecordManager.Instance.jsonData.eventDataList.Add(eventData);
}
}
}