Unity3D项目三:牧师与魔鬼

Unity3D学习笔记(4)—— 牧师和魔鬼游戏 牧师和魔鬼游戏是一款益智类游戏,游戏的目标是将3个牧师和3个魔鬼从河的一端安全地送到河的另一端。在运送过程中,船可以搭载两个人,而且必须有一人掌船。无论何时,只要河一边的魔鬼数量多于牧师的数量,游戏就会以失败结束。想玩玩的话请走传送门:Priests and Devils         游戏需要的对象: 游戏角色:3个牧师、3个魔鬼 游戏场景:2个河岸、1艘小船 阅读详情

Unity3D项目三:牧师与魔鬼

基本介绍

  • 列出游戏中提及的事物(Objects)

    牧师,恶魔,船,河流,左侧陆地,右侧陆地

  • 用表格列出玩家动作表(规则表),注意,动作越少越好

    动作条件结果
    点击角色(牧师或魔鬼)游戏未结束,角色在船上角色上岸
    点击角色(牧师或魔鬼)游戏未结束,角色在岸上,点击的角色与船在同一岸边角色上船
    点击船游戏未结束,船上有至少一个角色船移动到另一侧
    点击重新开始无重新开始
  • 请将游戏中对象做成预制

在这里插入图片描述

  • 在 GenGameObjects 中创建 长方形、正方形、球 及其色彩代表游戏中的对象。
  • 使用 C# 集合类型 有效组织对象
  • 整个游戏仅 主摄像机 和 一个 Empty 对象, 其他对象必须代码动态生成!!! 。 整个游戏不许出现 Find 游戏对象, SendMessage 这类突破程序结构的 通讯耦合 语句。 违背本条准则,不给分
    在这里插入图片描述
  • 请使用课件架构图编程,不接受非 MVC 结构程序
  • 注意细节,例如:船未靠岸,牧师与魔鬼上下船运动中,均不能接受用户事件!

