Unity 关于特效和UI显示的优先级问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity 关于特效和UI显示的优先级问题相关的知识,希望对你有一定的参考价值。

参考技术A 渲染优先级有不同层次的控制

1.不同摄像机之间,通过Depth 来控制渲染顺序,这个优先级最高。

2.相同Depth情况下,通过修改SotingLayer来确定渲染顺序

3.相同SotingLayer下,通过sortingOrder(特效中叫做 Order in layer) 来控制。 

Camera.Depth-> Canvas.SotingLayer->Canvas.OrderInLayer

UGUI 的Canvas 的render mode (渲染模式)的选择

此模式  不需要摄像机。Canvas自适应屏幕大小,不经过投影空间,直接在屏幕上绘制

这种适合做纯2D游戏。  缺点是对特效不友好,因为界面永远显示在屏幕最前方

会在任何情况下都会遮挡住特效。

Canvas自适应屏幕大小,UI由相机负责渲染,这种非2D游戏都运用。

由于是相机负责渲染,所以,特效可以被显示出来。可以用UI相机显示,

也可以又专门的特效相机或者主相机渲染。不同相机之间,通过Depth来

控制渲染优先级,相同相机或者Depth之间,通过SortingOrder来控制

渲染优先级。

Canvas不会自适应屏幕大小,UI相当于是平面物体,UI的大小和位置是

通过UI和相机之间的距离 和位置来决定的。 适合制作角色头顶的血条等

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 {
    private List<float> m_initialSizes = new List<float>();

    public void CacheParticleScale() {
        // Save off all the initial scale values at start.
        ParticleSystem[] particles = gameObject.GetComponentsInChildren<ParticleSystem>();
        for (int i=0;i<particles.Length;i++) {
            m_initialSizes.Add(particles[i].startSize);
            
            ParticleSystemRenderer renderer = particles[i].GetComponent<ParticleSystemRenderer>();
            if (renderer) {
                m_initialSizes.Add(renderer.lengthScale);
                m_initialSizes.Add(renderer.velocityScale);
            }
        }
    }

    public void ResetParticleScale() {
        float designWidth = 1920;//开发时分辨率宽
        float designHeight = 1080;//开发时分辨率高
        float designScale = designWidth / designHeight;
        float scaleRate = (float)Screen.width / (float)Screen.height;
        float scaleFactor = scaleRate / designScale;

        // Scale all the particle components based on parent.
        int arrayIndex = 0;
        ParticleSystem[] particles = gameObject.GetComponentsInChildren<ParticleSystem>();
        for (int i = 0; i < particles.Length; i++) {
            float rate = 1;
            if (scaleRate < designScale) {
                rate = scaleFactor;
            }
            else {
                rate = 1;
            }

            particles[i].startSize = m_initialSizes[arrayIndex++] * rate;
            ParticleSystemRenderer renderer = particles[i].GetComponent<ParticleSystemRenderer>();
            if (renderer) {
                renderer.lengthScale = m_initialSizes[arrayIndex++] *
                rate;
                renderer.velocityScale = m_initialSizes[arrayIndex++] *
                rate;
            }
        }
    }
}

 

以上是关于Unity 关于特效和UI显示的优先级问题的主要内容,如果未能解决你的问题,请参考以下文章

unity3d怎么控制优先级

unity特效ParticleSystem用到UI上

Unity常用组件参数详解

Unity中那些事半功倍的好插件

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

Unity ShaderSpecial EffectsUI特效的动画播放器