查看: 2183|回复: 5
打印 上一主题 下一主题

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

[复制链接]

1557

主题

1

听众

1万

积分

资深设计师

Rank: 7Rank: 7Rank: 7

纳金币
454
精华
31

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

跳转到指定楼层
楼主
发表于 2013-10-14 17:02:07 |只看该作者 |倒序浏览
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图,有兴趣的朋友可以自己试试。
分享到: QQ好友和群QQ好友和群 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
转播转播0 分享淘帖0 收藏收藏0 支持支持0 反对反对0
回复

使用道具 举报

ku 智囊团   

89

主题

2

听众

5万

积分

首席设计师

Rank: 8Rank: 8

纳金币
25
精华
1

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

沙发
发表于 2013-10-15 07:21:12 |只看该作者
相当不错教程
回复

使用道具 举报

2

主题

1

听众

1143

积分

助理设计师

Rank: 4

纳金币
350
精华
0
板凳
发表于 2013-10-28 10:15:48 |只看该作者
感谢楼主分享~
回复

使用道具 举报

1

主题

1

听众

412

积分

设计实习生

Rank: 2

纳金币
23
精华
0

最佳新人

地板
发表于 2013-11-18 16:30:48 |只看该作者
感谢分享~
回复

使用道具 举报

74

主题

2

听众

3549

积分

中级设计师

Rank: 5Rank: 5

纳金币
-100
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

5#
发表于 2013-11-23 16:44:28 |只看该作者
谢谢楼主的代码
回复

使用道具 举报

3

主题

2

听众

1154

积分

助理设计师

Rank: 4

纳金币
31
精华
0
6#
发表于 2013-11-29 14:46:31 |只看该作者
不错的分享啊,谢谢楼主!!!!!!!!!!!!!!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

手机版|纳金网 ( 闽ICP备2021016425号-2/3

GMT+8, 2024-9-21 08:11 , Processed in 0.148057 second(s), 31 queries .

Powered by Discuz!-创意设计 X2.5

© 2008-2019 Narkii Inc.

回顶部