一、游戏介绍

在一张地图上有若干个巡逻兵,每个巡逻兵按照矩形路线进行巡逻,当巡逻兵碰到障碍物时会根据当前位置自动进行调整。在巡逻兵巡逻期间,如果玩家进入巡逻范围会自动追击玩家,当玩家消失在巡逻范围内后继续巡逻。游戏根据玩家甩掉的巡逻兵以及拾取到的奖励进行计分。

二、游戏素材

在Unity资源商店进行下载

三、游戏实现

玩家角色控制

巡逻兵的控制

使用订阅发布模式传递消息:

物体工厂类:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class GameObjectFactory : MonoBehaviour {private List<GameObject> usedPatrol = new List<GameObject>();  // 正在被使用的巡逻兵对象private List<GameObject> usedTreasure = new List<GameObject>();  // 正在被使用的宝箱对象// 巡逻兵获取方法public List<GameObject> GetPatrols() {// 巡逻兵游戏对象GameObject patrolPrefab = GameObject.Instantiate(Resources.Load<GameObject>("Prefabs/Patrol"), Vector3.zero, Quaternion.identity);patrolPrefab.SetActive(false);float[] posX = { -5.5f, 4.5f, 12.5f };float[] posZ = { -4.5f, 5.5f, -12.5f };// 生成巡逻兵的初始位置for (int i = 0; i < 3; ++i) {for (int j = 0; j < 3; ++j) {Vector3 startPos = new Vector3(posX[i], 0, posZ[j]);GameObject patrol = GameObject.Instantiate(patrolPrefab, startPos, Quaternion.identity);patrol.SetActive(true);patrol.GetComponent<PatrolData>().patrolAreaId = i * 3 + j + 1;patrol.GetComponent<PatrolData>().startPos = startPos;usedPatrol.Add(patrol);}}return usedPatrol;}// 巡逻兵回收方法public void FreePatrols() {// 巡逻兵停止for (int i = 0; i < usedPatrol.Count; ++i) {usedPatrol[i].gameObject.GetComponent<Animator>().SetBool("run", false);}}// 宝箱获取方法public List<GameObject> GetTreasures() {// 宝箱游戏对象GameObject treasurePrefab = GameObject.Instantiate(Resources.Load<GameObject>("Prefabs/Treasure"), Vector3.zero, Quaternion.identity);treasurePrefab.SetActive(false);for (int i = 0; i < Director.GetInstance().mainController.GetTreasureNumber(); ++i) {int xIndex = Random.Range(0, 24) - 12;int zIndex = Random.Range(0, 24) - 12;GameObject treasure = GameObject.Instantiate(treasurePrefab, new Vector3(xIndex, 0, zIndex), Quaternion.identity);treasure.SetActive(true);usedTreasure.Add(treasure);}return usedTreasure;}
}

