Unity2D研究院之精灵Sprite与屏幕之间的关系(二)

本文介绍如何在Unity2D中设置精灵锚点及坐标转换方法,包括触摸屏坐标到实际坐标的换算,通过调整摄像机参数实现分辨率自适应。

继续学习一下unity2d,上一篇说了怎么自动生成Unity的Sprite动画。有朋友在下面给我留言说,怎么设置锚点?其实很简单。如下图所示,选择精灵然后在右边设置 pivot 就可以了。这里我设置的是左下角对齐。


 

Unity2D研究院之自动生成动画、AnimationController、Prefab(一)

锚点这东西挺怀念的,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对象上。

using UnityEngine;
using System.Collections;
 
public class FishCommon : MonoBehaviour {
 
private float camHalfHeight;
private float camHalfWidth;
 
void Awake()
{
this.camHalfHeight = Camera.main.orthographicSize;
this.camHalfWidth = Camera.main.aspect * camHalfHeight;
}
 
void Update () {
//手指 或者 鼠标的坐标传进去
Move(Input.mousePosition);
}
 
public void Move(Vector2 postions){
Move(new Vector3(postions.x,postions.y,0));
}
public void Move(Vector3 postions){
//在这里进行坐标的换算
transform.position =	ScreenToWorld(postions);
}
 
private Vector3 ScreenToWorld(Vector3 postion){
 
return Camera.main.ScreenToWorldPoint(postion);
}
}


如下图所示,小鱼会跟着我的鼠标同时移动。



原文地址:http://www.xuanyusong.com/archives/3254

Unity 2D中,为了实现UI元素(如Text、Image等)精灵Sprite之间基于它们之间的距离进行排序,你可以通过以下步骤操作: 1. 创建一个脚本:首先,在Unity中创建一个新的C#脚本,比如`DistanceSorter.cs`,并将它附加到需要进行排序的对象上(通常是一个GameObject)。 2. 定义排序函数:在脚本里,定义一个方法,比如`SortSpritesByDistance()`, 这个方法会遍历所有子物体(包括UI和Sprite),并计算它们目标点的距离。 ```csharp public class DistanceSorter : MonoBehaviour { public List<SpriteRenderer> spritesToSort; // 存放需要排序的Sprite void SortSpritesByDistance(Vector2 targetPoint) { spritesToSort.Sort((a, b) => Vector2.Distance(a.transform.position, targetPoint).CompareTo(Vector2.Distance(b.transform.position, targetPoint))); } } ``` 3. 设置排序触发条件:你可以在需要更新排序时调用`SortSpritesByDistance()`方法,例如当用户点击屏幕时,你可以获取点击位置作为`targetPoint`。 4. 使用SortingLayer和SortingOrder:如果你还想根据层级或优先级对精灵进行进一步排序,可以结合Unity内置的Sorting Layer和Sorting Order功能。将Sprite分配到不同的Sorting Layers,并设置它们的Sorting Order值,这样可以调整它们的显示顺序。 5. 更新UI:完成排序后,UI元素的位置通常不会受到影响,因为它们通常有自己的层次结构和锚点设置,所以不需要参这次排序。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值