# 智能巡逻兵小游戏
# 作业要求
- 游戏设计要求:**智能巡逻兵**
- 创建一个地图和若干巡逻兵(使用动画);
- 每个巡逻兵走一个3~5个边的凸多边型,位置数据是相对地址。即每次确定下一个目标位置,用自己当前位置为原点计算;
- 巡逻兵碰撞到障碍物,则会自动选下一个点为目标;
- 巡逻兵在设定范围内感知到玩家,会自动追击玩家;
- 失去玩家目标后,继续巡逻;
- 计分:玩家每次甩掉一个巡逻兵计一分,与巡逻兵碰撞游戏结束;
- 程序设计要求:
- 必须使用订阅与发布模式传消息
- Subject(:OnLostGoal)、Publisher、Subscriber
- 工厂模式生产巡逻兵
# 项目文档 - 智能巡逻兵
## 一、游戏规则
开始游戏后,玩家进入有16个房间的密室,除了玩家开始所在的餐厅之外,每个房间有若干宝石和幽灵,玩家需要集齐所有水晶来打开驱除幽灵,但要小心,不要被幽灵抓到。
游戏开始自动计时,没有时间限制,每摆脱一个幽灵可以获得一分,16个房间中随机散布着10个不同的宝石,除了邪恶的钟表房间有5个幽灵和餐厅没有幽灵之外,其余的房间只有3个幽灵,注意,每个房间东西南北的四个缝隙可能会被柜子或者壁橱堵住。
## 二、游戏效果
### 2.1 游戏效果
| ![](image/1.png) | ![](image/2.png) |
| ---------------- | ---------------- |
### 2.2 视频演示
**视频地址**:https://www.bilibili.com/video/BV1QQ4y1v7Ag?spm_id_from=333.999.0.0 (不知怎么紫的发亮)
**博客地址**:https://wondrouswisdomcard.gitee.io/posts/unity3d3/ (内容和项目文档基本一致)
## 三、项目配置过程
1. **到 AssetStore 下载:**
1. [游戏素材](https://assetstore.unity.com/packages/templates/tutorials/3d-beginner-tutorial-resources-143848):**3D Beginner: Tutorial Resources**
2. [宝石素材](https://assetstore.unity.com/packages/3d/props/simple-gems-ultimate-animated-customizable-pack-73764):**Simple Gems Ultimate Animated Customizable Pack**
| ![image-20211128214604522](image/3.png) | ![image-20211128214651512](image/4.png) |
| --------------------------------------- | --------------------------------------- |
2. **直接复制以下代码到项目中:[代码](https://gitee.com/WondrousWisdomcard/unity3d-homework/tree/master/Homework05/%E9%A1%B9%E7%9B%AE%E4%BB%A3%E7%A0%81/Assets)**
## 四、实现思路
### 4.1 房间的划分与实现
* 我们划分了 4X4 个房间,每个房间为正方形,边长为10,不同的房间可能会有一些装饰(也是游戏过程中的障碍物),玩家初始位于的房间是7号,也就是餐厅,各个房间的编号如下:
![未命名文件](image/11.png)
### 4.2 Animator的实现
**位于:Animation/Animator 中,受限于素材动画有限,Animator比较简单**
#### 4.2.1 PlayerAnimator
![image-20211129090231659](image/9.png)
#### 4.2.2 GhostAnimator
![image-20211129090213938](image/10.png)
## 五、模块介绍 & 核心算法
### 5.1. Model模块
**位于:MyScripts/Model,定义游戏对象的数据和工厂类。**
#### 5.1.1 Gem 宝石
* **GemData**:宝石数据
``` c#
public class GemData : MonoBehaviour{
public int gemID; // 宝石编号
public int gemRoomID; // 宝石所在房间
public bool isValid; // 是否还存在于地图中
public bool isCatch; // 玩家是否碰到宝石
}
```
* **GemFactory**:工厂类,生成宝石
```c#
public class GemFactory : MonoBehaviour
{
private List<GemData> gems = new List<GemData>();
string gemsPath = "MyPrefabs/Gem/Gem";
string[] gemsID = new string[11] {"00", "01", "02", "03", "04", "05", "06", "07", "08", "09", "10"};
int[] gemX = new int[4] {-15, -5, 5, 15};
int[] gemZ = new int[4] {15, 5, -5, -15};
// 返回指定房间内的宝石
public GameObject GetGem(int roomID){
if(gems.Count != 0){
foreach(GemData existGem in gems){
if(existGem.gemRoomID == roomID){
return existGem.gameObject;
}
}
}
return null;
}
// 创建指定ID和房间的宝石
public GameObject GenGem(int gemID, int roomID){
GameObject gem = null;
// 给出宝石的预制路径、根据房间ID算出位置和Quaternion
string gemPath = gemsPath + gemsID[gemID];
int x = gemX[(roomID - 1) % 4];
int z = gemZ[(roomID - 1) / 4];
Vector3 pos = new Vector3(x, 1, z);
Quaternion rot = new Quaternion(-0.707106829F, 0, 0, 0.707106829F);
// 创建宝石对象
gem = GameObject.Instantiate<GameObject>(Resources.Load<GameObject>(gemPath), pos, rot);
// 创建碰撞检测器
gem.AddComponent<GemCollideSensor>();
// 为创建的宝石对象赋予数据
gem.AddComponent<GemData>();
if(gem != null){
GemData gemData = gem.GetComponent<GemData>();
gemData.gemID = gemID;
gemData.gemRoomID = roomID;
gemData.isValid = true;
gemData.isCatch = false;
gems.Add(gemData);
}
gem.SetActive(true);
return gem;
}
// 删除宝石
public void FreeGem(GameObject gem){
foreach(GemData gemData in gems){
if(gemData.gameObject.GetInstanceID() == gem.GetInstanceID()){
gem.SetActive(false);
gems.Remove(gemData);
break;
}
}
}
}
```
* **宝石预制**:
![image-20211128215207638](image/6.png)
#### 5.1.2 Ghost 幽灵
* **GhostData**:幽灵数据
``` c#
public class GhostData : MonoBehaviour{
public int ghostRoomID; // 幽灵所在房间
public int eyeshot; // 幽灵感知半径
public bool isInRange; // 是否发现玩家
public bool isFollow; // 是否正在追击
public bool isCollided; // 是否抓到玩家
}
```
* **GhostFactory**:工厂类,生成幽灵
``` c#
public class GhostFactory : MonoBehaviour
{
private List<GhostData> ghostDatas = new List<GhostData>();
int[] ghostX = new int[4] {-15, -5, 5, 15};
int[] ghostZ = new int[4] {15, 5, -5, -15};
// 创建一个幽灵,i(行)j(列)组成房间号, dx dz 是相对于房间中心的位置
public GameObject GenGhost(int i, int j, int dx, int dz){
GameObject ghost = Instantiate(Resources.Load<GameObject>("MyPrefabs/Ghost"));
ghost.transform.position = new Vector3(ghostX[i] + dx, 0, ghostZ[j] + dz);
ghost.AddComponent<GhostData>();
ghost.AddComponent<GhostCollideSensor>();
ghost.transform.GetChild(0).gameObject.AddComponent<InRangeSensor>();
ghost.transform.GetChild(0).gameObject.GetComponent<InRangeSensor>().ghost = ghost;
GhostData ghostData = ghost.GetComponent<GhostData>();
ghostData.ghostRoomID = i + j * 4 + 1;
ghostData.eyeshot = 5;
ghostData.isInRange = false;
ghostData.isFollow = false;
ghostData.isCollided = false;
ghostDatas.Add(ghostData);
return ghost;
}
}
```
#### 5.1.3 Player 玩家
* **PlayerData**:玩家数据
``` c#
public class PlayerData : MonoBehaviour{
public int playerRoomID; // 玩家所在房间
public bool alive; // 玩家是否存活
}
```
* **PlayerFactory**:玩家工厂
``` c#
public class PlayerFactory : MonoBehaviour
{
private PlayerData playerData;
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
游戏设计要求:智能巡逻兵 创建一个地图和若干巡逻兵(使用动画); 每个巡逻兵走一个3~5个边的凸多边型,位置数据是相对地址。即每次确定下一个目标位置,用自己当前位置为原点计算; 巡逻兵碰撞到障碍物,则会自动选下一个点为目标; 巡逻兵在设定范围内感知到玩家,会自动追击玩家; 失去玩家目标后,继续巡逻; 计分:玩家每次甩掉一个巡逻兵计一分,与巡逻兵碰撞游戏结束; 程序设计要求: 必须使用订阅与发布模式传消息 Subject(:OnLostGoal)、Publisher、Subscriber 工厂模式生产巡逻兵
资源推荐
资源详情
资源评论
收起资源包目录
基于Unity3D实现智能巡逻兵游戏【100011706】 (596个子文件)
LightingData.asset 19KB
Readme.asset 1KB
PlayerAnimController.controller 5KB
GhostAnimController.controller 4KB
GargoyleAnimController.controller 3KB
FirstController.cs 7KB
LightFlicker.cs 4KB
ReadmeEditor.cs 4KB
GhostWalkAction.cs 3KB
AnimationScript.cs 2KB
GemFactory.cs 2KB
UserGUI.cs 2KB
RoomSensor.cs 2KB
SSActionManager.cs 2KB
GhostFollowAction.cs 2KB
GameEventManager.cs 1KB
GhostFactory.cs 1KB
PlayerController.cs 994B
InRangeSensor.cs 976B
CameraController.cs 965B
GhostActionManager.cs 870B
GhostCollideSensor.cs 772B
SSAction.cs 764B
GemCollideSensor.cs 614B
PlayerFactory.cs 590B
CCActionManager.cs 520B
Singleton.cs 477B
GhostData.cs 412B
SSDirector.cs 403B
ISSActionCallback.cs 375B
ScoreRecorder.cs 368B
GemData.cs 345B
Readme.cs 272B
PlayerData.cs 233B
ISceneController.cs 143B
IUserAction.cs 133B
Lightmap-0_comp_light.exr 203KB
ReflectionProbe-0.exr 160KB
Wall_Windows_Straight.fbx 1.93MB
Gargoyle@Idle.fbx 998KB
JohnLemon.fbx 934KB
Wall_Window_02.fbx 698KB
Wall_Window_01.fbx 639KB
John@Idle.fbx 574KB
Wardrobe.fbx 551KB
Gargoyle.fbx 384KB
John@Walk.fbx 379KB
Monster_Lamp.fbx 340KB
Bathtub_Leg.fbx 296KB
Radiator.fbx 291KB
Bedside_Table.fbx 285KB
Ghost@Walk.fbx 266KB
Ghost@Shower.fbx 241KB
Sink.fbx 185KB
Bed.FBX 126KB
Ghost.fbx 125KB
Wall_Corner_Interior.fbx 113KB
Wall_Corner_Exterior_Out.fbx 98KB
Wall_Corner_Exterior_In.fbx 85KB
BathTub.fbx 66KB
Wall_Proto.fbx 63KB
Light.FBX 63KB
Chair_02.FBX 58KB
Fireplace.FBX 58KB
Chair_01.FBX 57KB
Clock.FBX 55KB
Table.FBX 51KB
Pipe.fbx 49KB
CandleStick.FBX 47KB
PictureFrame_Curvy.FBX 45KB
PictureFrame_MrMan.FBX 45KB
PictureFrame_StraightThin.FBX 45KB
Door.FBX 44KB
PictureFrame_Wolf.FBX 41KB
Wall_Straight_Exterior_01.fbx 39KB
Wall_Straight_Exterior_02.fbx 39KB
Wall_Straight_Exterior_03.fbx 39KB
Wall_Straight_Exterior_04.fbx 39KB
PictureFrame_CatLady.FBX 34KB
PictureFrame_GhostMan.FBX 34KB
Rug.FBX 33KB
Rug_Corridor.FBX 32KB
CeilingPlane.fbx 26KB
Wall_Straight_01.fbx 25KB
Wall_Straight_02.fbx 25KB
EndPost.FBX 25KB
DropSplash.fbx 24KB
FloorPlane.fbx 20KB
Floor_Diningroom.fbx 17KB
Mirror.fbx 16KB
Heart.fbx 16KB
SphereGemLarge.fbx 16KB
SoftStar.fbx 16KB
HardStar.fbx 16KB
BeveledStar.fbx 16KB
Hexgon.fbx 15KB
Spiral.fbx 15KB
CubieBeveled.fbx 15KB
Cubie.fbx 15KB
Diamondo5side.fbx 15KB
共 596 条
- 1
- 2
- 3
- 4
- 5
- 6
资源评论
神仙别闹
- 粉丝: 2667
- 资源: 7640
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功