Unity3D-- 简单巡逻兵 (订阅与发布模式)

本文介绍了如何使用Unity3D设计一款巡逻兵小游戏,游戏规则包括玩家移动、避开巡逻兵和收集水晶。文章详细阐述了设计要求、游戏预览,并重点讲解了运用订阅与发布模式进行程序设计,同时提到了工厂模式用于生产巡逻兵。设计过程中涉及地图、预制、碰撞器和刚体组件的配置,以及订阅与发布模式在游戏事件响应中的应用。
摘要由CSDN通过智能技术生成

巡逻兵小游戏

1、设计要求

  • 游戏规则 
    使用WSAD或方向键上下左右移动player,进入巡逻兵的追捕后逃脱可积累一分,若与巡逻兵碰撞则游戏结束,收集完地图上的所有水晶即可获胜。

  • 游戏设计要求:

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

    • 必须使用订阅与发布模式传消息
    • 工厂模式生产巡逻兵

2、游戏预览

附上录制小视频的地址:  https://www.bilibili.com/video/av23317658/

游戏截图:


3、设计过程

1、首先上unity3d的官网上的asset store上找一些能用的免费的资源

2、设计预制

利用找到的免费资源和一些unity自带的模型设计各种你需要的预制,这些都是游戏中可能会使用到的。我的预制有这几种:地图、玩家以及巡逻兵。

地图的话,可以按照自己的喜好来设计,设置墙体、障碍以及金币什么的都是可以的,按自己喜欢的来

然后我们需要在地图、玩家以及巡逻兵身上设计各种碰撞器,另外我们还需要在玩家和巡逻兵身上设置刚体组件

3、编写程序

这次作业老师要求我们使用订阅与发布模式来传消息,刚接触到这个概念的时候还是十分陌生的,那么究竟什么是订阅与发布模式呢?首先我们来思考这样一个问题,假设一个程序的后台有这样一种功能:

当产生警告的时候,程序需要执行若干种操作来进行响应。我们想象一下,如果产生警告的时候我们需要做好几十件事情的话,那么这个类是有多复杂。所以我们需要把报警信息和各种方法解耦合,这个时候就需要用到我们的订阅与发布模式了。

                        

事件触发者称为消息发布者,即图中的P。事件接受称为消息订阅者,即图中的S。P与S之间通过S.P(即订阅器)连接。这样就实现了P与S的解耦。首先,P就把消息发送到指定的订阅器上,S如果想接收消息,就要向订阅器进行订阅,订阅成功后,S就可以接收来自S.P的消息了同理,S还可以向S.P进行退订操作,成功退订后,S就无法接收到来自指定S.P的消息了。这样就完美的解决了P与S之间的解耦。

4、UML图


5、项目代码

AreaCollide.cs

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.wall_sign = sign;
        }
    }
}
FirstSceneController.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;






public interface ISceneController
{
	//加载场景资源
	void LoadResources();
}

public interface IUserAction                          
{
	//移动玩家
	void MovePlayer(float translationX, float translationZ);
	//得到分数
	int GetScore();
	//得到水晶数量
	bool GetGameover();
	//重新开始
	void Restart();
}

public interface ISSActionCallback
{
	void SSActionEvent(SSAction source,int intParam = 0,GameObject objectParam = null);
}

public interface IGameStatusOp
{
	void PlayerEscape();
	void PlayerGameover();
}


public class FirstSceneController : MonoBehaviour, IUserAction, ISceneController
{
    public PropFactory patrol_factory;                               //巡逻者工厂
    public ScoreRecorder recorder;                                   //记录员
    public PatrolActionManager action_manager;                       //运动管理器
    public int wall_sign = -1;                                       //当前玩家所处哪个格子
    public GameObject player;                                        //玩家
    public Camera main_camera;                                       //主相机
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值