3DUnity编程与设计_HW7

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);

        }

    }
}

这样就完成了基本的游戏模式和框架,然后再模型上搭载动画控制器,如图

这样就完成了。

代码链接:https://github.com/xutaiqi/Unity3D_HW7.git

视频链接:https://www.bilibili.com/video/av74280222/

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值