UGUI中显示粒子特效

  今天在UGUI上显示粒子特效的时候遇到的一些问题,Mark一下。原理:修改特效中每一个ParticleSystem的Layer为UI,并且把ParticleSystemRenderer.sortingOrder值设置为大于Canvas中的sortingOrder值。其实就是控制两个组件

的Render Order。

1. 在UI控件上(eg: Image)显示一个粒子特效

  1).首先创建一个Canvas,RenderMode = Screen Space-Camera ,然后创建一个UICamera ,参数设置为:Clear Flags: Depth Only; Culling Mask : UI;

然后把这个UICamera设置为Canvas的RenderCamera。如下图:

2). 添加一个粒子特效预设Boom到Image1下面,我们需要在Image1上显示粒子效果。然后我们需要对这个Boom特效的中的粒子系统设置对应的sortingOrder为1

  添加一个脚本UIEffectPlayer.cs到这个go上,它会递归遍历这个预设上的所有子对象,分别设置它们的sortingOrder和所属Layer。代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class UIEffectPlayer : MonoBehaviour {

    // Use this for initialization
    void Awake()
    {
        if (gameObject.GetComponent<RectTransform>() == null)
        {
            RectTransform rt = gameObject.AddComponent<RectTransform>();
            rt.anchorMin = Vector3.zero;
            rt.anchorMax = Vector3.zero;
            rt.anchoredPosition = new Vector2(130, 160);
        }

        //设置所有的粒子特效的Layer为UI,把粒子系统的Render的sortingOrder设置为大于Canvas的OrderInLayer
        //Canvas的Order In Layer默认为0,所以这里默认设置为1
        SetLayerAndSortOrder(gameObject.transform,5,1);
    }

    void SetLayerAndSortOrder(Transform parent,int layer,int sortOrder)
    {
        parent.gameObject.layer = layer;
        ParticleSystem ps = parent.GetComponent<ParticleSystem>();
        if (ps != null)
        {
            ParticleSystemRenderer psRender = gameObject.GetComponent<ParticleSystemRenderer>();
            if(psRender != null)
            {
                psRender.sortingOrder = sortOrder;
            }
        }

        foreach(Transform child in parent)
        {
            SetLayerAndSortOrder(child, layer,sortOrder);
        }
    }
    void Start () {

    }

    // Update is called once per frame
    void Update () {

    }
}

3).运行游戏即可看见特效显示在Image1上面。

2. 如果需要在两个UI层之间显示特效怎么办?(特效Boom显示在图片Image1和Image2之间)

  很容易想到的办法是新创建一个Canvas,(这个Canvas类似NGUI中的UIPanel)将其sortingOrder的值设置为大于粒子系统的sortingOrder的值,然后将Image2放到Canvas2下面进行绘制。

效果如下:

可以看到Boom特效显示在Image1和Image2之间了,Image2显示为半透明。好像还有别的办法不用新建一个Canvas,

后续试试再写进去。欢迎留言指教。

参考:https://docs.unity3d.com/ScriptReference/Renderer-sortingOrder.html

     https://docs.unity3d.com/ScriptReference/Canvas.html

https://docs.unity3d.com/ScriptReference/ParticleSystem.html

     https://answers.unity.com/questions/306777/how-to-access-particlesystemrenderer.html

----码字不易,欢迎转载,但保留版权,请于明显处标明出处:http://www.cnblogs.com/beeasy/

  

原文地址:https://www.cnblogs.com/beeasy/p/8678195.html

时间: 2024-11-10 11:08:22

UGUI中显示粒子特效的相关文章

Unity中的粒子特效的 RendererQ 排序

这里接https://www.cnblogs.com/luguoshuai/p/10021660.html 这里介绍两套粒子排序的方法. 首先声明,这两套排序方法均不是本人所写,是在项目开发的过程当中,看到同事的设计,然后我就记录了下来了,作为后续的学习与使用. 方法一: 1 using System.Collections.Generic; 2 using UnityEngine; 3 4 public class UIRenderQueueSorter : MonoBehaviour 5 {

Unity NGUI和UGUI与模型、特效的层级关系

目录 1.介绍两大UI插件NGUI和UGUI 2.unity渲染顺序控制方式 3.NGUI的控制 4.UGUI的控制 5.模型深度的控制 6.粒子特效深度控制 7.NGUI与模型和粒子特效穿插层级管理 8.UGUI与模型和粒子特效穿插层级管理 写在前面 这篇笔记是整理了之前做的记录,在做项目的过程中,遇到了各种各样的界面穿插问题,界面层级混乱,比如,手机卡了或点快了,就导致两个界面相互交叉.对于界面,这应该算是一个很严重的bug,很大部分原因是整个UI框架没有从整体上考虑这个,后来决心弄清楚层级