MainControll 类

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;public class MainController : MonoBehaviour {private ScoreController scoreRecorder;  // 记分器private PatrolMoveManager moveManager;  // 移动管理器private int playerAreaId;  // 玩家所处区域序号private GameObject player;  // 玩家对象public Camera mainCamera;  // 主相机public int treasureNumber = 10;  // 宝箱数量public float moveSpeed = 5;  // 移动速度public float rotateSpeed = 35f;  // 旋转速度private bool isGameOver;  // 游戏是否结束void Start() {Director director = Director.GetInstance();director.mainController = this;scoreRecorder = gameObject.AddComponent<ScoreController>() as ScoreController;moveManager = gameObject.AddComponent<PatrolMoveManager>() as PatrolMoveManager;LoadResources();mainCamera.GetComponent<CameraFollow>().follow = player;isGameOver = false;}void Update() {CheckGameOver();}// 加载资源public void LoadResources() {// 生成地图Instantiate(Resources.Load<GameObject>("Prefabs/Map"));// 生成玩家player = Instantiate(Resources.Load("Prefabs/Player"), new Vector3(0, 9, 0), Quaternion.identity) as GameObject;// 生成宝箱Singleton<GameObjectFactory>.Instance.GetTreasures();// 生成巡逻兵并让其移动MovePatrol();}public void MovePatrol() {// 让所有巡逻兵都移动List<GameObject> patrols = Singleton<GameObjectFactory>.Instance.GetPatrols();for (int i = 0; i < patrols.Count; i++) {moveManager.MoveRect(patrols[i]);}}// 玩家移动public void MovePlayer(float translationX, float translationZ) {if(!isGameOver) {MovePlayerAction(translationX, translationZ);if (player.transform.position.y != 0) {player.transform.position = new Vector3(player.transform.position.x, 0, player.transform.position.z);}     }}// 设置玩家移动时的跑步动作public void MovePlayerAction(float translationX, float translationZ) {if (translationX != 0 || translationZ != 0) {player.GetComponent<Animator>().SetBool("run", true);}else {player.GetComponent<Animator>().SetBool("run", false);}// 移动和旋转动作player.transform.Translate(0, 0, translationZ * moveSpeed * Time.deltaTime);player.transform.Rotate(0, translationX * rotateSpeed * Time.deltaTime, 0);}//public void updateF()//{//    Vector3 world1=new Vector3();//物体要移动到的位置 (世界坐标系)//    Vector3 targetposition = Camera.main.WorldToScreenPoint(player.transform.position);//    Vector3 mouseposition = Input.mousePosition;//鼠标在屏幕上的位置坐标//    if (targetposition.y != mouseposition.y)//    {//        player.transform.Rotate(0, (mouseposition.y - targetposition.y) * rotateSpeed * Time.deltaTime, 0);//    }  //}public void IncreaseScore() {scoreRecorder.IncreaseScore();}public void CheckGameOver() {// 所有宝箱都被收集,游戏结束if(treasureNumber == 0) {Gameover();}}// 游戏结束,释放所有的巡逻兵public void Gameover() {isGameOver = true;Singleton<GameObjectFactory>.Instance.FreePatrols();moveManager.DestroyAll();}public void DecreaseTreasureNumber() {treasureNumber--;}public int GetScore() {return scoreRecorder.GetScore();}public void SetPlayerAreaId(int areaId) {playerAreaId = areaId;}public int GetPlayerAreaId() {return playerAreaId;}public int GetTreasureNumber() {return treasureNumber;}public bool GetGameover() {return isGameOver;}public void Restart() {SceneManager.LoadScene("Scenes/SampleScene");}void OnEnable() {GameEventManager.AddScoreAction += IncreaseScore;GameEventManager.GameoverAction += Gameover;GameEventManager.DecreaseTreasureAction += DecreaseTreasureNumber;}void OnDisable() {GameEventManager.AddScoreAction -= IncreaseScore;GameEventManager.GameoverAction -= Gameover;GameEventManager.DecreaseTreasureAction -= DecreaseTreasureNumber;}
}

SSAction类

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class SSAction : ScriptableObject {public bool enable = true;  // 动作可进行public bool destroy = false;  // 动作已完成可被销毁public GameObject gameobject { get; set; }  // 附着游戏对象public Transform transform { get; set; }  // 游戏对象的的运动public ISSActionCallback callback { get; set; }  // 回调函数public virtual void Start() {}  // Start()重写方法public virtual void Update() {}  // Update()重写方法
}

SSActionManager类

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class SSAction : ScriptableObject {public bool enable = true;  // 动作可进行public bool destroy = false;  // 动作已完成可被销毁public GameObject gameobject { get; set; }  // 附着游戏对象public Transform transform { get; set; }  // 游戏对象的的运动public ISSActionCallback callback { get; set; }  // 回调函数public virtual void Start() {}  // Start()重写方法public virtual void Update() {}  // Update()重写方法
}

四、游戏内容展示

