Files
tianrunCRM/Assets/CoolapeFrame/Scripts/ui/public/CLUIRenderQueue.cs
2020-07-04 14:41:25 +08:00

170 lines
4.0 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
********************************************************************************
*Copyright(C),coolae.net
*Author: chenbin
*Version: 2.0
*Date: 2017-01-09
*Description: 在ui中使用粒子时需要绑定该脚本
* 主要功能是设置粒子的renderQueue,使粒子可以在两个页面之间显示,而不总是显示在最顶层
* 另外会自动添加一个uisprite目的是用这个sprite占一个renderqueue的位置
*Others:
*History:
*********************************************************************************
*/
using UnityEngine;
using System.Collections;
namespace Coolape
{
[RequireComponent (typeof(UISprite))]
public class CLUIRenderQueue : MonoBehaviour
{
public UIPanel _panel;
UISprite sprite;
public int depth = 0;
public int currRenderQueue = 0;
public bool isSharedMaterial = true;
public bool isForceUpdateSetRenderQueue = false;
Renderer[] _renders;
Renderer[] renders {
get {
if (_renders == null) {
_renders = GetComponentsInChildren<Renderer> ();
}
return _renders;
}
}
public UIPanel panel {
get {
if (_panel == null) {
_panel = GetComponentInParent<UIPanel> ();
}
return _panel;
}
}
// Use this for initialization
public void Start ()
{
mWidget.depth = depth;
#if UNITY_EDITOR
//因为是通过assetebundle加载的在真机上不需要处理只有在pc上需要重设置shader
// if (Application.isPlaying) {
// Utl.setBodyMatEdit (transform);
// }
#endif
}
public void reset()
{
reset(false);
}
public void reset(bool forceUpdate)
{
Start();
isForceUpdateSetRenderQueue = forceUpdate;
_renders = null;
}
public int mDepth {
get {
return depth;
}
set {
depth = value;
mWidget.depth = depth;
}
}
public UIWidget mWidget {
get {
if (sprite == null) {
// 建议使用 _empty 的 UITextures
sprite = GetComponent<UISprite> ();
sprite.height = 1;
sprite.width = 1;
sprite.alpha = 0.004f;
sprite.depth = depth;
if (sprite.atlas == null) {
sprite.atlas = CLUIInit.self.emptAtlas;
}
// 随便设置一个图给他,不然不能被渲染
if (CLUIInit.self.emptAtlas != null && CLUIInit.self.emptAtlas.spriteList.Count > 0) {
sprite.spriteName = (CLUIInit.self.emptAtlas.spriteList [0]).name;
}
}
return sprite;
}
}
// Update is called once per frame
void LateUpdate ()
{
#if UNITY_EDITOR
if (!Application.isPlaying) {
mWidget.depth = depth;
}
#endif
setRenderQueue (isForceUpdateSetRenderQueue);
}
void OnEnable(){
#if UNITY_EDITOR
if (!Application.isPlaying) {
mWidget.depth = depth;
}
#endif
setRenderQueue (true);
}
/// <summary>
/// Ons the finish load assets.配合CLSharedAssets使用
/// </summary>
/// <param name="go">Go.</param>
public void onFinishLoadAssets(GameObject go)
{
setRenderQueue();
}
[ContextMenu("setRenderQueue")]
public void setRenderQueueExe()
{
setRenderQueue(true);
}
public void setRenderQueue (bool isForce = false)
{
int newRenderQ = currRenderQueue;
Material mat = null;
if (mWidget != null && NGUITools.GetActive (mWidget)) {
if (mWidget.drawCall == null) {
#if UNITY_EDITOR
// Debug.LogWarning ("widget.drawCall == null");
#endif
mWidget.depth = depth;
} else {
newRenderQ = mWidget.drawCall.finalRenderQueue;
}
} else {
newRenderQ = panel != null ? panel.startingRenderQueue + depth : depth;
}
if (isForce || newRenderQ != currRenderQueue) {
for (int i = 0; i < renders.Length; i++) {
if (isSharedMaterial) {
mat = renders [i].sharedMaterial;
} else {
mat = renders [i].material;
}
if (mat != null) {
mat.renderQueue = newRenderQ;
}
}
currRenderQueue = newRenderQ;
}
}
}
}