| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248 | using System;using System.Collections;using System.Collections.Generic;using UnityEngine;using UnityEngine.Pool;using UnityEngine.Rendering;using UnityEngine.UI;using Utility;[ExecuteInEditMode][RequireComponent(typeof(RectTransform))][RequireComponent(typeof(CanvasRenderer))]public class UIObject : MaskableGraphic, IMeshModifier{    public static Map<Shader, List<string>> allShaderName = new Map<Shader, List<string>>();    private MaterialPropertyBlock MaterialPropertyBlock;    public Material _material;    public Mesh _Mesh;    public bool isNewMaterial;    private Renderer _renderer;    public Camera Camera;    // public    public override Material defaultMaterial    {        get { return _material; }    }    protected override void OnEnable()    {        canvasRenderer.Clear();        base.OnEnable();    }    protected override void OnDisable()    {        canvasRenderer.Clear();        base.OnDisable();    }    protected override void Awake()    {        base.Awake();        _renderer = gameObject.GetComponent<Renderer>();        if (_renderer == null)        {            return;        }        _renderer.enabled = false;        if (isNewMaterial)        {            _material = new Material(_renderer.sharedMaterial);        }        else        {            _material = _renderer.sharedMaterial;        }              // _material.shader.p        _Mesh = gameObject.GetComponent<MeshFilter>().sharedMesh;        if (_Mesh != null)        {            List<Vector3> nor = new List<Vector3>();            for (int i = 0; i < _Mesh.colors.Length; i++)            {                nor.Add(new Vector3(_Mesh.colors[i].r, _Mesh.colors[i].g, 0));            }            _Mesh.normals = nor.ToArray();        }    }    public override void Rebuild(CanvasUpdate update)    {        base.Rebuild(update);        if (update == CanvasUpdate.PreRender)        {        }    }    private void Update()    {        if (_material == null)        {            return;        }        if (MaterialPropertyBlock == null)        {            MaterialPropertyBlock = new MaterialPropertyBlock();        }        _renderer.GetPropertyBlock(MaterialPropertyBlock);        Shader shader = _material.shader;        if (!allShaderName.TryGetValue(shader, out List<string> keyName))        {            keyName = new List<string>();            for (int i = 0; i < _material.shader.GetPropertyCount(); i++)            {                string name = _material.shader.GetPropertyName(i);                keyName.Add(name);            }            allShaderName.Add(shader, keyName);        }        for (int i = 0; i < keyName.Count; i++)        {            string name = keyName[i];            if (name != null && MaterialPropertyBlock.HasProperty(name))            {                if (_material.shader.GetPropertyType(i) == ShaderPropertyType.Color)                {                    _material.SetColor(name, MaterialPropertyBlock.GetColor(name));                }                if (_material.shader.GetPropertyType(i) == ShaderPropertyType.Float)                {                    _material.SetFloat(name, MaterialPropertyBlock.GetFloat(name));                }                if (_material.shader.GetPropertyType(i) == ShaderPropertyType.Range)                {                    _material.SetFloat(name, MaterialPropertyBlock.GetFloat(name));                }                if (_material.shader.GetPropertyType(i) == ShaderPropertyType.Vector)                {                    _material.SetVector(name, MaterialPropertyBlock.GetVector(name));                }                if (_material.shader.GetPropertyType(i) == ShaderPropertyType.Int)                {                    _material.SetInt(name, MaterialPropertyBlock.GetInt(name));                }                if (_material.shader.GetPropertyType(i) == ShaderPropertyType.Texture)                {                    _material.SetTexture(name, MaterialPropertyBlock.GetTexture(name));                }            }        }    }    protected override void UpdateMaterial()    {        if (!IsActive())            return;        canvasRenderer.materialCount = 1;        canvasRenderer.SetMaterial(materialForRendering, 0);    }    [ContextMenu("刷新mesh")]    public void ShuaXing()    {        // _Mesh = gameObject.GetComponent<MeshFilter>().sharedMesh;        SetAllDirty();    }    protected override void OnPopulateMesh(VertexHelper vh)    {        base.OnPopulateMesh(vh);    }    private bool isAlater = false;    protected override void UpdateGeometry()    {        // if (rectTransform != null )        //     OnPopulateMesh(s_VertexHelper);        //        //        // var components = ListPool<Component>.Get();        // GetComponents(typeof(IMeshModifier), components);        //            // for (var i = 0; i < components.Count; i++)        //     ((IMeshModifier)components[i]).ModifyMesh(s_VertexHelper);        //        // ListPool<Component>.Release(components);        //        // s_VertexHelper.FillMesh(workerMesh);        // canvasRenderer.SetMesh(workerMesh);        // if (isAlater)        // {        //     return;        // }        //        // isAlater = true;        if (_renderer is LineRenderer)        {            LineRenderer lineRenderer = _renderer as LineRenderer;            _Mesh = new Mesh();            if (Camera == null)            {                Canvas canvas = transform.GetComponentInParent<Canvas>();                if (canvas != null)                {                    Camera = canvas.worldCamera;                }            }            if (Camera == null)            {                return;            }               lineRenderer.BakeMesh(_Mesh, Camera, transform);            List<Vector3> nor = new List<Vector3>();            for (int i = 0; i < _Mesh.colors.Length; i++)            {                nor.Add(new Vector3(_Mesh.colors[i].r, _Mesh.colors[i].g, 0));            }            _Mesh.normals = nor.ToArray();        }              canvasRenderer.SetMesh(_Mesh);    }    // protected override void OnPopulateMesh(VertexHelper vh)    // {    //     base.OnPopulateMesh(vh);    // }    public void ModifyMesh(Mesh mesh)    {    }    public void ModifyMesh(VertexHelper verts)    {        UIVertex vertex = new UIVertex();        for (int i = 0; i < verts.currentVertCount; i++)        {            verts.PopulateUIVertex(ref vertex, i);            vertex.color = _Mesh.colors[i];            vertex.normal = new Vector3(vertex.color.r, vertex.color.g);            verts.SetUIVertex(vertex, i);        }    }}
 |