Unity 智能巡逻兵游戏相关推荐

  1. 用Unity3D实现智能巡逻兵游戏

    用Unity3D实现智能巡逻兵游戏 项目地址 智能巡逻兵游戏 完成效果图 类图 要求 游戏设计要求: 创建一个地图和若干巡逻兵(使用动画): 每个巡逻兵走一个3~5个边的凸多边型,位置数据是相对地址. ...

  2. Unity —— 智能巡逻兵

    游戏设计要求: 创建一个地图和若干巡逻兵(使用动画): 每个巡逻兵走一个3~5个边的凸多边型,位置数据是相对地址.即每次确定下一个目标位置,用自己当前位置为原点计算: 巡逻兵碰撞到障碍物,则会自动选下 ...

  3. Unity实现智能巡逻兵小游戏

    Unity实现智能巡逻兵小游戏 项目地址 演示视频 设计模式:对象的行为 行为型模式用于描述程序在运行时复杂的流程控制,即描述多个类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,它涉及算 ...

  4. Unity巡逻兵游戏-与怪兽战斗!

    Unity巡逻兵游戏-与怪兽战斗! 本次作业项目地址: https://github.com/StarashZero/3DGameDesign/tree/master/hw7 游戏简介 操作迷路少女与 ...

  5. 基于Unity3D开发的智能巡逻兵小游戏

    智能巡逻兵小游戏 作业要求 游戏设计要求:智能巡逻兵 创建一个地图和若干巡逻兵(使用动画): 每个巡逻兵走一个3~5个边的凸多边型,位置数据是相对地址.即每次确定下一个目标位置,用自己当前位置为原点计 ...

  6. 模型与动画——智能巡逻兵

    文章目录 模型与动画--智能巡逻兵 一.提交要求: 二.具体玩法: 三.订阅发布模式MVC框架: 四.程序实现: 4.1 玩家部分实现: 4.1.0 玩家预制和动画设置: 4.1.1 Interfac ...

  7. 3D游戏设计-智能巡逻兵

    游戏简介 躲过巡逻兵的追杀. 游戏规则 一共有九个房间,每个房间有一个巡逻兵,玩家进入房间时该房间的巡逻兵会追杀玩家. 玩家从一个房间进入另一个房间(躲过追杀)时加一分. 玩家被巡逻兵追上则死亡,游戏 ...

  8. unity实现智能巡逻兵

    1. 制作预制体 在Asserts store中下载资源,制作预制体 地面: 玩家: 巡逻兵: 水晶: 2. 动画控制器 玩家: 巡逻兵: 3. 代码 碰撞脚本 PlayerCollide 当玩家与侦 ...

  9. unity实现简单巡逻兵

    unity实现简单巡逻兵 游戏视频 游戏要求 创建一个地图和若干巡逻兵(使用动画): 每个巡逻兵走一个3~5个边的凸多边型,位置数据是相对地址.即每次确定下一个目标位置,用自己当前位置为原点计算: 巡 ...

最新文章

  1. Fedora 19下Guacamole的安装使用
  2. kafka在zookeeper下的目录结构
  3. Java开发面试问题,Java中高级核心知识全面解析(10)
  4. redis 本机链接服务端命令
  5. 数据库事务隔离级别-- 脏读、幻读、不可重复读(清晰解释)
  6. 520 丁磊向全国英语老师“表白”:再送有道词典笔
  7. ssas 分层维度_通过SSAS维度层次结构增强数据分析
  8. 【笔记】移植C的GNU Go到网页版
  9. 电压源和电流的关联参考方向_电压电流为关联参考方向.PPT
  10. 用word这么多年,90%的人居然不知道这12个小技巧
  11. 汇编:根据段大小计算偏移地址
  12. Java框架学习笔记--Mybatis学习
  13. 回顾使用云桌面的那些经验
  14. Docker容器内部无法访问外网原因之一
  15. GraphicsLab Project之基于物理的着色系统(Physical based shading)-直接光照
  16. C语言填空答题考试系统
  17. 在汽车控制器应用最广最多的芯片之一-英飞凌-AURIX架构
  18. Matlab:isempty()函数用法
  19. 计算机技术:编程语言:Python
  20. 密码对的还出现 Access denied for user ‘‘@‘localhost‘ (using password: NO) 错误

热门文章

  1. 【LeetCode】二叉树的最大深度
  2. Valine评论系统
  3. 默纳克全系列电梯软件刷协议
  4. Revit二次开发知识分享(二十一)修改墙的厚度(楼板同理)
  5. Linx常见基本指令
  6. powerdesigner数据库建模
  7. Java swing简易浏览器(其一)页面显示,超链接跳转与手动输入URL跳转
  8. 解决GridView防止压扁
  9. MySQL的用户变量和系统变量
  10. C#上位机学习(二)--GPS数据接收