unity让meshRenderer的渲染层级位于ngui的渲染序列中

参考方案:NGUI中穿插粒子或者mesh渲染层级

在UIpanel.cs/UIDrawCall.cs/UIWidget中添加 onRenderQueueChanged回调的位置参考中已经给出了,此处不赘述了

UITextureRecombine.cs

/*
 *2018-07-20 19:49:00 By Bo
 */
using UnityEngine;
using System.Collections;
using UnityEngine.Rendering;

[ExecuteInEditMode]
[RequireComponent(typeof(MeshFilter))]
[RequireComponent(typeof(MeshRenderer))]
[AddComponentMenu("NGUI/UI/NGUI TextureRecombine")]
public class UITextureRecombine : UIWidget
{
    int BaseW = 1334;
    int BaseH = 750;
    // 维护材质 贴图 以及 shader 
    [HideInInspector][SerializeField] Material mMaterial;
    [HideInInspector][SerializeField] Texture mMainTexture;
    [HideInInspector][SerializeField] Shader mShader;

    [HideInInspector][SerializeField] MeshFilter mMeshFilter;
    [HideInInspector][SerializeField] MeshRenderer mMeshRenderer;

    MeshFilter meshFilter
    {
        get
        {
            if (mMeshFilter == null) {
                mMeshFilter = GetComponent<MeshFilter>();
            }
            return mMeshFilter;
        }

        set
        {
            mMeshFilter = value;
        }
    }

    MeshRenderer meshRenderer
    {
        get
        { 
            if (mMeshRenderer == null) {
                mMeshRenderer = GetComponent<MeshRenderer>();
                mMeshRenderer.sharedMaterial = material;
                mMeshRenderer.sharedMaterial.shader = shader;
                mMeshRenderer.shadowCastingMode = ShadowCastingMode.Off;
                mMeshRenderer.receiveShadows = false;
                mMeshRenderer.motionVectors = false;
                mMeshRenderer.lightProbeUsage = LightProbeUsage.Off;
                mMeshRenderer.reflectionProbeUsage = ReflectionProbeUsage.Off;

                Recombine();
            }
            return mMeshRenderer;
        }
        set
        {
            mMeshRenderer = value;
        }
    }


    // 重写
    public override Material material
    {
        get
        {
            if (mMaterial == null) mMaterial = new Material(shader);
            return mMaterial;
        }

        set
        {
            mMaterial = value;
        }
    }

    public override Shader shader
    {
        get
        {
            if (mShader == null) mShader = Shader.Find("Unlit/UITextureRecombine");
            return mShader;
        }

        set
        {
            mShader = value;
        }
    }

    public override Texture mainTexture
    {
        get
        {
            return mMainTexture;
        }

        set
        {
            mMainTexture = value;
            meshRenderer.sharedMaterial.mainTexture = mMainTexture;
        }
    }

    protected override void Awake()
    {
        mMainTexture = meshRenderer.sharedMaterial.mainTexture;

        // 这里缓存设置Drawcall渲染层级时的回调
        onRenderQueueChanged = OnRQChanged;

        base.Awake();
    }

    void OnRQChanged(int rq)
    {
        meshRenderer.sharedMaterial.renderQueue = rq;
        meshRenderer.sharedMaterial.shader = shader;
    }

    protected override void OnInit()
    {
        base.OnInit();
    }

    protected override void OnStart()
    {
        base.OnStart();
    }

    protected override void OnEnable()
    {
        base.OnEnable();
    }

    protected override void OnDisable()
    {
        base.OnDisable();
    }

    protected override void OnUpdate()
    {
        base.OnUpdate();
    }

    public override void OnFill(BetterList<Vector3> verts, BetterList<Vector2> uvs, BetterList<Color32> cols)
    {
        // 创建一个空四边形占据一个dc;如过这里是空的话该组件就不会生成dc所以必须有一个;
        verts.Add(new Vector3(1, 0, 1));
        verts.Add(new Vector3(1, 0, -1));
        verts.Add(new Vector3(-1, 0, 1));
        verts.Add(new Vector3(-1, 0, -1));

        uvs.Add(new Vector2(1, 1));
        uvs.Add(new Vector2(1, 0));
        uvs.Add(new Vector2(0, 1));
        uvs.Add(new Vector2(0, 0));

        cols.Add(new Color32(255, 255, 255, 0));
        cols.Add(new Color32(255, 255, 255, 0));
        cols.Add(new Color32(255, 255, 255, 0));
        cols.Add(new Color32(255, 255, 255, 0));

        base.OnFill(verts, uvs, cols);
        if (onPostFill != null)
            onPostFill(this, verts.size, verts, uvs, cols);

        meshRenderer.sharedMaterial.color = color;
        transform.localScale = new Vector3 ((float)width/BaseW,(float)height/BaseH,1f);
    }

