在弄清楚UGUI每个类功能前,我们先想一下UI的组成部分:
- 要把图像绘制到界面上。
- 数据部分,顶点数据,UV数据,发现方向等这些组成了mesh
- 渲染部分:MeshFilter和MeshRenderer;
- 要能触发对应的事件。
关于渲染上的事,本人就是个小学生,就不展开讨论了。
在unity中UGUI中封装好了一个数据类:VertexHelper,其中封装了顶点,UV等数据。有很多种数据初始化的方式:AddVert()或者创建的手直接传入一个mesh。FillMesh()方法把数据传递给mesh后重新计算了边界。
尝试生成一个mesh:
private void InitMesh() {
mesh = new Mesh();
vHelper.Clear();
//顶点数据
vHelper.AddVert(new Vector2(0 , 0) , color , new Vector2(0 ,0));
vHelper.AddVert(new Vector2(0 , 1) , color , new Vector2(0 , 1));
vHelper.AddVert(new Vector2(1 , 1) , color , new Vector2(1 , 1));
vHelper.AddVert(new Vector2(1 , 0) , color , new Vector2(1 , 0));
//顶点顺序
vHelper.AddTriangle(0 , 1 , 2);
vHelper.AddTriangle(2 , 3 , 0);
vHelper.FillMesh(mesh);
}
有了数据以后渲染部分就交给 MeshFilter和MeshRenderer了。
之后我们在Update中可以监听点击,首先我们要为对象加载MeshCollider组件,这样就可以使用射线检测到当前mesh。然后我们点下鼠标的时候打印一句话:
ray = camera.ScreenPointToRay(Input.mousePosition);
RaycastHit hitinfo;
if ( Physics.Raycast(ray , out hitinfo) ) {
if ( Input.GetMouseButtonDown(0) ) {
Debug.Log("it is my image");
}
}
最后上代码
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
public class MyImage : MonoBehaviour {
VertexHelper vHelper = new VertexHelper();
Mesh mesh = null;
public Color color;
MeshFilter meshFileter;
public MeshRenderer renderer;
public Texture2D texture;
// Use this for initialization
public Camera camera;
MeshCollider collider;
void Start () {
meshFileter = GetComponent<MeshFilter>();
if ( meshFileter == null ) {
meshFileter = gameObject.AddComponent<MeshFilter>();
}
collider = GetComponent<MeshCollider>();
if ( collider == null ) {
collider = gameObject.AddComponent<MeshCollider>();
}
InitMesh();
}
private void InitMesh() {
mesh = new Mesh();
vHelper.Clear();
vHelper.AddVert(new Vector2(0 , 0) , color , new Vector2(0 ,0));
vHelper.AddVert(new Vector2(0 , 1) , color , new Vector2(0 , 1));
vHelper.AddVert(new Vector2(1 , 1) , color , new Vector2(1 , 1));
vHelper.AddVert(new Vector2(1 , 0) , color , new Vector2(1 , 0));
vHelper.AddTriangle(0 , 1 , 2);
vHelper.AddTriangle(2 , 3 , 0);
vHelper.FillMesh(mesh);
meshFileter.mesh = mesh;
collider.sharedMesh = mesh;
}
Ray ray;
// Update is called once per frame
void Update () {
renderer.material.color = color;
renderer.material.mainTexture = texture;
ray = camera.ScreenPointToRay(Input.mousePosition);
RaycastHit hitinfo;
if ( Physics.Raycast(ray , out hitinfo) ) {
if ( Input.GetMouseButtonDown(0) ) {
Debug.Log("it is my image");
}
}
}
}