使用了RectMask2D的列表使其子项加入的粒子物体受父物体的遮罩影响
核心:使用 Sprite Mask 组件 为特效层做遮罩处理
Sprite Mask设置
为列表Go新建子物体添加Sprite Mask组件
设置Sprite Mask 的Sprite
并取列表RectMask2D的 rectTransform
将新建物体设置为相应大小且位置同步
写了一个同步脚本来设置 可以在创建时加入Sprite Mask后挂载使用
根据mask的四个Corner坐标 来计算位置宽高以及scale 之后作为子物体移动到列表下
using UnityEngine;
using UnityEngine.UI;
[RequireComponent(typeof(SpriteMask))]
public class SetMaskScale : MonoBehaviour
{
public RectTransform mask;
private SpriteMask spriteMask;
private void Start()
{
if (mask == null)
{
var mask2D = transform.GetComponentInParent<RectMask2D>();
if (mask2D)
{
mask = mask2D.rectTransform;
}
}
spriteMask = GetComponent<SpriteMask>();
if (mask)
{
var corners = new Vector3[4];
mask.GetWorldCorners(corners);
var size = spriteMask.bounds.size;
var width = (corners[3].x - corners[0].x);
var height = (corners[1].y - corners[0].y);
var scaleX = width / size.x;
var scaleY = height / size.y;
var localScale = transform.localScale;
localScale.x *= scaleX;
localScale.y *= scaleY;
transform.localScale = localScale;
transform.position = (corners[0] + corners[2]) / 2;
}
}
}
在同步好mask区域后 设置Sprite Mask的自定义范围设置
将Sprite Mask的isCustomRangeActive设置为true
具有自定义范围设置的Sprite Mask 可以确保mask仅仅影响指定 front 到 back 图层范围内的Sprite
之后分别设置相应的层级ID和SortingOrder即可
frontSortingLayerID / frontSortingOrder / backSortingLayerID / backSortingOrder
粒子设置
Sprite Mask之后 取粒子Go子物体中的 ParticleSystemRenderer
设置其 **maskInteraction **属性 (Enum SpriteMaskInteraction) 为 SpriteMaskInteraction.VisibleInsideMask(sprite将会在蒙版区域内可见)
其指定了粒子如何与Sprite Mask交互
namespace UnityEngine
{
//
// 摘要:
// This enum controls the mode under which the sprite will interact with the masking
// system.
public enum SpriteMaskInteraction
{
//
// 摘要:
// The sprite will not interact with the masking system.
None = 0,
//
// 摘要:
// The sprite will be visible only in areas where a mask is present.
VisibleInsideMask = 1,
//
// 摘要:
// The sprite will be visible only in areas where no mask is present.
VisibleOutsideMask = 2
}
}
完成