1、智能巡逻兵
- 提交要求:
- 游戏设计要求:
- 创建一个地图和若干巡逻兵(使用动画);
- 每个巡逻兵走一个3~5个边的凸多边型,位置数据是相对地址。即每次确定下一个目标位置,用自己当前位置为原点计算;
- 巡逻兵碰撞到障碍物,则会自动选下一个点为目标;
- 巡逻兵在设定范围内感知到玩家,会自动追击玩家;
- 失去玩家目标后,继续巡逻;
- 计分:玩家每次甩掉一个巡逻兵计一分,与巡逻兵碰撞游戏结束;
- 程序设计要求:
- 必须使用订阅与发布模式传消息
- subject:OnLostGoal
- Publisher: ?
- 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);
}
}
}
这样就完成了基本的游戏模式和框架,然后再模型上搭载动画控制器,如图
这样就完成了。