福建省建设工程注册管理中心网站,wordpress购物插件,网站建设一般多少个板块,seo推广软件怎样Gpahic 的作用
Graphic 是 Unity最基础的图形基类。主要负责UGUI的显示部分。 由上图可以看你出我们经常使用的Image#xff0c;Text#xff0c;都是继承自Graphic。
Graphic的渲染流程
在Graphic的源码中有以下属性 [NonSerialized] private CanvasRenderer m_CanvasRend…Gpahic 的作用
Graphic 是 Unity最基础的图形基类。主要负责UGUI的显示部分。 由上图可以看你出我们经常使用的ImageText都是继承自Graphic。
Graphic的渲染流程
在Graphic的源码中有以下属性 [NonSerialized] private CanvasRenderer m_CanvasRenderer;
Graphic会收集渲染所需要的数据如顶点材质等信息。然后对 CanvasRenderer设置 材质Material、贴图Texture、网格 让其进行渲染到屏幕中。
以下是Graphic的源码
using System;
#if UNITY_EDITOR
using System.Reflection;
#endif
using System.Collections.Generic;
using UnityEngine.Events;
using UnityEngine.EventSystems;
using UnityEngine.Serialization;
using UnityEngine.UI.CoroutineTween;namespace UnityEngine.UI
{/// summary/// Base class for all UI components that should be derived from when creating new Graphic types./// /summary[DisallowMultipleComponent][RequireComponent(typeof(RectTransform))][ExecuteAlways]public abstract class Graphic: UIBehaviour,ICanvasElement{static protected Material s_DefaultUI null;static protected Texture2D s_WhiteTexture null;/// summary/// Default material used to draw UI elements if no explicit material was specified./// /summarystatic public Material defaultGraphicMaterial{get{if (s_DefaultUI null)s_DefaultUI Canvas.GetDefaultCanvasMaterial();return s_DefaultUI;}}// Cached and saved values[FormerlySerializedAs(m_Mat)][SerializeField] protected Material m_Material;[SerializeField] private Color m_Color Color.white;[NonSerialized] protected bool m_SkipLayoutUpdate;[NonSerialized] protected bool m_SkipMaterialUpdate;/// summary/// Base color of the Graphic./// /summary/// remarkspublic virtual Color color { get { return m_Color; } set { if (SetPropertyUtility.SetColor(ref m_Color, value)) SetVerticesDirty(); } }[SerializeField] private bool m_RaycastTarget true;/// summary/// Should this graphic be considered a target for raycasting?/// /summarypublic virtual bool raycastTarget{get{return m_RaycastTarget;}set{if (value ! m_RaycastTarget){if (m_RaycastTarget)GraphicRegistry.UnregisterRaycastGraphicForCanvas(canvas, this);m_RaycastTarget value;if (m_RaycastTarget isActiveAndEnabled)GraphicRegistry.RegisterRaycastGraphicForCanvas(canvas, this);}}}[SerializeField]private Vector4 m_RaycastPadding new Vector4();/// summary/// Padding to be applied to the masking/// X Left/// Y Bottom/// Z Right/// W Top/// /summarypublic Vector4 raycastPadding{get { return m_RaycastPadding; }set{m_RaycastPadding value;}}[NonSerialized] private RectTransform m_RectTransform;[NonSerialized] private CanvasRenderer m_CanvasRenderer;[NonSerialized] private Canvas m_Canvas;[NonSerialized] private bool m_VertsDirty;[NonSerialized] private bool m_MaterialDirty;[NonSerialized] protected UnityAction m_OnDirtyLayoutCallback;[NonSerialized] protected UnityAction m_OnDirtyVertsCallback;[NonSerialized] protected UnityAction m_OnDirtyMaterialCallback;[NonSerialized] protected static Mesh s_Mesh;[NonSerialized] private static readonly VertexHelper s_VertexHelper new VertexHelper();[NonSerialized] protected Mesh m_CachedMesh;[NonSerialized] protected Vector2[] m_CachedUvs;// Tween controls for the Graphic[NonSerialized]private readonly TweenRunnerColorTween m_ColorTweenRunner;protected bool useLegacyMeshGeneration { get; set; }// Called by Unity prior to deserialization,// should not be called by usersprotected Graphic(){if (m_ColorTweenRunner null)m_ColorTweenRunner new TweenRunnerColorTween();m_ColorTweenRunner.Init(this);useLegacyMeshGeneration true;}/// summary/// Set all properties of the Graphic dirty and needing rebuilt./// Dirties Layout, Vertices, and Materials./// /summarypublic virtual void SetAllDirty(){// Optimization: Graphic layout doesnt need recalculation if// the underlying Sprite is the same size with the same texture.// (e.g. Sprite sheet texture animation)if (m_SkipLayoutUpdate){m_SkipLayoutUpdate false;}else{SetLayoutDirty();}if (m_SkipMaterialUpdate){m_SkipMaterialUpdate false;}else{SetMaterialDirty();}SetVerticesDirty();}/// summary/// Mark the layout as dirty and needing rebuilt./// /summary/// remarks/// Send a OnDirtyLayoutCallback notification if any elements are registered. See RegisterDirtyLayoutCallback/// /remarkspublic virtual void SetLayoutDirty(){if (!IsActive())return;LayoutRebuilder.MarkLayoutForRebuild(rectTransform);if (m_OnDirtyLayoutCallback ! null)m_OnDirtyLayoutCallback();}/// summary/// Mark the vertices as dirty and needing rebuilt./// /summary/// remarks/// Send a OnDirtyVertsCallback notification if any elements are registered. See RegisterDirtyVerticesCallback/// /remarkspublic virtual void SetVerticesDirty(){if (!IsActive())return;m_VertsDirty true;CanvasUpdateRegistry.RegisterCanvasElementForGraphicRebuild(this);if (m_OnDirtyVertsCallback ! null)m_OnDirtyVertsCallback();}/// summary/// Mark the material as dirty and needing rebuilt./// /summary/// remarks/// Send a OnDirtyMaterialCallback notification if any elements are registered. See RegisterDirtyMaterialCallback/// /remarkspublic virtual void SetMaterialDirty(){if (!IsActive())return;m_MaterialDirty true;CanvasUpdateRegistry.RegisterCanvasElementForGraphicRebuild(this);if (m_OnDirtyMaterialCallback ! null)m_OnDirtyMaterialCallback();}protected override void OnRectTransformDimensionsChange(){if (gameObject.activeInHierarchy){// prevent double dirtying...if (CanvasUpdateRegistry.IsRebuildingLayout())SetVerticesDirty();else{SetVerticesDirty();SetLayoutDirty();}}}protected override void OnBeforeTransformParentChanged(){GraphicRegistry.UnregisterGraphicForCanvas(canvas, this);LayoutRebuilder.MarkLayoutForRebuild(rectTransform);}protected override void OnTransformParentChanged(){base.OnTransformParentChanged();m_Canvas null;if (!IsActive())return;CacheCanvas();GraphicRegistry.RegisterGraphicForCanvas(canvas, this);SetAllDirty();}/// summary/// Absolute depth of the graphic, used by rendering and events -- lowest to highest./// /summary/// example/// The depth is relative to the first root canvas.////// Canvas/// Graphic - 1/// Graphic - 2/// Nested Canvas/// Graphic - 3/// Graphic - 4/// Graphic - 5////// This value is used to determine draw and event ordering./// /examplepublic int depth { get { return canvasRenderer.absoluteDepth; } }/// summary/// The RectTransform component used by the Graphic. Cached for speed./// /summarypublic RectTransform rectTransform{get{// The RectTransform is a required component that must not be destroyed. Based on this assumption, a// null-reference check is sufficient.if (ReferenceEquals(m_RectTransform, null)){m_RectTransform GetComponentRectTransform();}return m_RectTransform;}}/// summary/// A reference to the Canvas this Graphic is rendering to./// /summary/// remarks/// In the situation where the Graphic is used in a hierarchy with multiple Canvases, the Canvas closest to the root will be used./// /remarkspublic Canvas canvas{get{if (m_Canvas null)CacheCanvas();return m_Canvas;}}private void CacheCanvas(){var list ListPoolCanvas.Get();gameObject.GetComponentsInParent(false, list);if (list.Count 0){// Find the first active and enabled canvas.for (int i 0; i list.Count; i){if (list[i].isActiveAndEnabled){m_Canvas list[i];break;}// if we reached the end and couldnt find an active and enabled canvas, we should return null . case 1171433if (i list.Count - 1)m_Canvas null;}}else{m_Canvas null;}ListPoolCanvas.Release(list);}/// summary/// A reference to the CanvasRenderer populated by this Graphic./// /summarypublic CanvasRenderer canvasRenderer{get{// The CanvasRenderer is a required component that must not be destroyed. Based on this assumption, a// null-reference check is sufficient.if (ReferenceEquals(m_CanvasRenderer, null)){m_CanvasRenderer GetComponentCanvasRenderer();if (ReferenceEquals(m_CanvasRenderer, null)){m_CanvasRenderer gameObject.AddComponentCanvasRenderer();}}return m_CanvasRenderer;}}/// summary/// Returns the default material for the graphic./// /summarypublic virtual Material defaultMaterial{get { return defaultGraphicMaterial; }}/// summary/// The Material set by the user/// /summarypublic virtual Material material{get{return (m_Material ! null) ? m_Material : defaultMaterial;}set{if (m_Material value)return;m_Material value;SetMaterialDirty();}}/// summary/// The material that will be sent for Rendering (Read only)./// /summary/// remarks/// This is the material that actually gets sent to the CanvasRenderer. By default its the same as [[Graphic.material]]. When extending Graphic you can override this to send a different material to the CanvasRenderer than the one set by Graphic.material. This is useful if you want to modify the user set material in a non destructive manner./// /remarkspublic virtual Material materialForRendering{get{var components ListPoolComponent.Get();GetComponents(typeof(IMaterialModifier), components);var currentMat material;for (var i 0; i components.Count; i)currentMat (components[i] as IMaterialModifier).GetModifiedMaterial(currentMat);ListPoolComponent.Release(components);return currentMat;}}/// summary/// The graphics texture. (Read Only)./// /summary/// remarks/// This is the Texture that gets passed to the CanvasRenderer, Material and then Shader _MainTex.////// When implementing your own Graphic you can override this to control which texture goes through the UI Rendering pipeline.////// Bear in mind that Unity tries to batch UI elements together to improve performance, so its ideal to work with atlas to reduce the number of draw calls./// /remarkspublic virtual Texture mainTexture{get{return s_WhiteTexture;}}/// summary/// Mark the Graphic and the canvas as having been changed./// /summaryprotected override void OnEnable(){base.OnEnable();CacheCanvas();GraphicRegistry.RegisterGraphicForCanvas(canvas, this);#if UNITY_EDITORGraphicRebuildTracker.TrackGraphic(this);
#endifif (s_WhiteTexture null)s_WhiteTexture Texture2D.whiteTexture;SetAllDirty();}/// summary/// Clear references./// /summaryprotected override void OnDisable(){
#if UNITY_EDITORGraphicRebuildTracker.UnTrackGraphic(this);
#endifGraphicRegistry.UnregisterGraphicForCanvas(canvas, this);CanvasUpdateRegistry.UnRegisterCanvasElementForRebuild(this);if (canvasRenderer ! null)canvasRenderer.Clear();LayoutRebuilder.MarkLayoutForRebuild(rectTransform);base.OnDisable();}protected override void OnDestroy(){if (m_CachedMesh)Destroy(m_CachedMesh);m_CachedMesh null;base.OnDestroy();}protected override void OnCanvasHierarchyChanged(){// Use m_Cavas so we dont auto call CacheCanvasCanvas currentCanvas m_Canvas;// Clear the cached canvas. Will be fetched below if active.m_Canvas null;if (!IsActive())return;CacheCanvas();if (currentCanvas ! m_Canvas){GraphicRegistry.UnregisterGraphicForCanvas(currentCanvas, this);// Only register if we are active and enabled as OnCanvasHierarchyChanged can get called// during object destruction and we dont want to register ourself and then become null.if (IsActive())GraphicRegistry.RegisterGraphicForCanvas(canvas, this);}}/// summary/// This method must be called when cCanvasRenderer.cull/c is modified./// /summary/// remarks/// This can be used to perform operations that were previously skipped because the cGraphic/c was culled./// /remarkspublic virtual void OnCullingChanged(){if (!canvasRenderer.cull (m_VertsDirty || m_MaterialDirty)){/// When we were culled, we potentially skipped calls to cRebuild/c.CanvasUpdateRegistry.RegisterCanvasElementForGraphicRebuild(this);}}/// summary/// Rebuilds the graphic geometry and its material on the PreRender cycle./// /summary/// param nameupdateThe current step of the rendering CanvasUpdate cycle./param/// remarks/// See CanvasUpdateRegistry for more details on the canvas update cycle./// /remarkspublic virtual void Rebuild(CanvasUpdate update){if (canvasRenderer null || canvasRenderer.cull)return;switch (update){case CanvasUpdate.PreRender:if (m_VertsDirty){UpdateGeometry();m_VertsDirty false;}if (m_MaterialDirty){UpdateMaterial();m_MaterialDirty false;}break;}}public virtual void LayoutComplete(){}public virtual void GraphicUpdateComplete(){}/// summary/// Call to update the Material of the graphic onto the CanvasRenderer./// /summaryprotected virtual void UpdateMaterial(){if (!IsActive())return;canvasRenderer.materialCount 1;canvasRenderer.SetMaterial(materialForRendering, 0);canvasRenderer.SetTexture(mainTexture);}/// summary/// Call to update the geometry of the Graphic onto the CanvasRenderer./// /summaryprotected virtual void UpdateGeometry(){if (useLegacyMeshGeneration){DoLegacyMeshGeneration();}else{DoMeshGeneration();}}private void DoMeshGeneration(){if (rectTransform ! null rectTransform.rect.width 0 rectTransform.rect.height 0)OnPopulateMesh(s_VertexHelper);elses_VertexHelper.Clear(); // clear the vertex helper so invalid graphics dont draw.var components ListPoolComponent.Get();GetComponents(typeof(IMeshModifier), components);for (var i 0; i components.Count; i)((IMeshModifier)components[i]).ModifyMesh(s_VertexHelper);ListPoolComponent.Release(components);s_VertexHelper.FillMesh(workerMesh);canvasRenderer.SetMesh(workerMesh);}private void DoLegacyMeshGeneration(){if (rectTransform ! null rectTransform.rect.width 0 rectTransform.rect.height 0){
#pragma warning disable 618OnPopulateMesh(workerMesh);
#pragma warning restore 618}else{workerMesh.Clear();}var components ListPoolComponent.Get();GetComponents(typeof(IMeshModifier), components);for (var i 0; i components.Count; i){
#pragma warning disable 618((IMeshModifier)components[i]).ModifyMesh(workerMesh);
#pragma warning restore 618}ListPoolComponent.Release(components);canvasRenderer.SetMesh(workerMesh);}protected static Mesh workerMesh{get{if (s_Mesh null){s_Mesh new Mesh();s_Mesh.name Shared UI Mesh;s_Mesh.hideFlags HideFlags.HideAndDontSave;}return s_Mesh;}}[System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)][Obsolete(Use OnPopulateMesh instead., true)]protected virtual void OnFillVBO(System.Collections.Generic.ListUIVertex vbo) {}[Obsolete(Use OnPopulateMesh(VertexHelper vh) instead., false)]/// summary/// Callback function when a UI element needs to generate vertices. Fills the vertex buffer data./// /summary/// param namemMesh to populate with UI data./param/// remarks/// Used by Text, UI.Image, and RawImage for example to generate vertices specific to their use case./// /remarksprotected virtual void OnPopulateMesh(Mesh m){OnPopulateMesh(s_VertexHelper);s_VertexHelper.FillMesh(m);}/// summary/// Callback function when a UI element needs to generate vertices. Fills the vertex buffer data./// /summary/// param namevhVertexHelper utility./param/// remarks/// Used by Text, UI.Image, and RawImage for example to generate vertices specific to their use case./// /remarksprotected virtual void OnPopulateMesh(VertexHelper vh){var r GetPixelAdjustedRect();var v new Vector4(r.x, r.y, r.x r.width, r.y r.height);Color32 color32 color;vh.Clear();vh.AddVert(new Vector3(v.x, v.y), color32, new Vector2(0f, 0f));vh.AddVert(new Vector3(v.x, v.w), color32, new Vector2(0f, 1f));vh.AddVert(new Vector3(v.z, v.w), color32, new Vector2(1f, 1f));vh.AddVert(new Vector3(v.z, v.y), color32, new Vector2(1f, 0f));vh.AddTriangle(0, 1, 2);vh.AddTriangle(2, 3, 0);}#if UNITY_EDITOR/// summary/// Editor-only callback that is issued by Unity if a rebuild of the Graphic is required./// Currently sent when an asset is reimported./// /summarypublic virtual void OnRebuildRequested(){// when rebuild is requested we need to rebuild all the graphics /// and associated components... The correct way to do this is by// calling OnValidate... Because MBs dont have a common base class// we do this via reflection. Its nasty and ugly... Editor only.m_SkipLayoutUpdate true;var mbs gameObject.GetComponentsMonoBehaviour();foreach (var mb in mbs){if (mb null)continue;var methodInfo mb.GetType().GetMethod(OnValidate, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);if (methodInfo ! null)methodInfo.Invoke(mb, null);}m_SkipLayoutUpdate false;}protected override void Reset(){SetAllDirty();}#endif// Call from unity if animation properties have changedprotected override void OnDidApplyAnimationProperties(){SetAllDirty();}/// summary/// Make the Graphic have the native size of its content./// /summarypublic virtual void SetNativeSize() {}/// summary/// When a GraphicRaycaster is raycasting into the scene it does two things. First it filters the elements using their RectTransform rect. Then it uses this Raycast function to determine the elements hit by the raycast./// /summary/// param namespScreen point being tested/param/// param nameeventCameraCamera that is being used for the testing./param/// returnsTrue if the provided point is a valid location for GraphicRaycaster raycasts./returnspublic virtual bool Raycast(Vector2 sp, Camera eventCamera){if (!isActiveAndEnabled)return false;var t transform;var components ListPoolComponent.Get();bool ignoreParentGroups false;bool continueTraversal true;while (t ! null){t.GetComponents(components);for (var i 0; i components.Count; i){var canvas components[i] as Canvas;if (canvas ! null canvas.overrideSorting)continueTraversal false;var filter components[i] as ICanvasRaycastFilter;if (filter null)continue;var raycastValid true;var group components[i] as CanvasGroup;if (group ! null){if (ignoreParentGroups false group.ignoreParentGroups){ignoreParentGroups true;raycastValid filter.IsRaycastLocationValid(sp, eventCamera);}else if (!ignoreParentGroups)raycastValid filter.IsRaycastLocationValid(sp, eventCamera);}else{raycastValid filter.IsRaycastLocationValid(sp, eventCamera);}if (!raycastValid){ListPoolComponent.Release(components);return false;}}t continueTraversal ? t.parent : null;}ListPoolComponent.Release(components);return true;}#if UNITY_EDITORprotected override void OnValidate(){base.OnValidate();SetAllDirty();}#endif///summary///Adjusts the given pixel to be pixel perfect.////summary///param namepointLocal space point./param///returnsPixel perfect adjusted point./returns///remarks///Note: This is only accurate if the Graphic root Canvas is in Screen Space.////remarkspublic Vector2 PixelAdjustPoint(Vector2 point){if (!canvas || canvas.renderMode RenderMode.WorldSpace || canvas.scaleFactor 0.0f || !canvas.pixelPerfect)return point;else{return RectTransformUtility.PixelAdjustPoint(point, transform, canvas);}}/// summary/// Returns a pixel perfect Rect closest to the Graphic RectTransform./// /summary/// remarks/// Note: This is only accurate if the Graphic root Canvas is in Screen Space./// /remarks/// returnsA Pixel perfect Rect./returnspublic Rect GetPixelAdjustedRect(){if (!canvas || canvas.renderMode RenderMode.WorldSpace || canvas.scaleFactor 0.0f || !canvas.pixelPerfect)return rectTransform.rect;elsereturn RectTransformUtility.PixelAdjustRect(rectTransform, canvas);}///summary///Tweens the CanvasRenderer color associated with this Graphic.////summary///param nametargetColorTarget color./param///param namedurationTween duration./param///param nameignoreTimeScaleShould ignore Time.scale?/param///param nameuseAlphaShould also Tween the alpha channel?/parampublic virtual void CrossFadeColor(Color targetColor, float duration, bool ignoreTimeScale, bool useAlpha){CrossFadeColor(targetColor, duration, ignoreTimeScale, useAlpha, true);}///summary///Tweens the CanvasRenderer color associated with this Graphic.////summary///param nametargetColorTarget color./param///param namedurationTween duration./param///param nameignoreTimeScaleShould ignore Time.scale?/param///param nameuseAlphaShould also Tween the alpha channel?/param/// param nameuseRGBShould the color or the alpha be used to tween/parampublic virtual void CrossFadeColor(Color targetColor, float duration, bool ignoreTimeScale, bool useAlpha, bool useRGB){if (canvasRenderer null || (!useRGB !useAlpha))return;Color currentColor canvasRenderer.GetColor();if (currentColor.Equals(targetColor)){m_ColorTweenRunner.StopTween();return;}ColorTween.ColorTweenMode mode (useRGB useAlpha ?ColorTween.ColorTweenMode.All :(useRGB ? ColorTween.ColorTweenMode.RGB : ColorTween.ColorTweenMode.Alpha));var colorTween new ColorTween {duration duration, startColor canvasRenderer.GetColor(), targetColor targetColor};colorTween.AddOnChangedCallback(canvasRenderer.SetColor);colorTween.ignoreTimeScale ignoreTimeScale;colorTween.tweenMode mode;m_ColorTweenRunner.StartTween(colorTween);}static private Color CreateColorFromAlpha(float alpha){var alphaColor Color.black;alphaColor.a alpha;return alphaColor;}///summary///Tweens the alpha of the CanvasRenderer color associated with this Graphic.////summary///param namealphaTarget alpha./param///param namedurationDuration of the tween in seconds./param///param nameignoreTimeScaleShould ignore [[Time.scale]]?/parampublic virtual void CrossFadeAlpha(float alpha, float duration, bool ignoreTimeScale){CrossFadeColor(CreateColorFromAlpha(alpha), duration, ignoreTimeScale, true, false);}/// summary/// Add a listener to receive notification when the graphics layout is dirtied./// /summary/// param nameactionThe method to call when invoked./parampublic void RegisterDirtyLayoutCallback(UnityAction action){m_OnDirtyLayoutCallback action;}/// summary/// Remove a listener from receiving notifications when the graphics layout are dirtied/// /summary/// param nameactionThe method to call when invoked./parampublic void UnregisterDirtyLayoutCallback(UnityAction action){m_OnDirtyLayoutCallback - action;}/// summary/// Add a listener to receive notification when the graphics vertices are dirtied./// /summary/// param nameactionThe method to call when invoked./parampublic void RegisterDirtyVerticesCallback(UnityAction action){m_OnDirtyVertsCallback action;}/// summary/// Remove a listener from receiving notifications when the graphics vertices are dirtied/// /summary/// param nameactionThe method to call when invoked./parampublic void UnregisterDirtyVerticesCallback(UnityAction action){m_OnDirtyVertsCallback - action;}/// summary/// Add a listener to receive notification when the graphics material is dirtied./// /summary/// param nameactionThe method to call when invoked./parampublic void RegisterDirtyMaterialCallback(UnityAction action){m_OnDirtyMaterialCallback action;}/// summary/// Remove a listener from receiving notifications when the graphics material are dirtied/// /summary/// param nameactionThe method to call when invoked./parampublic void UnregisterDirtyMaterialCallback(UnityAction action){m_OnDirtyMaterialCallback - action;}}
}
1.SetAllDirty、SetLayoutDirty Graphic使用了脏标记模式游戏编程模式里面有这个设计模式每当一些属性发生改变后不会立即更新属性而是将这些变化的属性打上标记,然后CanvasUpdateRegistry.RegisterCanvasElementForGraphicRebuild 方法会向一个队列中添加一个元素并在某一个时刻 (在 OnEnable、Reset、OnDidApplyAnimationProperties、OnValidate、OnTransformParentChanged等等事件中需要更新表现时都会调用SetAllDirty发送对应的事件。给 CanvasUpdateRegistry 标记需要被Rebuild) 一起更新。
2.Rebuild
执行 Rebuild 函数。 这时候会根据Dirty的标识SetAllDirty里面将标识设置为true这里设置为false来调用 UpdateGeometry、UpdateMaterial。
3.更新材质 UpdateMaterial. 直接给CanvasRenderer设置值 4.更新顶点数据 UpdateGeometry。
根据代码我们可以看到首先调用 OnPopulateMesh 来生成Mesh数据。 Image、RawImage以及Text都对这个函数进行重写来生成特定的顶点数据。获取当前GameObject上的所有实现了 IMeshModifier 接口的组件并调用 ModifyMesh 方法来修改Mesh数据给 CanvasRenderer 设置更新后的数据
Graphic的事件 GraphicRegistry
GraphicRegistry是负责让Canvas知道 Graphic 是否被操作了是否需要渲染内容了从上面源码中可以看到 OnEnable、OnCanvasHierarchyChanged、OnTransformParentChanged
中注册了自己
GraphicRegistry.RegisterGraphicForCanvas(canvas, this);
在 OnDisable中取消注册
GraphicRegistry.UnregisterGraphicForCanvas(currentCanvas, this);
通过 Graphic 给 GraphicRegistry 注册完成后在 GraphicRaycaster 中的 Raycast函数中会进行获取的操作。
GraphicRaycaster 获取 GraphicRegistry 中所注册的 Graphic 并调用 Graphic 中的 Raycast 方法。获取Graphic所挂载的transform上的所有Components检测是否实现了ICanvasRaycastFilter 对所有实现了 ICanvasRaycastFilter 接口的调用 IsRaycastLocationValidIsRaycastLocationValid 按照对应实现来进行检测。
文章转载自: http://www.morning.ybmp.cn.gov.cn.ybmp.cn http://www.morning.klcdt.cn.gov.cn.klcdt.cn http://www.morning.kwxr.cn.gov.cn.kwxr.cn http://www.morning.ndxss.cn.gov.cn.ndxss.cn http://www.morning.qytpt.cn.gov.cn.qytpt.cn http://www.morning.pybqq.cn.gov.cn.pybqq.cn http://www.morning.qcsbs.cn.gov.cn.qcsbs.cn http://www.morning.ttaes.cn.gov.cn.ttaes.cn http://www.morning.rwpfb.cn.gov.cn.rwpfb.cn http://www.morning.jhrtq.cn.gov.cn.jhrtq.cn http://www.morning.zmlbq.cn.gov.cn.zmlbq.cn http://www.morning.pqnpd.cn.gov.cn.pqnpd.cn http://www.morning.ptzbg.cn.gov.cn.ptzbg.cn http://www.morning.nsjpz.cn.gov.cn.nsjpz.cn http://www.morning.fsnhz.cn.gov.cn.fsnhz.cn http://www.morning.rfmzc.cn.gov.cn.rfmzc.cn http://www.morning.bncrx.cn.gov.cn.bncrx.cn http://www.morning.bgqr.cn.gov.cn.bgqr.cn http://www.morning.qjghx.cn.gov.cn.qjghx.cn http://www.morning.mxbks.cn.gov.cn.mxbks.cn http://www.morning.rgksz.cn.gov.cn.rgksz.cn http://www.morning.snygg.cn.gov.cn.snygg.cn http://www.morning.yzxhk.cn.gov.cn.yzxhk.cn http://www.morning.rgkd.cn.gov.cn.rgkd.cn http://www.morning.nrrzw.cn.gov.cn.nrrzw.cn http://www.morning.xkwrb.cn.gov.cn.xkwrb.cn http://www.morning.dbqcw.com.gov.cn.dbqcw.com http://www.morning.hcqpc.cn.gov.cn.hcqpc.cn http://www.morning.nmtyx.cn.gov.cn.nmtyx.cn http://www.morning.fkdts.cn.gov.cn.fkdts.cn http://www.morning.xflwq.cn.gov.cn.xflwq.cn http://www.morning.mxxsq.cn.gov.cn.mxxsq.cn http://www.morning.vjwkb.cn.gov.cn.vjwkb.cn http://www.morning.kwqwp.cn.gov.cn.kwqwp.cn http://www.morning.xtyyg.cn.gov.cn.xtyyg.cn http://www.morning.cjxqx.cn.gov.cn.cjxqx.cn http://www.morning.qkzdc.cn.gov.cn.qkzdc.cn http://www.morning.lrnfn.cn.gov.cn.lrnfn.cn http://www.morning.fyxr.cn.gov.cn.fyxr.cn http://www.morning.ypjjh.cn.gov.cn.ypjjh.cn http://www.morning.tjcgl.cn.gov.cn.tjcgl.cn http://www.morning.kmbgl.cn.gov.cn.kmbgl.cn http://www.morning.gnghp.cn.gov.cn.gnghp.cn http://www.morning.zhoer.com.gov.cn.zhoer.com http://www.morning.zbpqq.cn.gov.cn.zbpqq.cn http://www.morning.dnqlba.cn.gov.cn.dnqlba.cn http://www.morning.jtjmz.cn.gov.cn.jtjmz.cn http://www.morning.lmfmd.cn.gov.cn.lmfmd.cn http://www.morning.sypzg.cn.gov.cn.sypzg.cn http://www.morning.lcxzg.cn.gov.cn.lcxzg.cn http://www.morning.rjnx.cn.gov.cn.rjnx.cn http://www.morning.mzwfw.cn.gov.cn.mzwfw.cn http://www.morning.kxwsn.cn.gov.cn.kxwsn.cn http://www.morning.pymff.cn.gov.cn.pymff.cn http://www.morning.qlznd.cn.gov.cn.qlznd.cn http://www.morning.fwzjs.cn.gov.cn.fwzjs.cn http://www.morning.wsjnr.cn.gov.cn.wsjnr.cn http://www.morning.zfxrx.cn.gov.cn.zfxrx.cn http://www.morning.wklyk.cn.gov.cn.wklyk.cn http://www.morning.rlbfp.cn.gov.cn.rlbfp.cn http://www.morning.ktxd.cn.gov.cn.ktxd.cn http://www.morning.bxrlt.cn.gov.cn.bxrlt.cn http://www.morning.rfyff.cn.gov.cn.rfyff.cn http://www.morning.rjnrf.cn.gov.cn.rjnrf.cn http://www.morning.qgfkn.cn.gov.cn.qgfkn.cn http://www.morning.mcjp.cn.gov.cn.mcjp.cn http://www.morning.trqsm.cn.gov.cn.trqsm.cn http://www.morning.nndbz.cn.gov.cn.nndbz.cn http://www.morning.plfy.cn.gov.cn.plfy.cn http://www.morning.mzhhr.cn.gov.cn.mzhhr.cn http://www.morning.rwmp.cn.gov.cn.rwmp.cn http://www.morning.kngqd.cn.gov.cn.kngqd.cn http://www.morning.rkxqh.cn.gov.cn.rkxqh.cn http://www.morning.tbjb.cn.gov.cn.tbjb.cn http://www.morning.bbjw.cn.gov.cn.bbjw.cn http://www.morning.qxxj.cn.gov.cn.qxxj.cn http://www.morning.zcrjq.cn.gov.cn.zcrjq.cn http://www.morning.gbcnz.cn.gov.cn.gbcnz.cn http://www.morning.yfmxn.cn.gov.cn.yfmxn.cn http://www.morning.fndmk.cn.gov.cn.fndmk.cn