// ***********************************************************************
// Assembly : Unity
// Author : KimCh
// Created :
//
// Last Modified By : KimCh
// Last Modified On :
// ***********************************************************************
//
//
// ***********************************************************************
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
public class KHighLightMask : Graphic, /*ICanvasRaycastFilter,*/ IPointerClickHandler, IPointerDownHandler, IPointerUpHandler
{
public Button.ButtonClickedEvent maskClicked = new Button.ButtonClickedEvent();
public RectTransform targetRectTransform1;
private Vector3 _targetPosition1 = Vector3.zero;
private Vector2 _targetSize1 = Vector2.zero;
private bool _isValid;
private Vector3 _scaleF;
readonly Vector3[] _targetCornels = new Vector3[4];
readonly Vector3[] _thisCornels = new Vector3[4];
protected override void Start()
{
_scaleF = rectTransform.lossyScale;
this.SetAllDirty();
}
private void Update()
{
if (!Application.isPlaying || !KUIRoot.Instance.uiCamera)
{
return;
}
if (this.targetRectTransform1 == null || !this.targetRectTransform1.gameObject.activeInHierarchy)
{
if (_isValid)
{
_isValid = false;
this.SetAllDirty();
}
return;
}
if (!_isValid)
{
_isValid = true;
this.SetAllDirty();
return;
}
if (_targetPosition1 != this.targetRectTransform1.position || _targetSize1 != this.targetRectTransform1.rect.size)
{
_targetPosition1 = this.targetRectTransform1.position;
_targetSize1 = this.targetRectTransform1.rect.size;
this.SetAllDirty();
return;
}
}
public bool IsRaycastLocationValid(Vector2 sp, Camera eventCamera)
{
if (this.targetRectTransform1 == null || !this.targetRectTransform1.gameObject.activeInHierarchy)
{
return false;
}
bool flag = RectTransformUtility.RectangleContainsScreenPoint(this.targetRectTransform1, sp, eventCamera);
return !flag;
}
public void OnPointerDown(PointerEventData eventData)
{
//PassEvent(eventData, ExecuteEvents.pointerDownHandler);
}
//监听抬起
public void OnPointerUp(PointerEventData eventData)
{
//PassEvent(eventData, ExecuteEvents.pointerUpHandler);
}
//监听点击
public void OnPointerClick(PointerEventData eventData)
{
if (!IsRaycastLocationValid(eventData.position, KUIRoot.RootCamera))
{
maskClicked.Invoke();
PassEvent(eventData, ExecuteEvents.pointerClickHandler);
}
}
readonly List _raycastResults = new List();
//把事件透下去
public void PassEvent(PointerEventData data, ExecuteEvents.EventFunction function)
where T : IEventSystemHandler
{
_raycastResults.Clear();
List results = _raycastResults;
EventSystem.current.RaycastAll(data, results);
GameObject current = data.pointerCurrentRaycast.gameObject;
for (int i = 0; i < results.Count; i++)
{
if (current != results[i].gameObject)
{
ExecuteEvents.Execute(results[i].gameObject, data, function);
if (this.targetRectTransform1 == results[i].gameObject.transform || results[i].gameObject.GetComponent())
//RaycastAll后ugui会自己排序,如果你只想响应透下去的最近的一个响应,这里ExecuteEvents.Execute后直接break就行。
break;
}
}
_raycastResults.Clear();
}
protected override void OnPopulateMesh(VertexHelper vh)
{
if (!Application.isPlaying)
{
return;
}
vh.Clear();
//if (!_isValid)
//{
// return;
//}
rectTransform.GetWorldCorners(_thisCornels);
if (!targetRectTransform1)
{
this.Rect2(vh);
return;
}
targetRectTransform1.GetWorldCorners(_targetCornels);
for (int i = 0; i < 4; i++)
{
_thisCornels[i].z = 0f;
_thisCornels[i] /= _scaleF.y;
_targetCornels[i].z = 0f;
_targetCornels[i] /= _scaleF.y;
}
this.Rect(vh);
}
private void Rect(VertexHelper vh)
{
UIVertex simpleVert = UIVertex.simpleVert;
simpleVert.position = _thisCornels[0];
simpleVert.color = this.color;
vh.AddVert(simpleVert);
simpleVert.position = _thisCornels[1];
simpleVert.color = this.color;
vh.AddVert(simpleVert);
simpleVert.position = _thisCornels[2];
simpleVert.color = this.color;
vh.AddVert(simpleVert);
simpleVert.position = _thisCornels[3];
simpleVert.color = this.color;
vh.AddVert(simpleVert);
simpleVert.position = _targetCornels[0];
simpleVert.color = this.color;
vh.AddVert(simpleVert);
simpleVert.position = _targetCornels[1];
simpleVert.color = this.color;
vh.AddVert(simpleVert);
simpleVert.position = _targetCornels[2];
simpleVert.color = this.color;
vh.AddVert(simpleVert);
simpleVert.position = _targetCornels[3];
simpleVert.color = this.color;
vh.AddVert(simpleVert);
vh.AddTriangle(0, 1, 5);
vh.AddTriangle(5, 4, 0);
vh.AddTriangle(0, 4, 3);
vh.AddTriangle(3, 4, 7);
vh.AddTriangle(7, 2, 3);
vh.AddTriangle(7, 6, 2);
vh.AddTriangle(6, 1, 2);
vh.AddTriangle(6, 5, 1);
}
private void Rect2(VertexHelper vh)
{
UIVertex simpleVert = UIVertex.simpleVert;
simpleVert.position = _thisCornels[0];
simpleVert.color = this.color;
vh.AddVert(simpleVert);
simpleVert.position = _thisCornels[1];
simpleVert.color = this.color;
vh.AddVert(simpleVert);
simpleVert.position = _thisCornels[2];
simpleVert.color = this.color;
vh.AddVert(simpleVert);
simpleVert.position = _thisCornels[3];
simpleVert.color = this.color;
vh.AddVert(simpleVert);
vh.AddTriangle(0, 1, 2);
vh.AddTriangle(2, 3, 0);
}
}