Sprite与屏幕之间的关系
锚点这东西挺怀念的,N年前我在做J2ME手游的时候。屏幕整体的坐标是左上角是00点。X轴向右递增,Y轴向下递增。所有的image也是这个原理。只是unity的触摸屏坐标不是左上角,而是左下角。 所以这里我把精灵的锚点也设置成了左下角,注意上图中的pixels to units 请设置成100。
触摸屏坐标:就是用Input.mousePosition 获取用户触摸屏幕手指 或者 鼠标的位置。
实际坐标:unity的实际坐标是笛卡尔坐标系,00点是在正中心,X轴向右是正,向左是负。Y轴向上是正,向下是负。
这样问题也就来了,我怎么把触摸屏的坐标换算到实际坐标系上?解决这个问题之前我们要先解决一个更重要的问题–摄像机的参数。
我开发时的分辨率设置成宽960高640.如下图所示,在Game视图下面,我选择了960X640的分辨率,下面提示的 using reslution 717×478 是因为此时Game视图的比960X640小,所以这里等比例缩小了一点所以是 717X478。
这时选择你的摄像机。如下图所示,把Projection改成Orthographic 也就是正交摄像机。 然后要说的就是size = 3.2。这个3.2是怎么来的呢?想想我们的分辨率的高是多少?高是640. 640/2/100 = 3.2. 除以2就是屏幕高的一半,除以100就是上面我们设置的 pixels to units =100 . 再举个例子如果你开发时的分辨率是1280X720 那么此时你的高就是720了。 720/2/100 = 3.6 那么此时摄像机的size 就应该写成3.6了。。 再唠叨一句,手游的分辨率自适应基本都是这样修改摄像机的size来实现的了。
摄像机的参数搞清楚了,我们在来看看之前提出的问题?我怎么把触摸屏的坐标换算到实际坐标系上? 把如下代码挂在一个Sprite对象上。
1 using UnityEngine; 2 using System.Collections; 3 4 public class FishCommon : MonoBehaviour { 5 6 private float camHalfHeight; 7 private float camHalfWidth; 8 9 void Awake() 10 { 11 this.camHalfHeight = Camera.main.orthographicSize; 12 this.camHalfWidth = Camera.main.aspect * camHalfHeight; 13 } 14 15 void Update () { 16 //手指 或者 鼠标的坐标传进去 17 Move(Input.mousePosition); 18 } 19 20 public void Move(Vector2 postions){ 21 Move(new Vector3(postions.x,postions.y,0)); 22 } 23 public void Move(Vector3 postions){ 24 //在这里进行坐标的换算 25 transform.position = ScreenToWorld(postions); 26 } 27 28 private Vector3 ScreenToWorld(Vector3 postion){ 29 30 return Camera.main.ScreenToWorldPoint(postion); 31 } 32 }