巡逻兵游戏
游戏设计要求:
- 创建一个地图和若干巡逻兵;
- 每个巡逻兵走一个3~5个边的凸多边型,位置数据是相对地址。即每次确定下一个目标位置,用自己当前位置为原点计算;
- 巡逻兵碰撞到障碍物如树,则会自动选下一个点为目标;
- 巡逻兵在设定范围内感知到玩家,会自动追击玩家;
- 失去玩家目标后,继续巡逻;
- 计分:每次甩掉一个巡逻兵计一分,与巡逻兵碰撞游戏结束。
- 程序设计要求:
- 必须使用订阅与发布模式传消息、工厂模式生产巡逻兵
完成效果图
实现过程
代码部分有一些参考了学长们之前做的游戏,对初学者而言真的是帮助很大。在一些不够完善的细节上我加上了自己的一些设计,学到了不少东西。
在asset store里下载了可用的人物和小僵尸模型(挑了好久才挑出这么可爱的),加上动画和状态机设置让人物动起来。
人物chara的状态机如下,主要有idle和run两种状态,以及是否存活:
僵尸patrol的状态机如下,与人物相比,多了巡逻时的walk状态,当发现玩家时从walk状态变为run,速度加快;由于巡逻兵不会死亡,因此不需要增加die:
实现人物移动时,当人物与墙发生碰撞、与巡逻兵发生碰撞时都会受到外力作用,因此位置会改变。防止碰撞带来的作用部分如下:
if (this.transform.localEulerAngles.x != 0 || this.transform.localEulerAngles.z != 0){
this.transform.localEulerAngles = new Vector3(0, this.transform.localEulerAngles.y, 0);
}
if (this.transform.position.y != 0){
this.transform.position = new Vector3(this.transform.position.x, 0, this.transform.position.z);
}
此外,为了使游戏看的更清楚,增加了镜头随鼠标移动的部分。鼠标滑轮控制镜头放大缩小,左键拖动控制镜头移动。
原本还加上了右键控制镜头旋转,但实际体验效果并不好,很容易操作不当,因此并没保留镜头旋转。(也可能是我单机打的太少操作太差)
using UnityEngine;
using System.Collections;
public class MoveCamera : MonoBehaviour {
public int cameraMoveSpeed = 10;//相机移动速度
float originalPositionX;
float originalPositionY;
void Start()
{
originalPositionX = this.transform.position.x;
originalPositionY = this.transform.position.y;
}
void OnGUI()
{
//鼠标左键调节镜头位置
if (Event.current.type == EventType.MouseDrag) {
float x;
float y;
x = Input.GetAxis ("Mouse X");
y = Input.GetAxis ("Mouse Y");
transform.Translate (new Vector3 (-x, 0, 0) * Time.deltaTime * cameraMoveSpeed);
transform.Translate (new Vector3 (0, -y, 0) * Time.deltaTime * cameraMoveSpeed);
}
}
void Update()
{
//鼠标滑轮控制放大缩小
if( Input.GetAxis("Mouse ScrollWheel") != 0 )
{
this.gameObject.transform.Translate(new Vector3(0,0,Input.GetAxis("Mouse ScrollWheel")*Time.deltaTime*500));
}
}
}
为了装饰游戏,我找了带有雪的栅栏、雪地的贴图和飘雪花的效果,加上了天空盒,放置了几个雪人作为障碍物用来跟巡逻兵斗智斗勇;飘落雪花的动画也很有雪地的感觉。
项目代码
完整代码按照往常一样放在了github里,地址走→https://github.com/moko-momo/patrol-game