栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 游戏开发 > 其他

使用了RectMask2D的列表使其子项加入的粒子物体受父物体的遮罩影响

其他 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

使用了RectMask2D的列表使其子项加入的粒子物体受父物体的遮罩影响

使用了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();
            if (mask2D)
            {
                mask = mask2D.rectTransform;
            }
        }
        spriteMask = GetComponent();
        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
    }
}

完成

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/901956.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号