UGUI播放UI特效以及解决特效与UI的层级问题

来源:互联网 发布:软件公寓如何申请 编辑:程序博客网 时间:2024/05/22 17:01

UGUI播放UI特效网上有不少人写了文章,比如http://www.xuanyusong.com/archives/3435

但实现的都不是很好,比如我的工程就只有一个Canvas,那么这篇文章的做法就不行了

而且当UI缩放时,特效也没有做相应的缩放的话,位置就会不对


参考3D引擎普遍的做法是RenderTarget渲染到Image上,然后就能解决上诉问题

网上有一篇文章讲了一些http://blog.sina.com.cn/s/blog_89d90b7c0102vhuk.html

但是我并不想像文章说的每个特效创建一个Camera

我的做法简单来说,用一个单独的EffectCamera照特效,遍历特效强制渲染,然后渲染到RenderTarget ,然后赋给RawImage

大体流程其实和上一篇文章一样,要解决的问题是如果只用一个摄像机,需要用到Camera.Render(),该函数是强制渲染当前摄像机视野内的物体

public static void OnPreCull()    {        if (SfxList_.Count == 0)        {            return;        }        foreach (var Entity in SfxList_)        {            if (!Entity.Value.IsLoad)            {                continue;            }            MiscUtil.ChangeLayer(Entity.Value.RawEffectObject, EffectLayer_);            Camera_.targetTexture = Entity.Value.RenderTarget;            Camera_.Render();            MiscUtil.ChangeLayer(Entity.Value.RawEffectObject, EffectHideLayer_);        }    }

原理就是摄像机只渲染Effect层级的特效,每次遍历渲染特效时先改成EffectLayer,渲染后改成另一个Layer继续渲染下一个

using UnityEngine;public class CameraExtends : MonoBehaviour{    void OnPreCull()    {        SfxManager.OnPreCull();    }}

这是函数入口,OnPreCull是Camera的回调函数,挂到主摄像机,在每次裁剪之前调用(其实应该用OnPreRender,但这个函数渲染会报错,提示不能再渲染流程动态添加渲染消息,Google了一番说是自Unity3D 4.3版本开始有的BUG,那么姑且就绕过吧)

一些参考链接

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

https://docs.unity3d.com/ScriptReference/Camera.Render.html

https://docs.unity3d.com/ScriptReference/Camera.OnPreCull.html

https://docs.unity3d.com/ScriptReference/Camera.OnPreRender.html

0 0
原创粉丝点击