Unity3D教程宝典之2D图的像素对应

转:http://blog.sina.com.cn/s/blog_471132920101fua3.html

 

2D图的像素对应
        
NGUI和EZ GUI都有图的像素对应功能。如何不用插件就实现这样的效果呢?
 
实现步骤:
(0)准备
(1)确定屏幕分辨率
(2)设置Camera。
(3)设置GameObject的Scale

(0)准备
新建一个场景
GameObject->Create Other->Plane
把plane的rotate设置为(90,180,0)

(1)确定屏幕分辨率
1手动设置分辨率
【风宇冲】Unity3D教程宝典之2D图的像素对应
2通过代码取得
Screen.width,Screen.height
 
(2)设置Camera。
设置Projection为正交Orthographic,以及Orthographic Size为屏幕分辨率高的一半。
1.直接在Inspector面板里设置
【风宇冲】Unity3D教程宝典之2D图的像素对应
2.或者通过代码
  1. cam.isOrthoGraphic = true;
  2. 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模型的代码:
  1. using UnityEngine;
  2. using System.Collections;
  3. public class Test : MonoBehaviour {
  4. public GameObject pic;
  5. public Camera cam;
  6. public Vector2 picPixel;
  7. void Start () {
  8. cam.isOrthoGraphic = true;
  9. }
  10. void Update () {
  11. cam.orthographicSize = Screen.height/2;
  12. pic.transform.localScale = new Vector3(picPixel.x * 0.1f,1,picPixel.y* 0.1f);
  13. }
  14. }
脚本稍作修改,Scale直接对应像素。

 

  1. using UnityEngine;
  2. using System.Collections;
  3. public class Test : MonoBehaviour {
  4. public GameObject pic;
  5. public Camera cam;
  6. public Vector2 picPixel;
  7. void Start () {
  8. cam.isOrthoGraphic = true;
  9. }
  10. void Update () {
  11. cam.orthographicSize = Screen.height/2 * 10;
  12. pic.transform.localScale = new Vector3(picPixel.x,1,picPixel.y);
  13. }
  14. }
或者也可以做成NGUI那样。摄像机的orthographicSize恒定为1,然后用一个根节点做缩放,使得图像物体的scale与像素对应。做法如下:
新建一个GameObject,然后命名为UIRoot.
将图像物体拖拽至UIRoot下。
  1. using UnityEngine;
  2. using System.Collections;
  3. public class Test : MonoBehaviour {
  4. public GameObject uiRoot;
  5. public GameObject pic;
  6. public Camera cam;
  7. public Vector2 picPixel;
  8. void Start () {
  9.    cam.isOrthoGraphic = true;
  10. }
  11. void Update () {
  12.    cam.orthographicSize = 1;
  13.    float pixelScale = Screen.height/2 * 10;
  14.    uiRoot.transform.localScale = new Vector3(1/pixelScale,1/pixelScale,1);
  15.    pic.transform.localScale = new Vector3(picPixel.x ,1,picPixel.y);
  16. }
  17. }
之后运行,发现图像显示的尺寸和picPixel指定的像素尺寸完全一样。怎么样,是不是很实用呢?
也可以实时创建或使用一个1x1的plane来显示2D图,有兴趣的朋友可以自己试试。

 

posted on 2013-05-10 14:15  justup  阅读(1679)  评论(0编辑  收藏  举报

导航