在我们小时候玩过的2d游戏中,比如超级玛丽、魂斗罗等等,地图中都常常会有升降平台的出现,话不多说,以下为博主实现自动升降平台的过程:
第一步,新建Tilemap(如下图,素材可在Unity Asset Store中搜索Sunnyland,导入即可),并搭建一个平台,(Inspector)检视面板Layer设置为Ground(即地面,根据自己项目设置进行调整),给平台添加Tilemap Collider 2D 以及 Rigidbody 2D,设置Body Type为Kinematic(文末我会介绍),并锁定X轴和Z轴,注意如果你添加的是Box Collider 2D,需要编辑其碰撞体范围,Tilemap Colider 2D很好的解决了这个问题。
第二步,在平台子层级新建两个空物体(分别命名为top,bottom),为方便观察,可以在空物体检视面板设置颜色标记(如下图),接着移动两个空物体,分别置于平台的正上方和正下方,距离自由设置,这样我们需要的环境就搭建好了。
第三步,给平台贴代码,新建C#文件,命名为PlatformController,博主的思路是获取top、bottom两点(临界点),判断平台的状态是向上移动还是向下移动,默认向上速度为Speed,当平台向下移动时,速度为-Speed,当然这只是一种实现方法,博主将在下篇文章以3d自动升降平台为例用另一种方法实现,有兴趣的小伙伴欢迎查阅,PlatformController.cs代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlatformController : MonoBehaviour
{
private Rigidbody2D rb;
private Collider2D coll;
public Transform top, bottom;
public float Speed;
public float TopY, BottomY;
private bool isUp = true;
// Start is called before the first frame update
void Start()
{
rb = GetComponent<Rigidbody2D>();
coll = GetComponent<Collider2D>();
TopY = top.position.y;//获取top点
BottomY = bottom.position.y;//获取bottom点
Destroy(top.gameObject);
Destroy(bottom.gameObject);
/*破坏top和bottom物体,使运行后层级面板更美观*/
}
// Update is called once per frame
void Update()
{
Movement();
}
void Movement()
{
if (isUp)
{
rb.velocity = new Vector2(rb.velocity.x, Speed);
if (transform.position.y >= TopY)
{
isUp = false;
}
}
else
{
rb.velocity = new Vector2(rb.velocity.x, -Speed);
if (transform.position.y <= BottomY)
{
isUp = true;
}
}
}
}
运行之前别忘了在检视面板Script中获取Top和Bottom,设置速度哦!
Body Type的属性有三种:
- Dynamic(动态,默认)
- Kinematic(运动学)
- Static(静态)
对于为什么要改变Body Type,你可以试试先设置为Dynamic,当你跳起落到平台,细心观察,你会发现,平台受到了角色落下的冲击力而向下移动了一段距离,当我们设置为Static,平台是不会受代码控制而移动的,只有设置为Kinematic时,平台的移动才不会受其他因素(力的作用)影响