Unity3d开发(十九)调整SortingOrder解决UGUI中粒子层级问题

为了做出更酷炫的的UI效果,通常要在UI中加入粒子效果.但与纯2D的UI动画或Spine不同,粒子在场景中制作,会存在与UI的穿插问题.本文探讨如何更改特效或UI的SortingOrder避免穿插. 前提条件 首先,Canvas的类型是一切的基础,我使用的Canvas是Screen-Space ,所有UI通过一个正交摄像机照出来.制作UI通常使用这种模式,本文不讨论其他情况. 核心原理 通过更改渲染的顺序来改变遮挡关系.一方面UGUI会根据Hierarchy中的控件顺序进行排序.因此对于Anim

UGUI中粒子特效与UI的遮挡问题

问题背景: 在做主线任务时发现完成任务后的特效显示穿透上面的UI层,不美观,策划不乐意了,抓紧解决下 解决思路: 首先讲下影响渲染顺序的因素: 能够影响渲染顺序的因素有:1.Camera Depth     相机组件上设置的相机深度,深度越大越靠后渲染. 2.Sorting Layer      在Tags & Layers设置中可见 3.Order In Layer 相对于Sorting Layer的子排序,用这个值做比较时只有都在同一层时才有效.4.RenderQueue     Shade

Unity之粒子特效参数详解——中

接<Unity之粒子特效参数详解--上>继续写,Unity之粒子特效参数详解--上链接为:http://www.cnblogs.com/yikecaidechengzhangshi/p/6991750.html 步骤二:参数设置如图 Material可以自己找一个火焰贴图,Shader参数改为:Pariticles-Additive,参图: 剩下的明天再写,今天先这样,明天回来再补充修改.

Mask裁切UI粒子特效或者3D模型

刚好前几天有人问我这个问题,再加上新项目也可能用,所以这两天就研究了一下.其实如果粒子特效 和3D模型 都用RenderTexture来做的话就不会有裁切的问题,但是粒子特效用RenderTexture来做会有显示的问题,所以还是得用摄像机.废话不多说了,进入正题. 原理就是把Mask的裁切区域传给粒子特效Shader,当超出这个区域那么直接让它完全透明即可.粒子特效的源生shader大家可以去unity官网下载,我在这里把需要修改的地方标注给大家. //add 注释中的内容就是我做修改的地方.

【Unity 3D】学习笔记四十二:粒子特效

粒子特效 粒子特效的原理是将若干粒子无规则的组合在一起,来模拟火焰,爆炸,水滴,雾气等效果.要使用粒子特效首先要创建,在hierarchy视图中点击create--particle system即可 粒子发射器 粒子发射器是用于设定粒子的发射属性,比如说粒子的大小,数量和速度等.在创建完粒子对象后,在右侧inspector视图中便可以看到所有的粒子属性: emit:是否是使用粒子发射器. min size:粒子最小尺寸. max size:粒子最大尺寸. min energy:粒子的最小生命周期

【Stage3D学习笔记续】真正的3D世界(五):粒子特效

先看效果,按下空格键添加粒子特效: 一般而言粒子特效的实现都是比较复杂的,且不说实现粒子特效的编码和设计,光是编写一个粒子编辑器就不是简单的一件事,但是作者使用了很取巧的方式来完成,我们接下来深入代码看看作者是怎么处理的. Particle 在我还没有看这本书的这章之前我认为一个Particle应该是一个单一的粒子(或许是一个面片或者是一个简单的模型),而最终的粒子效果则是有成千上万个Particle组成渲染得出的,所以应该存在一个JSON或XML描述文件来指定每个粒子的运动轨迹和生命周期,不过

[GEiv]第六章:粒子特效 绚丽的火焰与爆炸

第六章:粒子特效 绚丽的火焰与爆炸 本章节主要介绍粒子特效设计的方法论,其中有相当的知识量是平台无关的:在本文中会以"爆炸"这个实际的例子为线索,进行详细的设计讲解,并最终使用GEiv实现它. [为什么要使用"粒子"] 实现粒子特效的首要目的,是对一些环境效果进行模拟仿真,常见的环境效果,例如火焰.爆炸.雨.雪.雾等,都是无数微小的粒子以某些规律共同作用的结果.而对于计算机来讲,虽然没有足够的运算能力对每一个自然粒子进行抽象,但我们可以借鉴其原理,使用相对更少的粒子