132 lines
3.9 KiB
C#
132 lines
3.9 KiB
C#
// ***********************************************************************
|
|
// Assembly : Game
|
|
// Author : Kimch
|
|
// Created : 2021-05-02
|
|
// Description :
|
|
// Last Modified By :
|
|
// Last Modified On :
|
|
// ***********************************************************************
|
|
// <copyright file= "KGuideMask" company="Kunpo"></copyright>
|
|
// <summary></summary>
|
|
// ***********************************************************************
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
using UnityEngine.UI;
|
|
|
|
/// <summary>
|
|
///
|
|
/// </summary>
|
|
public class KGuideMask : MaskableGraphic, ICanvasRaycastFilter
|
|
{
|
|
private RectTransform _target;
|
|
private RectTransform _targetArea;
|
|
private Vector2 _targetMin;
|
|
private Vector2 _targetMax;
|
|
|
|
public bool IsRaycastLocationValid(Vector2 screenPoint, Camera eventCamera)
|
|
{
|
|
return !RectTransformUtility.RectangleContainsScreenPoint(_targetArea, screenPoint, eventCamera);
|
|
}
|
|
|
|
public void Init()
|
|
{
|
|
_targetArea = gameObject.transform.Find("TargetArea") as RectTransform;
|
|
gameObject.SetActive(false);
|
|
}
|
|
|
|
public void Play(RectTransform target)
|
|
{
|
|
gameObject.SetActive(true);
|
|
|
|
var screenPoint = RectTransformUtility.WorldToScreenPoint(KUIRoot.RootCamera, target.position);
|
|
|
|
Vector2 localPoint;
|
|
if (!RectTransformUtility.ScreenPointToLocalPointInRectangle(rectTransform, screenPoint, KUIRoot.RootCamera, out localPoint))
|
|
{
|
|
gameObject.SetActive(false);
|
|
return;
|
|
}
|
|
|
|
_targetArea.anchorMax = target.anchorMax;
|
|
_targetArea.anchorMin = target.anchorMin;
|
|
_targetArea.anchoredPosition = target.anchoredPosition;
|
|
_targetArea.anchoredPosition3D = target.anchoredPosition3D;
|
|
_targetArea.offsetMax = target.offsetMax;
|
|
_targetArea.offsetMin = target.offsetMin;
|
|
_targetArea.pivot = target.pivot;
|
|
_targetArea.sizeDelta = target.sizeDelta;
|
|
_targetArea.localPosition = localPoint;
|
|
|
|
_targetArea.ForceUpdateRectTransforms();
|
|
_target = _targetArea;
|
|
_target.ForceUpdateRectTransforms();
|
|
LateUpdate();
|
|
}
|
|
|
|
private void RefreshView()
|
|
{
|
|
Vector2 newMin;
|
|
Vector2 newMax;
|
|
if (_target && _target.gameObject.activeSelf)
|
|
{
|
|
var bounds = RectTransformUtility.CalculateRelativeRectTransformBounds(transform, _target);
|
|
newMin = bounds.min;
|
|
newMax = bounds.max;
|
|
}
|
|
else
|
|
{
|
|
newMin = Vector2.zero;
|
|
newMax = Vector2.zero;
|
|
}
|
|
|
|
if (_targetMin != newMin || _targetMax != newMax)
|
|
{
|
|
_targetMin = newMin;
|
|
_targetMax = newMax;
|
|
SetAllDirty();
|
|
}
|
|
}
|
|
|
|
protected override void OnPopulateMesh(VertexHelper toFill)
|
|
{
|
|
toFill.Clear();
|
|
|
|
var maskRect = rectTransform.rect;
|
|
|
|
var maskRectLeftTop = new Vector2(-maskRect.width / 2, maskRect.height / 2);
|
|
var maskRectLeftBottom = new Vector2(-maskRect.width / 2, -maskRect.height / 2);
|
|
var maskRectRightTop = new Vector2(maskRect.width / 2, maskRect.height / 2);
|
|
var maskRectRightBottom = new Vector2(maskRect.width / 2, -maskRect.height / 2);
|
|
|
|
var targetRectLeftTop = new Vector2(_targetMin.x, _targetMax.y);
|
|
var targetRectLeftBottom = _targetMin;
|
|
var targetRectRightTop = _targetMax;
|
|
var targetRectRightBottom = new Vector2(_targetMax.x, _targetMin.y);
|
|
|
|
var vertex = UIVertex.simpleVert;
|
|
toFill.AddVert(maskRectLeftBottom, color, Vector2.zero);
|
|
toFill.AddVert(targetRectLeftBottom, color, Vector2.zero);
|
|
toFill.AddVert(targetRectRightBottom, color, Vector2.zero);
|
|
toFill.AddVert(maskRectRightBottom, color, Vector2.zero);
|
|
toFill.AddVert(targetRectRightTop, color, Vector2.zero);
|
|
toFill.AddVert(maskRectRightTop, color, Vector2.zero);
|
|
toFill.AddVert(targetRectLeftTop, color, Vector2.zero);
|
|
toFill.AddVert(maskRectLeftTop, color, Vector2.zero);
|
|
|
|
toFill.AddTriangle(0, 1, 2);
|
|
toFill.AddTriangle(2, 3, 0);
|
|
toFill.AddTriangle(3, 2, 4);
|
|
toFill.AddTriangle(4, 5, 3);
|
|
toFill.AddTriangle(6, 7, 5);
|
|
toFill.AddTriangle(5, 4, 6);
|
|
toFill.AddTriangle(7, 6, 1);
|
|
toFill.AddTriangle(1, 0, 7);
|
|
}
|
|
|
|
void LateUpdate()
|
|
{
|
|
RefreshView();
|
|
}
|
|
}
|