[Unity3D]2D游戏中处理Sprite和UI之间的位置关系

在开发项目中,遇到一个问题,我需要把动态的人物Sprite放在镜头前,同时又要把UI放在固定的位置,并且一些UI弹出式会覆盖掉人物等Sprite避免干扰,下面就来实现这个需求

设置相机和Canvas

因为我做的是2D游戏,首先先把摄像机的Projection(投影)模式设置为Orthographic(正交)
这里写图片描述
在这里科普一下
Camare有两种Projection(投影)模式,分别是Perspective(透视)和Orthographic(正交)
这两个区别是
透视模式下 物体的大小会随着距离的远近而变化,比如说一艘船在海平线上可能很小,但是开到你面前了你才发先这艘船有航母那么大,比较符合现实世界的视角
正交模式下 物体的大小就是它原本的大小,不会随着距离而改变,这正是制作2D游戏所需要的。
然后查资料得到,要设置Canvas
Canvas下面有三种渲染模式,分别是Screen Space-Overlay、Screen Space-Camera以及World Space
这里写图片描述
有关Canvas的详细介绍可以看这篇文章,讲得很清楚https://www.cnblogs.com/msxh/p/6337338.html
这三种模式的区别(转自上述文章)
这里写图片描述
这里我只说我的方法,也就是Camera设置为Screen Space-Overlay,同时用代码控制Sprite的位置。
我们回到场景中可以看到摄像机被设置为正交了

添加组件

这里写图片描述
然后新建一个Sprite,给它添加一张图片作为背景图(摄像机中打码的部分是后面添加进来的Sprite)
这里写图片描述
OK,然后再把需要的Sprite一一导入到世界中,在Game视图中观察,调整它们的位置和z轴(调整z轴相当于调整UI层级)
接着我们新建一个Canvas,添加我们需要的UI
这里写图片描述
这张Canvas下面不需要设置背景图,背景就是前面在世界中设置的Sprite即可。
然后运行,就发现已经达到想要的效果了。

但是有一个问题,我想要一些UI是动态的,比如说血条跟随在人物Sprite,随着人物走动而变换位置,这又该怎么做呢?

编写代码

下面我们用代码来控制
新建一个脚本
首先我们要确定Sprite的位置,如图,所有Transform都是Sprite物体
这里写图片描述
然后再持有所有需要移动的UI(我知道这样很蠢)
这里写图片描述

OK,这里我们需要了解一个知识,就是Sprite他们的坐标被称为世界坐标,而UI所在的坐标是屏幕坐标,在这里Unity给我们提供了一个方法,就是

 Camera.main.WorldToScreenPoint()

如图所示
这里写图片描述
我们有了这个方法,就可以实现上述的功能了。比如说我小兵一直是在运动的,而小兵的血条应该在它的头顶上,那么我们就可以在Update方法里面获取小兵的坐标,然后转成屏幕坐标,再用这个坐标设置给小兵的血条(在头顶,y轴应该有些变化)。

 private void Update()
    {
      UI.position= Camera.main.WorldToScreenPoint(new Vector3(Sprite.position.x, Sprite.position.y-0.05f, Sprite.position.z));
    }

UI就是血条,Sprite就是你要移动的物体。
运行观察,就能发现想要的效果实现了。

猜你喜欢

转载自blog.csdn.net/hhmy77/article/details/81429774