1、智能巡逻兵
提交要求:游戏设计要求: 创建一个地图和若干巡逻兵(使用动画);每个巡逻兵走一个3~5个边的凸多边型,位置数据是相对地址。即每次确定下一个目标位置,用自己当前位置为原点计算;巡逻兵碰撞到障碍物,则会自动选下一个点为目标;巡逻兵在设定范围内感知到玩家,会自动追击玩家;失去玩家目标后,继续巡逻;计分:玩家每次甩掉一个巡逻兵计一分,与巡逻兵碰撞游戏结束;程序设计要求: 必须使用订阅与发布模式传消息 subject:OnLostGoalPublisher: ?Subscriber: ?工厂模式生产巡逻兵友善提示1:生成 3~5个边的凸多边型 随机生成矩形在矩形每个边上随机找点,可得到 3 - 4 的凸多边型5 ?友善提示2:参考以前博客,给出自己新玩法采用和之前一样的MVC架构和动作分离设计模式,同时使用工厂模式来加载怪物的预制。
怪物的动作为当玩家没有进入自己属于的区域时,在自己所在的区域内随机移动,当玩家进入自己属于的区域后会向玩家移动。玩家的移动由键盘输入来控制,输入W、S或者方向键的上下来进行向前向后移动,输入A、D或者方向键的左右来进行转向。
游戏主要的脚本和之前的作业大致相同,设计模式也大致相同,代码的结构也相似。此处就不在详细解释
与之前作业不同的地方是,本次游戏加入了碰撞因素,怪物碰撞到玩家,会使玩家死亡,玩家离开怪物所在区域进入下个区域会与下个区域的触发器相碰,从而得知玩家进入新的区域,从而通知游戏事件管理器,甩掉一次怪物加一分,此处采用的订阅与发布模式。碰撞事件类似订阅报纸的订阅行为,从而通知游戏事件管理器,来进行计分或者直行玩家死亡行为。
具体代码如下:
游戏事件管理器:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using UnityEngine; public class GameEventManager { public static GameEventManager Instance = new GameEventManager(); //计分委托 public delegate void ScoreEvent(); public static event ScoreEvent ScoreChange; // //游戏结束委托 public delegate void GameoverEvent(); public static event GameoverEvent GameoverChange; private GameEventManager() { } //玩家逃脱进入新区域 public void PlayerEscape() { if (ScoreChange != null) { ScoreChange(); } } //玩家被捕,游戏结束 public void PlayerGameover() { if (GameoverChange != null) { GameoverChange(); } } }区域碰撞触发器脚本:
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.SetPlayerArea(sign); GameEventManager.Instance.PlayerEscape(); } } }玩家被怪物碰撞触发器脚本:
using System.Collections; using System.Collections.Generic; using UnityEngine; public class PlayerCollide : MonoBehaviour { void OnCollisionEnter(Collision other) { //当玩家与怪物相撞 if (other.gameObject.tag == "Player") { GameEventManager.Instance.PlayerGameover(); } } }同时增加了新玩法,游戏通关的途径,地图中存在9个水晶,玩家碰到水晶后,水晶被收集(水晶消失,水晶计数加一),当九个水晶都被收集齐后,游戏获得胜利,即可退出游戏。
水晶触发器脚本:
using UnityEngine; using System.Collections; using System.Collections.Generic; public class CollectCollide : MonoBehaviour { void OnCollisionEnter(Collision other) { SSDirector director; //当玩家与shuijing相撞 if (other.gameObject.tag == "Player") { Debug.Log(this.gameObject.GetInstanceID()); Destroy(this.gameObject); director = SSDirector.getInstance(); int i=director.currentScenceController.GetCollector(); i = i + 1; director.currentScenceController.setCollect(i); } } }这样就完成了基本的游戏模式和框架,然后再模型上搭载动画控制器,如图
这样就完成了。
代码链接:https://github.com/xutaiqi/Unity3D_HW7.git
视频链接:https://www.bilibili.com/video/av74280222/
