unity对ui的认识——最简单的原理

在弄清楚UGUI每个类功能前,我们先想一下UI的组成部分:

  1. 要把图像绘制到界面上。
    1. 数据部分,顶点数据,UV数据,发现方向等这些组成了mesh
    2. 渲染部分:MeshFilter和MeshRenderer;
  2. 要能触发对应的事件。

关于渲染上的事,本人就是个小学生,就不展开讨论了。

在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");
			}


		}
	}
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值