游戏介绍
这次游戏内容是:场景内有若干自动巡逻的士兵,而玩家需要通过移动躲避他们的追捕。逃脱则加分,被抓到则游戏结束。
程序具体规则:
- 巡逻兵会以自身当前坐标为参照,自动选择下一个移动目标,一旦中途发生碰撞,则重新选择下一个目标点。
- 玩家受鼠标操控,将会前往鼠标左键点击的坐标。点击事件只对地面生效(tag)。
以下是项目代码:
巡逻兵小游戏
程序结构
首先来看一下程序运行的结构吧:
- 其中plane是地面,需要添加一个"plane"的tag,为了让鼠标点击事件识别它。
- Cube形成墙壁和障碍物,程序中只是简单地摆放了一些。
- Npc和Player分别对应巡逻兵和玩家,上面需要挂载各自的脚本,以及刚体组件。
- Manager_1用于挂载各种控制类脚本。
- Text用于UI显示分数,详情可见前几次博客。
Player – 鼠标点击
这里最主要的部分就是鼠标点击控制目标移动。
程序使用了射线来获取鼠标击中地面处的坐标,以及Vector3.MoveTowards
函数来逐帧改变目标位置。
if (Input.GetButtonDown("Fire1"))
{
mousePosition = Input.mousePosition;
Ray ray = Camera.main.ScreenPointToRay(mousePosition);
RaycastHit hit;
if (Physics.Raycast(ray, out hit) && hit.transform.gameObject.CompareTag("plane"))
{
direction = hit.point;
direction = direction + new Vector3(0, transform.position.y, 0);
}
}
可见击中地面处的坐标是由hit.point
获取的。hit就是被击中的对象,这里也就是地面。
注意这里判断了击中物的tag,以确保鼠标事件只对地面生效。
direction 用于计算物体移动的目标。因为物体需要做水平移动,而击中点是在地面上,因此需要加上一个物体的高度。
if(transform.<