巡逻兵小游戏
1、设计要求
游戏规则
使用WSAD或方向键上下左右移动player,进入巡逻兵的追捕后逃脱可积累一分,若与巡逻兵碰撞则游戏结束,收集完地图上的所有水晶即可获胜。游戏设计要求:
- 创建一个地图和若干巡逻兵(使用动画);
- 每个巡逻兵走一个3~5个边的凸多边型,位置数据是相对地址。即每次确定下一个目标位置,用自己当前位置为原点计算;
- 巡逻兵碰撞到障碍物,则会自动选下一个点为目标;
- 巡逻兵在设定范围内感知到玩家,会自动追击玩家;
- 失去玩家目标后,继续巡逻;
- 计分:玩家每次甩掉一个巡逻兵计一分,与巡逻兵碰撞游戏结束;
程序设计要求:
- 必须使用订阅与发布模式传消息
- 工厂模式生产巡逻兵
2、游戏预览
附上录制小视频的地址: https://www.bilibili.com/video/av23317658/
游戏截图:
3、设计过程
1、首先上unity3d的官网上的asset store上找一些能用的免费的资源
2、设计预制
利用找到的免费资源和一些unity自带的模型设计各种你需要的预制,这些都是游戏中可能会使用到的。我的预制有这几种:地图、玩家以及巡逻兵。
地图的话,可以按照自己的喜好来设计,设置墙体、障碍以及金币什么的都是可以的,按自己喜欢的来
然后我们需要在地图、玩家以及巡逻兵身上设计各种碰撞器,另外我们还需要在玩家和巡逻兵身上设置刚体组件
3、编写程序
这次作业老师要求我们使用订阅与发布模式来传消息,刚接触到这个概念的时候还是十分陌生的,那么究竟什么是订阅与发布模式呢?首先我们来思考这样一个问题,假设一个程序的后台有这样一种功能:
当产生警告的时候,程序需要执行若干种操作来进行响应。我们想象一下,如果产生警告的时候我们需要做好几十件事情的话,那么这个类是有多复杂。所以我们需要把报警信息和各种方法解耦合,这个时候就需要用到我们的订阅与发布模式了。
事件触发者称为消息发布者,即图中的P。事件接受称为消息订阅者,即图中的S。P与S之间通过S.P(即订阅器)连接。这样就实现了P与S的解耦。首先,P就把消息发送到指定的订阅器上,S如果想接收消息,就要向订阅器进行订阅,订阅成功后,S就可以接收来自S.P的消息了同理,S还可以向S.P进行退订操作,成功退订后,S就无法接收到来自指定S.P的消息了。这样就完美的解决了P与S之间的解耦。
4、UML图
AreaCollide.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class AreaCollide : MonoBehaviour
{
public int sign = 0;
FirstSceneController sceneController;
private void Start()
{
sceneController = SSDirector.GetInstance().CurrentScenceController as FirstSceneController;
}
void OnTriggerEnter(Collider collider)
{
//标记玩家进入自己的区域
if (collider.gameObject.tag == "Player")
{
sceneController.wall_sign = sign;
}
}
}
FirstSceneController.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public interface ISceneController
{
//加载场景资源
void LoadResources();
}
public interface IUserAction
{
//移动玩家
void MovePlayer(float translationX, float translationZ);
//得到分数
int GetScore();
//得到水晶数量
bool GetGameover();
//重新开始
void Restart();
}
public interface ISSActionCallback
{
void SSActionEvent(SSAction source,int intParam = 0,GameObject objectParam = null);
}
public interface IGameStatusOp
{
void PlayerEscape();
void PlayerGameover();
}
public class FirstSceneController : MonoBehaviour, IUserAction, ISceneController
{
public PropFactory patrol_factory; //巡逻者工厂
public ScoreRecorder recorder; //记录员
public PatrolActionManager action_manager; //运动管理器
public int wall_sign = -1; //当前玩家所处哪个格子
public GameObject player; //玩家
public Camera main_camera; //主相机