完成过程

  1. 首先用各种方块搭建好场景,主要是记住大概的位置,写代码的时候方便。

  2. 基本架构 MVC

    • Model:游戏中所有GameObject,他们受各自Controllor的控制,我将这些对象控制器写在一个命名空间中方便调用。需要注意,Model并不是代码中的类,而是在游戏对象树中存在的实体。

    • View:GUI和Click,GUI负责展示游戏结果等信息,Click负责响应用户的点击。

    • Controllor:除了控制游戏物体的底层控制器,他们之上负责这些物体通讯加载以及根据用户输入执行不同动作的控制器是FirstControllor(场景控制器),场景控制器控制整个场景中所有游戏物体。在场景控制器之上为SSDirect(导演),本次游戏因为只有一个场景,所以导演的作用只负责退出和暂停。
      在这里插入图片描述

  3. 具体实现:
    在这里插入图片描述

    • SSDirector:使用单例模式创建,并且继承于System.Object保持一直存在,不受Unity内存管理。导演负责控制当前场景的运行,切换,游戏的暂停恢复和退出,设定配置等等。

      //导演
      public class SSDirector : System.Object {
          private static SSDirector _instance;
          public ISceneController CurrentScenceController { get; set; }
          public static SSDirector GetInstance() {
              if (_instance == null) {
                  _instance = new SSDirector();
              }
              return _instance;
          }
      }
      
    • ISceneControllor:场景控制器的接口,导演使用这个接口与场景控制器沟通,本次作业中只有加载资源这一个函数需要实现。

      /*in class SSDirector*/
      public ISceneController CurrentScenceController { get; set; }
      
      /*in interface ISceneController*/
      public interface ISceneController {
          void LoadResources();
      }
      
    • IUserAction:用户操作的接口,根据上文中的用户动作表格缩写,使View与Controllor的桥梁。

      public interface IUserAction {
          //移动船
          void MoveBoat();
          //移动角色
          void MoveRole(RoleModel role);
          //重新开始
          void Restart();
          //检查游戏状态
          int Check();
      }
      
    • FirstControllor:场景控制器,是该场景中所有游戏对象“动起来”的核心,使用底层控制器控制各个对象,实现上文中的两个接口供GUI和导演使用。

      public class FirstControllor : MonoBehaviour, ISceneController, IUserAction {
          
          /*场景中的资源*/
          
          void Start() {
              SSDirector director = SSDirector.GetInstance();
              director.CurrentScenceController = this;
              GUI = gameObject.AddComponent<UserGUI>() as UserGUI;
              LoadResources();
          }
      
          public void LoadResources() {
              /*加载资源*/
          }
      
    • UserGUI:建立按钮和标签,不做赘述。

    • LandModel:陆地控制器,首先陆地有两块,所以需要标志是开始岸还是结束岸;而且陆地可以看作一个‘容器’,上面装了牧师和魔鬼(或许还可以装船),所以它有一系列空位置,用来放置角色。

      public class LandModel {
              GameObject land;
              //保存每个角色放在陆地上的位置
              Vector3[] positions;  
              //表示是开始岸还是结束岸
              int land_sign;   
              //该陆地上的角色
              RoleModel[] roles = new RoleModel[6];
              public LandModel(string land_mark) {
                  positions = new Vector3[] {
                      new Vector3(6.35F,2.25F,0), new Vector3(7.35f,2.25F,0), new Vector3(8.35f,2.25F,0),
                      new Vector3(9.35f,2.25F,0), new Vector3(10.35f,2.25F,0), new Vector3(11.35f,2.25F,0)
                  };
                  if (land_mark == "start") land_sign = 1;
                  else land_sign = -1;
                  land = Object.Instantiate(
                          Resources.Load<GameObject>("Prefabs/Land"),
                          new Vector3(9 * land_sign, 1, 0), Quaternion.identity) as GameObject;
                  land.name = land_mark + "Land";
              }
          
             /*many method*/
             
          }
      
    • BoatModel:船控制器,需要的属性为在哪一岸的标志,和在两个岸边的载人位置,船上的角色。船和陆地比较相似,只不过多了一个移动的动作。此处有一个需要注意的点是空位置的设置,startPos和endPos的x轴绝对值是要反过来的否则会出现这样的情况:

      两个角色上船,移动船,离岸远的角色A下船再上船,会与角色B重叠。

      startPos = new Vector3[] { new Vector3(5.5f, 1, 0), new Vector3(4.5f, 1, 0) };
      endPos = new Vector3[] { new Vector3(-4.5f, 1, 0), new Vector3(-5.5f, 1, 0) };
      
    • RoleModel:角色控制器,属性应有:牧师或恶魔的标志,还有在哪一块陆地和在船上的标志,方法应有移动到指定位置。而且我认为角色不能有船或者陆地,这样会使类之间耦合。

    • Move:控制移动,通过标志来区分如何移动,是先垂直再水平,还是先水平再垂直,或者只水平移动。使用Update来实现对象的运动。在使用控制器创建对象时会将该脚本挂载到需要运动的对象上。

      void Update() {
          if (move_sign == 1) {
              transform.position = Vector3.MoveTowards(
                  transform.position, middle_pos, move_speed * Time.deltaTime);
              if (transform.position == middle_pos)
                  move_sign = 2;
          }
          else if (move_sign == 2) {
              transform.position = Vector3.MoveTowards(
                  transform.position, end_pos, move_speed * Time.deltaTime);
              if (transform.position == end_pos)
                  move_sign = 0;
          }
      }
      
    • Click:检测鼠标点击,需要注意的是对象需要挂载Collider组件才会响应点击,不过创建的正方体等是默认挂了的,如果你用了其他的模型需要自己添加合适的碰撞检测器。在使用控制器创建对象时会将该脚本挂载到需要响应点击的对象上。
      在这里插入图片描述

      public class Click : MonoBehaviour {
          IUserAction action;
          RoleModel role = null;
          BoatModel boat = null;
          public void SetRole(RoleModel role) {
              this.role = role;
          }
          public void SetBoat(BoatModel boat) {
              this.boat = boat;
          }
          void Start() {
              action = SSDirector.GetInstance().CurrentScenceController as IUserAction;
          }
          void OnMouseDown() {
              if (boat == null && role == null) return;
              if (boat != null) action.MoveBoat();
              else if (role != null) action.MoveRole(role);
          }
      }
      

      最后,将FirstCortrollor挂载到Main对象上即可运行。代码部分还是参考了师兄的,不过也发现了师兄的几个BUG并改正,而且将角色类与陆地和船的耦合性降低,对代码的层次也重新构建了一下。资源都是商店里免费筛选的前几个,搜Devil和Boat就能找到,牧师的话在免费的前几页。

  4. 关于动画

    如果你下载的资源自带动画,选中动画的文件在检查器中点击Edit,勾上循环时间和循环动作,再将这个文件像贴图一样拖到对象组件的动画器中即可。

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
演示视频:?

github项目传送门:?

感谢师兄的博客参考:?

unity3D-牧师与魔鬼 源码传送门 运行说明:将Controllor.cs挂载Main Camera上,然后点击运行即可 阅读以下游戏脚本 Priests and Devils Priests and Devils is a puzzle game in which you will help the Priests and Devils to cross the river within the time limit. There are 3 priests and 3 devils at one side of the . 阅读详情

相关推荐

大华事件检测智能服务器,大华股份:高速公路智能事件检测 解决方案

1方案背景随着我国基础设施建设的飞速发展,公路尤其是高速公路的总里程数年年攀升。交通运输部统计数据显示,截止2017年底全国公路总里程477.35万公里,其中高速公路13.65万公里,位居世界第一。高速公路的运营和管理作为全国交通管理的重要组成部分日益受到严峻挑战,交通拥堵和事故频发已成为高速公路上非常突出的问题。抛洒物、行人、车辆不规则行驶等事件是导致以上结果的重要原因。基于视频分析的高速公路智...

weixin_39523887的博客 1822

在UNITY中使用面向对象+DMC实现“牧师与魔鬼”

面向对象设计:有一个单例导演类SSDirector和一个场记类FirstController,还有一个挂载在恶魔和牧师上的PositionInfo脚本。SSDirector和场记交互,场记和游戏对象交互。他们都想去这条河的对岸,但只有一艘船,这艘船每次只能载两个人。如果神父的人数超过了河两边的魔鬼,他们就会被杀死,游戏就结束了。:通过点击游戏实体进行交互,点击牧师或魔鬼,可以进行上下船。:通过创建空对象,挂载场记脚本,在场记的awake方法中进行资源加载。:白色方块为牧师,红色方块为魔鬼,棕色矩形为船。

weixin_66458735的博客 474

基于Transformer的CFD代理模型:AeroTransformer原理、实现与优化

计算流体动力学(CFD)仿真是航空航天、汽车工程等领域的关键技术,但其高计算成本限制了设计优化效率。代理模型通过机器学习方法学习输入参数与流场输出间的映射关系,能实现秒级预测,大幅加速仿真流程。Transformer架构凭借其全局注意力机制,能有效建模流场中的长程物理关联,克服了传统卷积神经网络在捕捉全局依赖上的局限。通过预训练与微调策略,模型能先在大规模多样化数据集上学习通用流体规律,再针对特定任务快速适配,显著提升了小样本下的泛化能力与工程实用价值。AeroTransformer项目正是这一技术路线的典

weixin_33509203的博客 359

Unity3D-牧师与魔鬼

Unity_牧师与魔鬼_MVC

m0_64419944的博客 208

大数据架构中的数据血缘追踪技术解析

数据血缘(Data Lineage)是指数据从源头到目标的完整流转路径,它记录了数据在整个生命周期中的变化过程。在大数据架构中,数据血缘追踪技术已经成为数据治理的核心组成部分。本文旨在全面解析数据血缘追踪的技术原理、实现方法和应用实践,帮助读者深入理解这一关键技术。本文将从基础概念入手,逐步深入到技术实现细节,最后探讨实际应用和未来趋势。数据血缘的核心概念和技术原理数据血缘的数学模型和算法实现实际项目案例和代码解析主流工具和解决方案比较未来发展方向和技术挑战。

架构师的AI之路,分享AI应用开发架构的学习与实践。 689

Unity3d--牧师与魔鬼

一.游戏基本规则 Priests and Devils Priests and Devils is a puzzle game in which you will help the Priests and Devils to cross the river within the time limit. There are 3 priests and 3 devils at one side of...

TempterCyn的博客 971

如何在R中高效安装ropls及其依赖包

本文详细介绍了在R语言中高效安装ropls包及其依赖的完整流程。作为Bioconductor生物信息学分析包,ropls的安装需通过BiocManager管理器进行。文章提供了标准安装步骤、跨系统避坑指南及安装后验证方法,帮助用户解决R版本、编译环境和网络镜像等常见问题,确保代谢组学数据分析工具顺利部署。

efc123456的博客 908

Unity 3D游戏开发学习笔记(2) 牧师与魔鬼

游戏事物:3牧师,3恶魔,2河岸,河,船。 游戏故事:3牧师和3恶魔需要用一艘船全部到达彼岸,但是船上和岸上都不能出现恶魔比牧师多的情形,否则恶魔会把牧师K.O,玩家输掉比赛;直到所有牧师恶魔都到达对岸,玩家取得胜利。MVC架构: IUserAction:是个接口,定义了行为的类型。 UserGUI:创建GUI对象,实现玩家互动,处理玩家操作,并通过IUserAction接口实现具体行为。

没有标题 553

Docker入门教程:在腾讯云轻量服务器上部署你的第一个容器化应用 (2025)

还在为“在我电脑上明明是好的”而烦恼?本篇Docker入门教程,用通俗易懂的比喻解释镜像、容器的核心概念,并手把手带你在腾讯云轻量服务器上,从运行Nginx到编写Dockerfile打包自己的Python应用,轻松掌握容器化部署。

Clownseven的博客 2084

360加固DEX解密与ELF修复技术解析

本文深入解析了360加固APK的逆向分析技术,重点探讨了其DEX解密与ELF文件修复的核心流程。通过动态调试与Frida脚本,详细拆解了壳的启动机制、反调试绕过、自实现Linker技术,并还原了基于RC4和自定义算法的多层DEX解密过程,为移动安全研究人员提供了实用的实战分析思路。

alice7model的博客 701

Unity3D游戏——魔鬼与牧师(动作分离版)实现

受限于篇幅原因,所有的代码实现就不一一赘述了。在该游戏实现中,我们主要采用了MVC架构将游戏的各个部件拆分开来实现,同时添加了动作分离,将对象的运动分离到了CCAction中,从控制器中分离了出来,大大减轻了控制器的任务以及代码量。

a161949的博客 1028

【YOLO11改进 - 特征融合】利用Hyper-YOLO 的混合聚合网络(MANet)改进yolo11,提升基础网络的特征提取能力

【YOLO11改进 - 特征融合】利用Hyper-YOLO 的混合聚合网络(MANet)改进yolo11,提升基础网络的特征提取能力

专注于图像领域,主要研究内容包括计算机视觉和深度学习,特别是在图像分类、目标检测和图像生成等方面有深入的研究和实践经验。 905

Unity3d学习之路-牧师与魔鬼

Unity3d学习之路-牧师与魔鬼 游戏基本介绍 游戏规则: Priests and Devils is a puzzle game in which you will help the Priests and Devils to cross the river within the time limit. There are 3 priests and 3 devils at ...

C486C的博客 2675

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

unity3D_牧师与魔鬼

成品图 球体代表牧师,正方体代表魔鬼。 目的 ​ 使用unity3D做出一个牧师与魔鬼的游戏,程序需要满足以下要求: play the game ( http://www.flash-game.net/game/2535/priests-and-devils.html ) 列出游戏中提及的事物(Objects) 用表格列出玩家动作表(规则表),注意,动作越少越好 请将游戏中对象做...

qq_36184359的博客 807

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Unity3D 牧师与魔鬼游戏

Unity3D 牧师与魔鬼游戏题目要求阅读游戏脚本程序需要满足的要求游戏中的对象玩家动作表格游戏结构游戏运行截图 题目要求 阅读游戏脚本 Priests and Devils Priests and Devils is a puzzle game in which you will help the Priests and Devils to cross the river within t...

Passenger317_的博客 462

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

unity3D游戏——魔鬼与牧师(Devil and Priest)的MVC实现

魔鬼与牧师(Devil and Priest)是一个经典的智力解谜游戏,玩家需要帮助三位魔鬼和三位牧师,将所有的牧师带过河,同时还要确保牧师不会被魔鬼吃掉。下面是游戏的规则和背景故事:规则:1. 在河的一边有三个魔鬼、三个牧师以及一条船。2. 船最多可以承载两个角色(牧师或魔鬼)且必须承载一个角色。3. 当河的一侧的魔鬼数量大于牧师数量时,魔鬼会吃掉牧师。4. 玩家需要将所有的牧师都安全地运送到另一侧的河岸,而且保证没有牧师被魔鬼吃掉。

Y2807593076的博客 746

Unity3d入门之路-牧师与魔鬼

第二次作业 1、简答并用程序验证【建议做】 游戏对象运动的本质是什么? 请用三种方法以上方法,实现物体的抛物线运动。(如,修改Transform属性,使用向量Vector3的方法…) 写一个程序,实现一个完整的太阳系, 其他星球围绕太阳的转速必须不一样,且不在一个法平面上。 2、编程实践 阅读以下游戏脚本 Priests and Devils   Priests and Devils is a ...

sir_beginner的博客 351

Unity3D:牧师与魔鬼

unity3D游戏设计之牧师与魔鬼 3d游戏编程与设计作业博客 附有完整代码以及配置方法

yoyo_hu的博客 1374

unity 3D 牧师与魔鬼小游戏

啊啊啊啊啊啊啊啊啊bkbkbkbk

f1165599373的博客 451

unity编程实践 牧师与魔鬼

编程实践 阅读以下游戏脚本 Priests and Devils Priests and Devils is a puzzle game in which you will help the Priests and Devils to cross the river within the time limit. There are 3 priests and 3 devils at one side of the river. They all want to get to the other side

m0_52081442的博客 880

3D游戏设计与分析-牧师与魔鬼

3D游戏设计与分析-牧师与魔鬼 目录3D游戏设计与分析-牧师与魔鬼目标列出游戏中提及的事物表格列出玩家动作表具体实现DirectorControllerGenGameObjectUI详细代码 目标 ​使用unity3D做出一个牧师与魔鬼的游戏,程序需要满足以下要求: play the game ( http://www.flash-game.net/game/2535/priests-and-devils.html ) 列出游戏中提及的事物(Objects) 用表格列出玩家动作表(规则表),注意,动作越少

cyhsnyd的博客 359

【3D游戏编程与设计】三 空间与运动 : 牧师与魔鬼

【3D游戏编程与设计】三 空间与运动 & 牧师与魔鬼简答并用程序验证【建议做】编程实践 简答并用程序验证【建议做】 编程实践

STcyclone的博客 401

Unity3D牧师与魔鬼游戏

Unity的牧师与魔鬼游戏实现

brandonlv的博客 139

基于Unity3D开发的3D小游戏牧师与魔鬼

MVC架构由 Model 业务模型 View 视图 Controller 控制器组成。MVC架构是一种软件设计典范,用一种业务逻辑和数据显式分离的方法组织代码,将业务逻辑聚集到一个部件里面,在界面和用户围绕数据的交互能被改进和个性化定制的同时而不需要重新编写业务逻辑。MVC被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中。**Model(模型)**是应用程序中用于处理应用程序数据逻辑的部分。通常模型对象负责在数据库中存取数据。模型表示企业数据和业务规则。

毕业作品网站 395

【Unity3d学习】基础MVC程序设计——魔鬼与牧师游戏

前言 资料来源于潘老师的课程网站,详细信息可以去了解。 还有附上参考大佬的优秀博客:传送门 感谢师兄师姐博客的指导! 游戏脚本 Priests and Devils Priests and Devils is a puzzle game in which you will help the Priests and Devils to cross the river within the tim...

JKJKL1的博客 695
上一篇: Unity3D项目二:太阳系仿真
下一篇: Unity3D作业二:空间与运动
Tifinity
博客等级 码龄9年 18粉丝 40原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值