    public override void MakePixelPerfect ()
    {
        width = BaseW;
        height = BaseH;
        transform.localScale = new Vector3 ((float)width/BaseW,(float)height/BaseH,1f);
    }

    //这里是自定意一个mesh的渲染规则(图片的重组方案,后续会重开一片文章写这个优化的方法)
    //https://blog.csdn.net/u010314160/article/details/81144180
    void Recombine()
    {
        float value = 1 / 1024f;
        float halfx = - 1334/2f;
        float halfy = - 750 / 2f;
        Vector3[] newVertices = {
                                    new Vector3(1024f + halfx, 476f + halfy, 0),//0
                                    new Vector3(1334f + halfx, 476f + halfy, 0),//1
                                    new Vector3(1024f + halfx, 750f + halfy, 0),//2
                                    new Vector3(1334f + halfx, 750f + halfy, 0),//3

                                    new Vector3(1024f + halfx, 202f + halfy, 0),//4
                                    new Vector3(1334f + halfx, 202f + halfy, 0),//5
                                    new Vector3(1024f + halfx, 476f + halfy, 0),//6
                                    new Vector3(1334f + halfx, 476f + halfy, 0),//7

                                    new Vector3(1024f + halfx, 0 + halfy, 0),//8
                                    new Vector3(1334f + halfx, 0 + halfy, 0),//9
                                    new Vector3(1024 + halfx, 202f + halfy, 0),//10
                                    new Vector3(1334f + halfx, 202f + halfy, 0),//11

                                    new Vector3(0 + halfx, 0 + halfy, 0),//12
                                    new Vector3(1024f + halfx, 0 + halfy, 0),//13
                                    new Vector3(0 + halfx, 750f + halfy, 0),//14
                                    new Vector3(1024f + halfx, 750f + halfy, 0),//15
                                };
        Vector2[] newUV = {
                                new Vector3(0, 0),//0
                                new Vector3(310*value, 0),//1
                                new Vector3(0, 274*value),//2
                                new Vector3(310*value, 274*value),//3

                                new Vector3(310*value, 0),//4
                                new Vector3(620*value, 0),//5
                                new Vector3(310*value, 274*value),//6
                                new Vector3(620*value, 274*value),//7

                                new Vector3(620*value, 0),//8
                                new Vector3(930*value, 0),//9
                                new Vector3(620*value, 202*value),//10
                                new Vector3(930*value, 202*value),//11

                                new Vector3(0, 274*value),//12
                                new Vector3(1024*value, 274*value),//13
                                new Vector3(0, 1024*value),//14
                                new Vector3(1024*value, 1024*value),//15
                          };
        int[] newTriangles = { 
                                 0,2,1,
                                 1,2,3,

                                 4,6,5,
                                 5,6,7,

                                 9,8,10,
                                 9,10,11,

                                 13,12,14,
                                 13,14,15,
                             };

        Mesh mesh = new Mesh();
        meshFilter.mesh = mesh;

        mesh.vertices = newVertices;
        mesh.uv = newUV;
        mesh.triangles = newTriangles;
    }
}

UITextureRecombine.shader

Shader "Unlit/UITextureRecombine"
{
    Properties
    {
        _Color ("Color", Color) = (1,1,1,1)
        _MainTex ("Base (RGB), Alpha (A)", 2D) = "black" {}
    }

    SubShader
    {
        LOD 200

        Tags
        {
            "Queue" = "Transparent"
            "IgnoreProjector" = "True"
            "RenderType" = "Transparent"
        }

        Pass
        {
            Cull Off
            Lighting Off
            ZWrite Off
            Fog { Mode Off }
            Offset -1, -1
            Blend SrcAlpha OneMinusSrcAlpha

            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag           
            #include "UnityCG.cginc"

            sampler2D _MainTex;
            float4 _MainTex_ST;
            fixed4 _Color;

            struct appdata_t
            {
                float4 vertex : POSITION;
                float2 texcoord : TEXCOORD0;
                fixed4 color : COLOR;
            };

            struct v2f
            {
                float4 vertex : SV_POSITION;
                half2 texcoord : TEXCOORD0;
                fixed4 color : COLOR;
            };

            v2f o;

            v2f vert (appdata_t v)
            {
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.texcoord = v.texcoord;
                o.color = v.color;
                return o;
            }

            fixed4 frag (v2f IN) : COLOR
            {
                return tex2D(_MainTex, IN.texcoord) * IN.color * _Color;
            }
            ENDCG
        }
    }

}

在UIRoot下新建一个空物体,添加UITextureRecombine.cs脚本,指定Texture。调节Depth测试渲染顺序。
备注:这里的Pivot属性并没有实现,只是在调节Size的时候会依据一个固定的尺寸就行缩放,做屏幕适配的话,需要自行考虑了。
这里写图片描述

猜你喜欢

转载自blog.csdn.net/u010314160/article/details/81137832