NGUI和EZ GUI都有图的像素对应功能。如何不用插件就实现这样的效果呢?
实现步骤:
(0)准备
(1)确定屏幕分辨率
(2)设置Camera。
(3)设置GameObject的Scale
(0)准备
新建一个场景
GameObject->Create Other->Plane
把plane的rotate设置为(90,180,0)
(1)确定屏幕分辨率
1手动设置分辨率
2通过代码取得
Screen.width,Screen.height
(2)设置Camera。
设置Projection为正交Orthographic,以及Orthographic Size为屏幕分辨率高的一半。
1.直接在Inspector面板里设置
2.或者通过代码
- cam.isOrthoGraphic = true;
- cam.orthographicSize = Screen.height/2;
当完成上述设置后,屏幕就和unity对应了,即一个像素对应Unity里的一个距离单位(米),
注意:
Unity的一个距离,即1 unit,对应position的1个单位。 即有2个position,一个是(0,0,0),一个是(1,0,0),那么可以说它们相差一个距离单位,即相差1 unit 有2个position,一个是(0,0,0),一个是(0,1.2,0),那么可以说它们相差1.2 unit 在使用系统重力(一般为-9.81)的情况下,Unity的一个距离(1 Unit)对应现实中的1米(1 meter)。而其他情况,无论是自己写重力,还是不用重力。1 unit对应多少距离由你自己定,只要有统一的标准即可。 (3)设置GameObject的Scale
当完成(2)后,像素已经和unity unit对应。之后需要设置绘制图像的GameObject的scale,而scale的值根据所使用的平面模型大小变化:
模型的大小是一个单位: 那么scale直接和像素对应。例如需要设置图像大小为300x200像素的话,直接填scale为(300,1,200)
模型的大小为其他大小:那么scale为 像素大小再除以模型的缩放。
以unity自带的plane为例,该模型大小为10x10。 故scale为(300,200)再除以(10,10)即,(30,20)
那么scale直接设置为(30,1,20)即可
使用Unity自带plane模型的代码:
- using UnityEngine;
- using System.Collections;
- public class Test : MonoBehaviour {
- public GameObject pic;
- public Camera cam;
- public Vector2 picPixel;
- void Start () {
- cam.isOrthoGraphic = true;
- }
- void Update () {
- cam.orthographicSize = Screen.height/2;
- pic.transform.localScale = new Vector3(picPixel.x * 0.1f,1,picPixel.y* 0.1f);
- }
- }
脚本稍作修改,Scale直接对应像素。
- using UnityEngine;
- using System.Collections;
- public class Test : MonoBehaviour {
- public GameObject pic;
- public Camera cam;
- public Vector2 picPixel;
- void Start () {
- cam.isOrthoGraphic = true;
- }
- void Update () {
- cam.orthographicSize = Screen.height/2 * 10;
- pic.transform.localScale = new Vector3(picPixel.x,1,picPixel.y);
- }
- }
或者也可以做成NGUI那样。摄像机的orthographicSize恒定为1,然后用一个根节点做缩放,使得图像物体的scale与像素对应。做法如下:
新建一个GameObject,然后命名为UIRoot.
将图像物体拖拽至UIRoot下。
- using UnityEngine;
- using System.Collections;
- public class Test : MonoBehaviour {
- public GameObject uiRoot;
- public GameObject pic;
- public Camera cam;
- public Vector2 picPixel;
- void Start () {
- cam.isOrthoGraphic = true;
- }
- void Update () {
- cam.orthographicSize = 1;
- float pixelScale = Screen.height/2 * 10;
- uiRoot.transform.localScale = new Vector3(1/pixelScale,1/pixelScale,1);
- pic.transform.localScale = new Vector3(picPixel.x ,1,picPixel.y);
- }
- }
之后运行,发现图像显示的尺寸和picPixel指定的像素尺寸完全一样。怎么样,是不是很实用呢?
也可以实时创建或使用一个1x1的plane来显示2D图,有兴趣的朋友可以自己试试。
|