Unity3D课程学习笔记(六)

智能巡逻兵

  • 提交要求:
  • 游戏设计要求:
    • 创建一个地图和若干巡逻兵(使用动画);
    • 每个巡逻兵走一个3~5个边的凸多边型,位置数据是相对地址。即每次确定下一个目标位置,用自己当前位置为原点计算;
    • 巡逻兵碰撞到障碍物,则会自动选下一个点为目标;
    • 巡逻兵在设定范围内感知到玩家,会自动追击玩家;
    • 失去玩家目标后,继续巡逻;
    • 计分:玩家每次甩掉一个巡逻兵计一分,与巡逻兵碰撞游戏结束;
  • 程序设计要求:
    • 必须使用订阅与发布模式传消息
      • subject:OnLostGoal
      • Publisher: ?
      • Subscriber: ?
    • 工厂模式生产巡逻兵

 

本次作业要求是做一个智能巡逻兵的作业,下载的资源动画用上之后,游戏是参照一个师兄的做出来的,当然我做的是bug无穷的小游戏.......,主要还是在写的基础上添加了一些趣味性吧。

本次作业还要求用一种新学习的设计模式,订阅与发布模式,该模式也称为观察者模式,发布者和订阅者没有直接的耦合,是实现模型与视图分离的重要手段。

本次作业中的地图是自己参照着用正方体弄出来的,所以感觉可能是这个原因导致很多的bug

可以展示一下自己弄的小模型:

虽然说比较丑吧,但是毕竟还是自己做的

本次作业的UML图设计如下:

 

以下是一些主要代码,主要分为几个部分:

1.订阅与发布模式的部分,发布游戏结束和游戏得分的事件

GameEventManager的代码:

public class GameEventManager : MonoBehaviour
{
    public delegate void GameScoreAction();
    public static event GameScoreAction myGameScoreAction;

    public delegate void GameOverAction();
    public static event GameOverAction myGameOverAction;

    private SceneController scene;
    private bool isGameOver;

    void Start()
    {
        scene = SceneController.getInstance();
        scene.gameEventManager = this;
        isGameOver = false;
    }



    //hero逃离巡逻兵,得分
    public void getScore()
    {
        if (myGameScoreAction != null && !isGameOver)
        {
            myGameScoreAction();
        }
    }

    //当巡逻兵捕捉到英雄,游戏结束
    public void gameOver()
    {
        if (myGameOverAction != null)
        {
            isGameOver = true;
            myGameOverAction();
        }
    }
    
    public bool getGameState()
    {
        return isGameOver;
    }
}

GameText的代码,程序就像搭积木一样,用的时候加上去,不用的时候就撤去,就像GameText中代码一样,需要加分的时候i就执行加分的事件,否则就执行游戏结束的事件:

public enum TextType { SCORE, GAMEOVER };
public class GameText : MonoBehaviour
{
    private IGameState states;
    private int score = 0;
    private TextType textType = TextType.SCORE;

    void Start()
    {
        states = SceneController.getInstance() as IGameState;
        checkTheTypeOfText();
    }
    
    private void checkTheTypeOfText()
    {
        if (gameObject.name.Contains("Score"))
        {
            textType = TextType.SCORE;
        }
        else
        {
            textType = TextType.GAMEOVER;
        }
    }

    void OnEnable()
    {
        GameEventManager.myGameScoreAction += gameScore;
        GameEventManager.myGameOverAction += gameOver;
    }

    void OnDisable()
    {
        GameEventManager.myGameScoreAction -= gameScore;
        GameEventManager.myGameOverAction -= gameOver;
    }

    //得分事件
    void gameScore()
    {
        if (textType == TextType.SCORE)
        {
            int index = states.getIndexOfHero();
            switch(index)
            {
                case 0:
                    score += 1;
                    break;
                case 1:
                    score += 2;
                    break;
                case 2:
                    score += 3;
                    break;
                case 3:
                    score += 4;
                    break;
                case 4:
                    score += 5;
                    break;
                case 5:
                    score += 6;
                    break;
            }
            //score++;
            this.gameObject.GetC
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值