style: code format
parent
1b5588f418
commit
56dfb3c96e
|
|
@ -1,35 +1,32 @@
|
|||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
using UnityEngine;
|
||||
using UnityEngine.UI;
|
||||
|
||||
namespace Coffee.UIExtensions.Demos
|
||||
{
|
||||
public class Unmask_Demo : MonoBehaviour
|
||||
{
|
||||
[SerializeField] Button target;
|
||||
[SerializeField] Unmask unmask;
|
||||
[SerializeField] Graphic transition;
|
||||
[SerializeField] Image transitionImage;
|
||||
[SerializeField] Sprite unity_chan;
|
||||
[SerializeField] Sprite unity_frame;
|
||||
public class Unmask_Demo : MonoBehaviour
|
||||
{
|
||||
[SerializeField] Unmask unmask = null;
|
||||
[SerializeField] Graphic transition = null;
|
||||
[SerializeField] Image transitionImage = null;
|
||||
[SerializeField] Sprite unity_chan = null;
|
||||
[SerializeField] Sprite unity_frame = null;
|
||||
|
||||
public void AutoFitToButton(bool flag)
|
||||
{
|
||||
unmask.fitOnLateUpdate = flag;
|
||||
}
|
||||
public void AutoFitToButton(bool flag)
|
||||
{
|
||||
unmask.fitOnLateUpdate = flag;
|
||||
}
|
||||
|
||||
public void SetTransitionColor(bool flag)
|
||||
{
|
||||
transition.color = flag ? Color.white : Color.black;
|
||||
}
|
||||
public void SetTransitionColor(bool flag)
|
||||
{
|
||||
transition.color = flag ? Color.white : Color.black;
|
||||
}
|
||||
|
||||
public void SetTransitionImage(bool flag)
|
||||
{
|
||||
transitionImage.sprite = flag ? unity_chan : unity_frame;
|
||||
transitionImage.SetNativeSize();
|
||||
var size = transitionImage.rectTransform.rect.size;
|
||||
transitionImage.rectTransform.sizeDelta = new Vector2(150, size.y / size.x * 150);
|
||||
}
|
||||
}
|
||||
public void SetTransitionImage(bool flag)
|
||||
{
|
||||
transitionImage.sprite = flag ? unity_chan : unity_frame;
|
||||
transitionImage.SetNativeSize();
|
||||
var size = transitionImage.rectTransform.rect.size;
|
||||
transitionImage.rectTransform.sizeDelta = new Vector2(150, size.y / size.x * 150);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1,221 +1,223 @@
|
|||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
using UnityEngine;
|
||||
using UnityEngine.Profiling;
|
||||
using UnityEngine.Rendering;
|
||||
using UnityEngine.UI;
|
||||
|
||||
|
||||
namespace Coffee.UIExtensions
|
||||
{
|
||||
/// <summary>
|
||||
/// Reverse masking for parent Mask component.
|
||||
/// </summary>
|
||||
[ExecuteInEditMode]
|
||||
[AddComponentMenu("UI/Unmask/Unmask", 1)]
|
||||
public class Unmask : MonoBehaviour, IMaterialModifier
|
||||
{
|
||||
//################################
|
||||
// Constant or Static Members.
|
||||
//################################
|
||||
static readonly Vector2 s_Center = new Vector2(0.5f, 0.5f);
|
||||
/// <summary>
|
||||
/// Reverse masking for parent Mask component.
|
||||
/// </summary>
|
||||
[ExecuteInEditMode]
|
||||
[AddComponentMenu("UI/Unmask/Unmask", 1)]
|
||||
public class Unmask : MonoBehaviour, IMaterialModifier
|
||||
{
|
||||
//################################
|
||||
// Constant or Static Members.
|
||||
//################################
|
||||
private static readonly Vector2 s_Center = new Vector2(0.5f, 0.5f);
|
||||
|
||||
|
||||
//################################
|
||||
// Serialize Members.
|
||||
//################################
|
||||
[Tooltip("Fit graphic's transform to target transform.")]
|
||||
[SerializeField] RectTransform m_FitTarget;
|
||||
[Tooltip("Fit graphic's transform to target transform on LateUpdate every frame.")]
|
||||
[SerializeField] bool m_FitOnLateUpdate;
|
||||
[Tooltip ("Unmask affects only for children.")]
|
||||
[SerializeField] bool m_OnlyForChildren = false;
|
||||
[Tooltip("Show the graphic that is associated with the unmask render area.")]
|
||||
[SerializeField] bool m_ShowUnmaskGraphic = false;
|
||||
//################################
|
||||
// Serialize Members.
|
||||
//################################
|
||||
[Tooltip("Fit graphic's transform to target transform.")]
|
||||
[SerializeField] private RectTransform m_FitTarget;
|
||||
|
||||
[Tooltip("Fit graphic's transform to target transform on LateUpdate every frame.")]
|
||||
[SerializeField] private bool m_FitOnLateUpdate;
|
||||
|
||||
[Tooltip("Unmask affects only for children.")]
|
||||
[SerializeField] private bool m_OnlyForChildren = false;
|
||||
|
||||
[Tooltip("Show the graphic that is associated with the unmask render area.")]
|
||||
[SerializeField] private bool m_ShowUnmaskGraphic = false;
|
||||
|
||||
|
||||
//################################
|
||||
// Public Members.
|
||||
//################################
|
||||
/// <summary>
|
||||
/// The graphic associated with the unmask.
|
||||
/// </summary>
|
||||
public Graphic graphic{ get { return _graphic ?? (_graphic = GetComponent<Graphic>()); } }
|
||||
//################################
|
||||
// Public Members.
|
||||
//################################
|
||||
/// <summary>
|
||||
/// The graphic associated with the unmask.
|
||||
/// </summary>
|
||||
public MaskableGraphic graphic { get { return _graphic ?? (_graphic = GetComponent<MaskableGraphic>()); } }
|
||||
|
||||
/// <summary>
|
||||
/// Fit graphic's transform to target transform.
|
||||
/// </summary>
|
||||
public RectTransform fitTarget
|
||||
{
|
||||
get { return m_FitTarget; }
|
||||
set
|
||||
{
|
||||
m_FitTarget = value;
|
||||
FitTo(m_FitTarget);
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Fit graphic's transform to target transform.
|
||||
/// </summary>
|
||||
public RectTransform fitTarget
|
||||
{
|
||||
get { return m_FitTarget; }
|
||||
set
|
||||
{
|
||||
m_FitTarget = value;
|
||||
FitTo(m_FitTarget);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Fit graphic's transform to target transform on LateUpdate every frame.
|
||||
/// </summary>
|
||||
public bool fitOnLateUpdate{ get { return m_FitOnLateUpdate; } set { m_FitOnLateUpdate = value; } }
|
||||
/// <summary>
|
||||
/// Fit graphic's transform to target transform on LateUpdate every frame.
|
||||
/// </summary>
|
||||
public bool fitOnLateUpdate { get { return m_FitOnLateUpdate; } set { m_FitOnLateUpdate = value; } }
|
||||
|
||||
/// <summary>
|
||||
/// Show the graphic that is associated with the unmask render area.
|
||||
/// </summary>
|
||||
public bool showUnmaskGraphic
|
||||
{
|
||||
get { return m_ShowUnmaskGraphic; }
|
||||
set
|
||||
{
|
||||
m_ShowUnmaskGraphic = value;
|
||||
SetDirty();
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Show the graphic that is associated with the unmask render area.
|
||||
/// </summary>
|
||||
public bool showUnmaskGraphic
|
||||
{
|
||||
get { return m_ShowUnmaskGraphic; }
|
||||
set
|
||||
{
|
||||
m_ShowUnmaskGraphic = value;
|
||||
SetDirty();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Unmask affects only for children.
|
||||
/// </summary>
|
||||
public bool onlyForChildren
|
||||
{
|
||||
get { return m_OnlyForChildren; }
|
||||
set
|
||||
{
|
||||
m_OnlyForChildren = value;
|
||||
SetDirty ();
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Unmask affects only for children.
|
||||
/// </summary>
|
||||
public bool onlyForChildren
|
||||
{
|
||||
get { return m_OnlyForChildren; }
|
||||
set
|
||||
{
|
||||
m_OnlyForChildren = value;
|
||||
SetDirty();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Perform material modification in this function.
|
||||
/// </summary>
|
||||
/// <returns>Modified material.</returns>
|
||||
/// <param name="baseMaterial">Configured Material.</param>
|
||||
public Material GetModifiedMaterial(Material baseMaterial)
|
||||
{
|
||||
if (!isActiveAndEnabled)
|
||||
{
|
||||
return baseMaterial;
|
||||
}
|
||||
/// <summary>
|
||||
/// Perform material modification in this function.
|
||||
/// </summary>
|
||||
/// <returns>Modified material.</returns>
|
||||
/// <param name="baseMaterial">Configured Material.</param>
|
||||
public Material GetModifiedMaterial(Material baseMaterial)
|
||||
{
|
||||
if (!isActiveAndEnabled)
|
||||
{
|
||||
return baseMaterial;
|
||||
}
|
||||
|
||||
Transform stopAfter = MaskUtilities.FindRootSortOverrideCanvas(transform);
|
||||
var stencilDepth = MaskUtilities.GetStencilDepth(transform, stopAfter);
|
||||
var desiredStencilBit = 1 << stencilDepth;
|
||||
Transform stopAfter = MaskUtilities.FindRootSortOverrideCanvas(transform);
|
||||
var stencilDepth = MaskUtilities.GetStencilDepth(transform, stopAfter);
|
||||
var desiredStencilBit = 1 << stencilDepth;
|
||||
|
||||
StencilMaterial.Remove(_unmaskMaterial);
|
||||
_unmaskMaterial = StencilMaterial.Add(baseMaterial, desiredStencilBit - 1, StencilOp.Invert, CompareFunction.Equal, m_ShowUnmaskGraphic ? ColorWriteMask.All : (ColorWriteMask)0, desiredStencilBit - 1, (1 << 8) - 1);
|
||||
StencilMaterial.Remove(_unmaskMaterial);
|
||||
_unmaskMaterial = StencilMaterial.Add(baseMaterial, desiredStencilBit - 1, StencilOp.Invert, CompareFunction.Equal, m_ShowUnmaskGraphic ? ColorWriteMask.All : (ColorWriteMask)0, desiredStencilBit - 1, (1 << 8) - 1);
|
||||
|
||||
// Unmask affects only for children.
|
||||
var canvasRenderer = graphic.canvasRenderer;
|
||||
if (m_OnlyForChildren)
|
||||
{
|
||||
StencilMaterial.Remove (_revertUnmaskMaterial);
|
||||
_revertUnmaskMaterial = StencilMaterial.Add(baseMaterial, (1 << 7), StencilOp.Invert, CompareFunction.Equal, (ColorWriteMask)0, (1 << 7), (1 << 8) - 1);
|
||||
canvasRenderer.hasPopInstruction = true;
|
||||
canvasRenderer.popMaterialCount = 1;
|
||||
canvasRenderer.SetPopMaterial (_revertUnmaskMaterial, 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
canvasRenderer.hasPopInstruction = false;
|
||||
canvasRenderer.popMaterialCount = 0;
|
||||
}
|
||||
// Unmask affects only for children.
|
||||
var canvasRenderer = graphic.canvasRenderer;
|
||||
if (m_OnlyForChildren)
|
||||
{
|
||||
StencilMaterial.Remove(_revertUnmaskMaterial);
|
||||
_revertUnmaskMaterial = StencilMaterial.Add(baseMaterial, (1 << 7), StencilOp.Invert, CompareFunction.Equal, (ColorWriteMask)0, (1 << 7), (1 << 8) - 1);
|
||||
canvasRenderer.hasPopInstruction = true;
|
||||
canvasRenderer.popMaterialCount = 1;
|
||||
canvasRenderer.SetPopMaterial(_revertUnmaskMaterial, 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
canvasRenderer.hasPopInstruction = false;
|
||||
canvasRenderer.popMaterialCount = 0;
|
||||
}
|
||||
|
||||
return _unmaskMaterial;
|
||||
}
|
||||
return _unmaskMaterial;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Fit to target transform.
|
||||
/// </summary>
|
||||
/// <param name="target">Target transform.</param>
|
||||
public void FitTo(RectTransform target)
|
||||
{
|
||||
var rt = transform as RectTransform;
|
||||
/// <summary>
|
||||
/// Fit to target transform.
|
||||
/// </summary>
|
||||
/// <param name="target">Target transform.</param>
|
||||
public void FitTo(RectTransform target)
|
||||
{
|
||||
var rt = transform as RectTransform;
|
||||
|
||||
rt.pivot = target.pivot;
|
||||
rt.position = target.position;
|
||||
rt.rotation = target.rotation;
|
||||
rt.pivot = target.pivot;
|
||||
rt.position = target.position;
|
||||
rt.rotation = target.rotation;
|
||||
|
||||
var s1 = target.lossyScale;
|
||||
var s2 = rt.parent.lossyScale;
|
||||
rt.localScale = new Vector3(s1.x / s2.x, s1.y / s2.y, s1.z / s2.z);
|
||||
rt.sizeDelta = target.rect.size;
|
||||
rt.anchorMax = rt.anchorMin = s_Center;
|
||||
}
|
||||
var s1 = target.lossyScale;
|
||||
var s2 = rt.parent.lossyScale;
|
||||
rt.localScale = new Vector3(s1.x / s2.x, s1.y / s2.y, s1.z / s2.z);
|
||||
rt.sizeDelta = target.rect.size;
|
||||
rt.anchorMax = rt.anchorMin = s_Center;
|
||||
}
|
||||
|
||||
|
||||
//################################
|
||||
// Private Members.
|
||||
//################################
|
||||
Material _unmaskMaterial;
|
||||
Material _revertUnmaskMaterial;
|
||||
Graphic _graphic;
|
||||
//################################
|
||||
// Private Members.
|
||||
//################################
|
||||
private Material _unmaskMaterial;
|
||||
private Material _revertUnmaskMaterial;
|
||||
private MaskableGraphic _graphic;
|
||||
|
||||
/// <summary>
|
||||
/// This function is called when the object becomes enabled and active.
|
||||
/// </summary>
|
||||
void OnEnable()
|
||||
{
|
||||
if (m_FitTarget)
|
||||
{
|
||||
FitTo(m_FitTarget);
|
||||
}
|
||||
SetDirty();
|
||||
}
|
||||
/// <summary>
|
||||
/// This function is called when the object becomes enabled and active.
|
||||
/// </summary>
|
||||
private void OnEnable()
|
||||
{
|
||||
if (m_FitTarget)
|
||||
{
|
||||
FitTo(m_FitTarget);
|
||||
}
|
||||
SetDirty();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// This function is called when the behaviour becomes disabled () or inactive.
|
||||
/// </summary>
|
||||
void OnDisable()
|
||||
{
|
||||
StencilMaterial.Remove (_unmaskMaterial);
|
||||
StencilMaterial.Remove (_revertUnmaskMaterial);
|
||||
_unmaskMaterial = null;
|
||||
_revertUnmaskMaterial = null;
|
||||
/// <summary>
|
||||
/// This function is called when the behaviour becomes disabled () or inactive.
|
||||
/// </summary>
|
||||
private void OnDisable()
|
||||
{
|
||||
StencilMaterial.Remove(_unmaskMaterial);
|
||||
StencilMaterial.Remove(_revertUnmaskMaterial);
|
||||
_unmaskMaterial = null;
|
||||
_revertUnmaskMaterial = null;
|
||||
|
||||
if (graphic)
|
||||
{
|
||||
var canvasRenderer = graphic.canvasRenderer;
|
||||
canvasRenderer.hasPopInstruction = false;
|
||||
canvasRenderer.popMaterialCount = 0;
|
||||
graphic.SetMaterialDirty();
|
||||
}
|
||||
SetDirty ();
|
||||
}
|
||||
if (graphic)
|
||||
{
|
||||
var canvasRenderer = graphic.canvasRenderer;
|
||||
canvasRenderer.hasPopInstruction = false;
|
||||
canvasRenderer.popMaterialCount = 0;
|
||||
graphic.SetMaterialDirty();
|
||||
}
|
||||
SetDirty();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// LateUpdate is called every frame, if the Behaviour is enabled.
|
||||
/// </summary>
|
||||
void LateUpdate()
|
||||
{
|
||||
/// <summary>
|
||||
/// LateUpdate is called every frame, if the Behaviour is enabled.
|
||||
/// </summary>
|
||||
private void LateUpdate()
|
||||
{
|
||||
#if UNITY_EDITOR
|
||||
if (m_FitTarget && (m_FitOnLateUpdate || !Application.isPlaying))
|
||||
if (m_FitTarget && (m_FitOnLateUpdate || !Application.isPlaying))
|
||||
#else
|
||||
if (m_FitTarget && m_FitOnLateUpdate)
|
||||
#endif
|
||||
{
|
||||
FitTo(m_FitTarget);
|
||||
}
|
||||
}
|
||||
{
|
||||
FitTo(m_FitTarget);
|
||||
}
|
||||
}
|
||||
|
||||
#if UNITY_EDITOR
|
||||
/// <summary>
|
||||
/// This function is called when the script is loaded or a value is changed in the inspector (Called in the editor only).
|
||||
/// </summary>
|
||||
void OnValidate()
|
||||
{
|
||||
SetDirty();
|
||||
}
|
||||
/// <summary>
|
||||
/// This function is called when the script is loaded or a value is changed in the inspector (Called in the editor only).
|
||||
/// </summary>
|
||||
private void OnValidate()
|
||||
{
|
||||
SetDirty();
|
||||
}
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// Mark the graphic as dirty.
|
||||
/// </summary>
|
||||
void SetDirty()
|
||||
{
|
||||
if (graphic)
|
||||
{
|
||||
graphic.SetMaterialDirty();
|
||||
}
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Mark the graphic as dirty.
|
||||
/// </summary>
|
||||
void SetDirty()
|
||||
{
|
||||
if (graphic)
|
||||
{
|
||||
graphic.SetMaterialDirty();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,46 +1,42 @@
|
|||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
using UnityEngine.UI;
|
||||
|
||||
using UnityEngine;
|
||||
|
||||
namespace Coffee.UIExtensions
|
||||
{
|
||||
/// <summary>
|
||||
/// Unmask Raycast Filter.
|
||||
/// The ray passes through the unmasked rectangle.
|
||||
/// </summary>
|
||||
[AddComponentMenu("UI/Unmask/UnmaskRaycastFilter", 2)]
|
||||
public class UnmaskRaycastFilter : MonoBehaviour, ICanvasRaycastFilter
|
||||
{
|
||||
//################################
|
||||
// Serialize Members.
|
||||
//################################
|
||||
[Tooltip("Target unmask component. The ray passes through the unmasked rectangle.")]
|
||||
[SerializeField] Unmask m_TargetUnmask;
|
||||
/// <summary>
|
||||
/// Unmask Raycast Filter.
|
||||
/// The ray passes through the unmasked rectangle.
|
||||
/// </summary>
|
||||
[AddComponentMenu("UI/Unmask/UnmaskRaycastFilter", 2)]
|
||||
public class UnmaskRaycastFilter : MonoBehaviour, ICanvasRaycastFilter
|
||||
{
|
||||
//################################
|
||||
// Serialize Members.
|
||||
//################################
|
||||
[Tooltip("Target unmask component. The ray passes through the unmasked rectangle.")]
|
||||
[SerializeField] private Unmask m_TargetUnmask;
|
||||
|
||||
|
||||
//################################
|
||||
// Public Members.
|
||||
//################################
|
||||
/// <summary>
|
||||
/// Target unmask component. Ray through the unmasked rectangle.
|
||||
/// </summary>
|
||||
public Unmask targetUnmask{ get { return m_TargetUnmask; } set { m_TargetUnmask = value; } }
|
||||
//################################
|
||||
// Public Members.
|
||||
//################################
|
||||
/// <summary>
|
||||
/// Target unmask component. Ray through the unmasked rectangle.
|
||||
/// </summary>
|
||||
public Unmask targetUnmask { get { return m_TargetUnmask; } set { m_TargetUnmask = value; } }
|
||||
|
||||
/// <summary>
|
||||
/// Given a point and a camera is the raycast valid.
|
||||
/// </summary>
|
||||
/// <returns>Valid.</returns>
|
||||
/// <param name="sp">Screen position.</param>
|
||||
/// <param name="eventCamera">Raycast camera.</param>
|
||||
public bool IsRaycastLocationValid(Vector2 sp, Camera eventCamera)
|
||||
{
|
||||
// Skip if deactived.
|
||||
if (!isActiveAndEnabled || !m_TargetUnmask || !m_TargetUnmask.isActiveAndEnabled)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
/// <summary>
|
||||
/// Given a point and a camera is the raycast valid.
|
||||
/// </summary>
|
||||
/// <returns>Valid.</returns>
|
||||
/// <param name="sp">Screen position.</param>
|
||||
/// <param name="eventCamera">Raycast camera.</param>
|
||||
public bool IsRaycastLocationValid(Vector2 sp, Camera eventCamera)
|
||||
{
|
||||
// Skip if deactived.
|
||||
if (!isActiveAndEnabled || !m_TargetUnmask || !m_TargetUnmask.isActiveAndEnabled)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
// check inside
|
||||
if (eventCamera)
|
||||
|
|
@ -51,18 +47,18 @@ namespace Coffee.UIExtensions
|
|||
{
|
||||
return !RectTransformUtility.RectangleContainsScreenPoint((m_TargetUnmask.transform as RectTransform), sp);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//################################
|
||||
// Private Members.
|
||||
//################################
|
||||
//################################
|
||||
// Private Members.
|
||||
//################################
|
||||
|
||||
/// <summary>
|
||||
/// This function is called when the object becomes enabled and active.
|
||||
/// </summary>
|
||||
void OnEnable()
|
||||
{
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// This function is called when the object becomes enabled and active.
|
||||
/// </summary>
|
||||
void OnEnable()
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue