当前位置:网站首页>Unity ugui source code graphic
Unity ugui source code graphic
2022-07-05 04:57:00 【OldMan_ sjc】
Graphic
How does it bring us UI Displayed on the screen
Post a simple example
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MyGraphic : MonoBehaviour
{
public Texture texture;
// Start is called before the first frame update
void Start()
{
Mesh mesh = new Mesh();
mesh.Clear();
mesh.SetVertices(new List<Vector3>() { new Vector3(0, 0), new Vector3(0, 100), new Vector3(100, 100), new Vector3(100, 0) });
mesh.SetUVs(0, new List<Vector2>() { new Vector2(0, 0), new Vector2(0, 1), new Vector2(1, 1), new Vector2(1, 0) });
mesh.SetTriangles(new List<int>() { 0, 1, 2, 2, 3, 0 }, 0);
mesh.RecalculateBounds();
CanvasRenderer canvasRenderer = gameObject.AddComponent<CanvasRenderer>();
canvasRenderer.SetMesh(mesh);
canvasRenderer.materialCount = 1;
canvasRenderer.SetMaterial(Canvas.GetDefaultCanvasMaterial(), 0);
canvasRenderer.SetTexture(texture);
}
}
The effect is as follows :
We used CanvasRenderer, Simple setup Mesh,Material,Texture The picture is displayed .
CanvasRenderer : A component that will render to the screen after all normal rendering has completed when attached to a Canvas. Designed for GUI application.
Graphic It is through CanvasRenderer take UI Displayed on the screen , Specifically Graphic Where is it set up Mesh,Material,Texture You can see the following code .
Graphic Code logic
First of all Graphic Of OnEnable
protected override void OnEnable()
{
base.OnEnable();
// find parent first active And enabled Of canvas
CacheCanvas();
// GraphicRegistry take Graphic and canvas Stored in the Dictionary<Canvas, IndexedSet<Graphic>> m_Graphics in
GraphicRegistry.RegisterGraphicForCanvas(canvas, this);
#if UNITY_EDITOR
GraphicRebuildTracker.TrackGraphic(this);
#endif
if (s_WhiteTexture == null)
s_WhiteTexture = Texture2D.whiteTexture;
// take Layout, Vertices, Materials Set to dirty state
SetAllDirty();
}
OnEnable Simply do some initialization , And then we did SetAllDirty, This function will Layout, Vertices, Materials Set to dirty state , Here we mainly look at the right Vertices, Materials To deal with , Both call
// CanvasUpdateRegistry Responsible for graphic Add entry IndexedSet<ICanvasElement> m_GraphicRebuildQueue In the list
CanvasUpdateRegistry.RegisterCanvasElementForGraphicRebuild(this);
In this step ,CanvasUpdateRegistry Instantiate and execute in the constructor
// Event that is called just before Canvas rendering happens.
// This allows you to delay processing / updating of canvas based elements until just before they are rendered.
Canvas.willRenderCanvases += PerformUpdate;
PerformUpdate The function will be used every time Canvas Before rendering .
private void PerformUpdate()
{
......
m_PerformingGraphicUpdate = true;
for (var i = (int)CanvasUpdate.PreRender; i < (int)CanvasUpdate.MaxUpdateValue; i++)
{
for (var k = 0; k < m_GraphicRebuildQueue.Count; k++)
{
try
{
var element = m_GraphicRebuildQueue[k];
if (ObjectValidForUpdate(element))
element.Rebuild((CanvasUpdate)i);
}
catch (Exception e)
{
Debug.LogException(e, m_GraphicRebuildQueue[k].transform);
}
}
}
for (int i = 0; i < m_GraphicRebuildQueue.Count; ++i)
m_GraphicRebuildQueue[i].GraphicUpdateComplete();
m_GraphicRebuildQueue.Clear();
m_PerformingGraphicUpdate = false;
......
}
This function traverses m_GraphicRebuildQueue, And execute Rebuild Method ,GraphicUpdateComplete Method .
// whenever Vertices, Materials by dirty state , Go to UpdateGeometry,UpdateMaterial
public 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;
}
}
// UpdateGeometry The function will eventually call DoMeshGeneration
private void DoMeshGeneration()
{
if (rectTransform != null && rectTransform.rect.width >= 0 && rectTransform.rect.height >= 0)
OnPopulateMesh(s_VertexHelper);
else
s_VertexHelper.Clear(); // clear the vertex helper so invalid graphics dont draw.
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);
}
protected virtual void UpdateMaterial()
{
if (!IsActive())
return;
canvasRenderer.materialCount = 1;
canvasRenderer.SetMaterial(materialForRendering, 0);
canvasRenderer.SetTexture(mainTexture);
}
You can see in the UpdateMaterial When Graphic Meeting SetMaterial and SetTexture, stay DoMeshGeneration Meeting SetMesh.
Through the above process ,Graphic will mainTexture It's on the screen .
边栏推荐
- 中国艾草行业研究与投资前景预测报告(2022版)
- 2021 huashubei mathematical modeling idea + reference + paper
- Emlog blog theme template source code simple good-looking responsive
- [groovy] closure (closure parameter binding | curry function | rcurry function | ncurry function | code example)
- 2021-10-29
- Looking at Chinese science and technology from the Winter Olympics: what is the mystery of the high-speed camera that the whole people thank?
- AutoCAD - workspace settings
- Fluent objects and lists
- [Business Research Report] Research Report on male consumption trends in other economic times -- with download link
- On-off and on-off of quality system construction
猜你喜欢
AutoCAD - scaling
AutoCAD - stretching
On-off and on-off of quality system construction
Special information | finance, accounting, audit - 22.1.23
xss注入
Thinking of 2022 American College Students' mathematical modeling competition
Unity find the coordinates of a point on the circle
Emlog博客主题模板源码简约好看响应式
Thematic information | carbon, carbon neutrality, low carbon, carbon emissions - 22.1.9
Flutter tips: various fancy nesting of listview and pageview
随机推荐
【Leetcode】1352. 最后 K 个数的乘积
Chinese notes of unit particle system particle effect
[groovy] closure closure (customize closure parameters | customize a single closure parameter | customize multiple closure parameters | specify the default value of closure parameters)
669. Prune binary search tree ●●
AutoCAD - lengthening
Lua determines whether the current time is the time of the day
用 Jmeter 工具做个小型压力测试
Flutter 小技巧之 ListView 和 PageView 的各种花式嵌套
Dotween usage records ----- appendinterval, appendcallback
Redis has four methods for checking big keys, which are necessary for optimization
Cocos create Jiugongge pictures
Introduce Hamming distance and calculation examples
Animation
Common technologies of unity
Forecast report on research and investment prospects of Chinese wormwood industry (2022 Edition)
Unity intelligent NPC production -- pre judgment walking (method 1)
This article is good
MD5 bypass
Séparation et combinaison de la construction du système qualité
C iterator