UGUI 特效怎样在UI上裁剪

  刚好碰到有人问怎样把粒子特效放到 UI 上并且能正确被 Mask 裁剪, 首先想到给粒子效果的 Shader 添加模板模仿一般 UI 的模板方式, 应该就能正确裁剪了吧, 不过没那么简单, 我们看到在一般 UI 上, 没在 Mask 下的 UI 对比在 Mask 下的 UI, 它们的材质设置是不一样的, 也就是说有哪个组件对材质进行了修改, 查了一下就是 Mask 组件, 它会收集子节点下的所有对象, 然后对可以修改的材质进行修改, 所以才能自动控制裁剪.

  为了搞清楚, 这里做了一下测试:

1. 创建一个 UI Shader, 直接从 UI/Default 复制过来, 代码和內建完全一样.

2. 创建 ScrollView, 并添加一个默认图片, 添加一个 Quad 使用 MyImage 材质

  普通 Image 看到材质被修改了

  这个 Quad 就跟普通特效一样, 材质是没有被修改的

3. 我们创建一个类继承 MaskableGraphic 看看添加上去之后有什么效果

using UnityEngine;
using UnityEngine.UI;

[ExecuteInEditMode]
public class MyUI : MaskableGraphic
{
}

  看到只要它继承了MaskableGraphic 就会被 Mask 找到, 然后材质就会被设置为裁剪了. 只不过这个 Quad 的渲染已经完全跟它的模型没有任何关系了...

--------------------------------------------------------------------------------------------------------------------------

  引擎提供的方法就比较简单了, 只要加一个 Sprite Mask, 外加粒子渲染器中选上 Masking 选项即可. 不过由于使用上的原因, UI 系统就只能使用相机渲染模式了, 因为 Overlay 模式不能控制显示对象, 粒子系统就无法被显示出来.

1. 添加 Sprite Mask

2. 粒子效果打开 Masking, 让它在 Mask 范围内显示

  这样就能在 Sprite Mask 范围内显示了, 不过官方提供的方法如果越简单, 出问题的几率就越大, 果然, 如果有多个 Sprite Mask 的话, 它们之间即使没有层级关系, 也是会穿插的...

  同一个层级的两个 Mask, 两个粒子发射器发射不同颜色的球, 结果粒子能在另一个 Sprite Mask 中显示出来...

原文地址:https://www.cnblogs.com/tiancaiwrk/p/12091637.html

时间: 2025-01-08 11:11:20

UGUI 特效怎样在UI上裁剪的相关文章

unity特效ParticleSystem在UI上缩放(自适应屏幕)

结合了下面这两个方案: http://www.xuanyusong.com/archives/4271 http://www.unity.5helpyou.com/3630.html 第一个方案,应付不了复杂些的特效: 两篇文章结合后的代码如下: using UnityEngine; using System.Collections; using System.Collections.Generic; public class ScaleParticles : MonoBehaviour { p

Unity3D_UGUI判断鼠标或者手指是否点击在UI上

比如战斗场景,UI和3D场景同时都需要响应触摸事件,如果同时响应可能就会出现触摸UI的时候影响到了3D部分.为了解决这个问题在判断3D响应之前要先判断手指是否点击在UI上. 以前NGUI的时候都是自己来发送射线判断,现在UGUI好了系统提供了更为简便的方法. #if UNITY_ANDROID && !UNITY_EDITOR #define ANDROID #endif #if UNITY_IPHONE && !UNITY_EDITOR #define IPHONE #e

unity区分点击在3D物体还是2D UI上

当场景中的3D物体需要响应点击,但同时有UI显示时,存在判断点击是在3D物体上还是UI上的问题,办法如下: 1. 射线检测所有2D 3D物体,有2D物体被检测到时表明当前有UI.但无论Physics2D.Raycast()还是Physics.Raycast()都只能检测到含有Collider组件的物体,普通UI如Image Button等一般用射线是不起作用的.EventSystem.current.RaycastAll()可以将当前屏幕上的所有可检测的物体全部检测到,该方法需要自己构造一个Po

如何查找Fiori UI上某个字段对应的后台存储表的名称

今天微信群里有朋友问到这个问题. 如果是SAPGUI里的事务码,比如MM01,对于开发者来说这个任务非常容易完成. 比如我想知道下图"Sales Unit"这个字段的值到底保存在哪张表的哪个字段里,只需要选中这个字段,按F1,在弹出窗口里即可得知表名是MVKE,字段名是VRKME. 在S/4 Fiori UI里,因为UI是由SAP UI5开发的,所以F1这个功能键无法继续使用.我们需要Chrome Development Tool的帮助. 还是看个具体例子: 我希望知道S/4HANA的

Android平台上裁剪m4a

Android手机上设置铃声的操作是比较灵活的,一般读者听到一首喜欢的歌曲,马上就可以对这首歌曲进行裁剪,裁剪到片段后,再通过系统的接口设置为铃声(电话铃声.闹钟铃声等). 前提是,播放这首歌的APP,需要提供裁剪歌曲的功能. 那么,怎么样实现截取音频文件的一个片段的功能呢? 小程很自然就想到使用FFmpeg命令来实现,之前介绍"从视频中提取图片"的内容就可以提取片段,比如: ffmpeg -ss 10 -i audio.mp3 -t 5 out.mp3上面的命令,从第10秒开始,提取

unity特效ParticleSystem用到UI上

A_ui为带特效的UI a_effect是A_ui上的特效 a_child_panel为A的字panel,在a_effect上 A的RenderQ:automatic a_child_panel的RenderQ:startAt 然后脚本设置,a_effect(所有子material)和a_child_panel的renderQ: 参考Ngui源代码:

在UI上显示Bitmap

这一课会演示如何运用前面几节课的内容,使用后台线程与Cache机制来加载图片到 ViewPager 与 GridView 组件,并且学习处理并发与配置改变问题. 实现加载图片到ViewPager(Load Bitmaps into a ViewPager Implementation) swipe view pattern是一个用来切换显示不同详情界面的很好的方法.(关于这种效果请先参看Android Design: Swipe Views). 你可以通过 PagerAdapter 与 View

[UGUI]你说UnityEngine.UI.Button是怎么通过拖动来增加OnClick的监听器的呢?

一.写在前面 按国际惯例,先来讲一讲怎么涉及到这里了.我希望一个UI模块在Awake场景加载之后就可以通过回调来响应服务器消息,但是因为这个模块在场景加载的时候并不会被激活,所以需要将事件的订阅提前到该模块被加载之前,这就让我想起来了UGUI的Button的onClick事件,既然如此那就让我们一起来发现真相把. 二.真相就在这里! 首先呢,UGUI是开源的,要看源码啊,就不得不推荐Resharper了,这个插件有一个Assembly Explorer的东西,可以看到dll中的内容.下面就是Bu

UGUI在两个UI间坐标转换

在UGUI中,在两个Canvas之间进行坐标转换,从CanvasA下的坐标转换到CanvasB下. 或者在同一个界面下,从不同的节点下,转成相同的坐标. 函数定义 public static bool ScreenPointToLocalPointInRectangle(RectTransform rect, Vector2 screenPoint, Camera cam, out Vector2 localPoint); 解释: rect:目标界面的节点 screenPoint:要转换的节点屏