Unity3D 牧师与魔鬼

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 . 阅读详情
使用MVC结构编程
首先,我针对这个游戏总结了UML图,明确了我需要哪些函数,哪些类来支持游戏的实现:

这里写图片描述
GameModel
从图上我们可以看出我们需要4个GameModel,分别是:

  • moveable:用于控制角色和船的移动。
  • CoastController:用于控制与河岸有关的动作,比如角色上下岸,船的离开和停靠。
  • MyCharacterController:用于控制6个角色的动作,比如上船,上岸等。
  • BoatController:用于控制船的运动以及角色的上下船绑定。

对于moveable类,这个类只有三个函数,UpDate函数用于控制船的运动,在类的变量中我添加了一个中间量保证船是在河中运动而不出现能够穿过河岸的bug。

public class moveable: MonoBehaviour
    {
        readonly float move_speed = 20;
        private int move_to_where;//0->not move, 1->to middle, 2->to destination
        private Vector3 dest;
        private Vector3 middle;
        public static int cn_move = 0;//0->can move, 1->cant move

        void Update(){
            if (cn_move == 1)
                return;
            else{
                if(move_to_where == 1){
                    transform.position = Vector3.MoveTowards(transform.position, middle, move_speed*Time.deltaTime);
                    if (transform.position == middle)
                        move_to_where = 2;
                }
                else if(move_to_where == 2){
                    transform.position = Vector3.MoveTowards(transform.position, dest, move_speed*Time.deltaTime);
                    if (transform.position == dest)
                        move_to_where = 0;
                }
            }
        }

        public void SetDestination(Vector3 _dest){
            if (cn_move == 1)
                return;
            else{
                middle = _dest;
                dest = _dest;
                if (_dest.y < transform.position.y) {
                    middle.y = transform.position.y;
                } else {
                    middle.x = transform.position.x;
                }
                move_to_where = 1;
            }
        }
        public void reset(){
            if (cn_move == 1)
                return;
            else{
                move_to_where = 0;
            }
        }
    }

而在MyCharacterController类中,我们就要关注6个角色与船,河岸的联系,特别是在船移动时我们要保证角色是和船绑定的,以此来保证船和角色一起移动。代码太长就不展示了。。。
对于CoastController类和BoatController类,我将他们定义成容器使用,用于容纳角色。因此,我们需要给给这两个类分配容纳角色的空间的数组属性。同时还要判断是否有空间放置角色,最后是要能够返回牧师与魔鬼各自的数量用于判断游戏是否能够结束。同上,代码太长,加上我懒,就不放上去了。

View
我设定视图框架为与用户交互的界面,其中包括游戏场景,游戏对象的生成,游戏的重开,暂停,继续等功能。包括了ClickGUI和UserGUI两个类。

  • UserGUI类:设置游戏的重开,暂停及继续游戏的按钮。
  • ClickGUI类:设置游戏对象的点击事件。
    private UserAction action;
    private GUIStyle MyStyle;
    private GUIStyle MyButtonStyle;
    public int if_win_or_not;

    void Start(){
        action = Director.get_Instance ().curren as UserAction;

        MyStyle = new GUIStyle ();
        MyStyle.fontSize = 40;
        MyStyle.normal.textColor = new Color (255f, 0, 0);
        MyStyle.alignment = TextAnchor.MiddleCenter;

        MyButtonStyle = new GUIStyle ("button");
        MyButtonStyle.fontSize = 30;
    }
    void reStart(){
        if (GUI.Button (new Rect (Screen.width/2-Screen.width/8, Screen.height/2+100, 150, 50), "Restart", MyButtonStyle)) {
            if_win_or_not = 0;
            action.restart ();
            moveable.cn_move = 0;
        }
    }
    void IsPause(){
        if (GUI.Button (new Rect (Screen.width / 2 - 350, Screen.height / 2 + 100, 150, 50), "Pause", MyButtonStyle)) {
            if (moveable.cn_move == 0) {
                action.pause ();
                moveable.cn_move = 1;
            } 
        } else if (GUI.Button (new Rect (Screen.width-Screen.width/2, Screen.height / 2 + 100, 150, 50), "Continue", MyButtonStyle)) {
            if (moveable.cn_move == 1) {
                action.Coninu();
                moveable.cn_move = 0;
            }
        }
    }
    void OnGUI(){
        IsPause ();
        reStart ();
        if(moveable.cn_move == 1)
            GUI.Label (new Rect (Screen.width/2-Screen.width/8, 50, 100, 50), "Pausing", MyStyle);
        if (if_win_or_not == -1) {
            GUI.Label (new Rect (Screen.width/2-Screen.width/8, 50, 100, 50), "Game Over!!!", MyStyle);
            IsPause ();
            reStart ();
        } else if (if_win_or_not == 1) {
            GUI.Label (new Rect (Screen.width/2-Screen.width/8, 50, 100, 50), "You Win!!!", MyStyle);
            IsPause ();
            reStart ();
        }
    }
    UserAction action;
    MyCharacterController character;

    public void setController(MyCharacterController tem){
        character = tem;
    }
    void Start(){
        action = Director.get_Instance ().curren as UserAction;
    }
    void OnMouseDown(){
        if (gameObject.name == "boat") {
            action.moveboat ();
        } else {
            action.isClickChar (character);
        }
    }

Controller
重头戏来了,对于整个游戏,我们需要一个场记用于指挥所有角色的行为,与用户的交互等,这个类就是MySceneController。但我们立刻就会想到有了场记我们还缺少导演的。于是我们有Director类实现单例模式,在游戏开始时仅创建一个实例,这个实例控制着游戏的运行,暂停,互动。

        private static Director _instance;
        public SceneController curren{ get; set;}
        public static Director get_Instance(){
            if (_instance == null)
            {
                _instance = new Director();
            }
            return _instance;
        }

最后,哎,终于来到结尾了。我们需要实现两个接口:SceneController,这个接口是由导演控制用来实现游戏场景的加载,在这里我并没有把暂停游戏和继续游戏的函数放在这个接口,原因在于我觉得这是属于用户交互的方面,应该用在门面模式(Fasade):外部与一个子系统的通信必须通过一个统一的门面(Facade)对象进行。
这个门面模式用了UserAction接口中,MySceneController类必须实现UserAction接口的函数才能与用户通信,控制用户与游戏的互动。

说实话,这是我用Unity和C#第一次做面向对象设计,感觉像是大一的C++实训,那个时候也有实例,啊,感觉这个星期又经历了一次实训啊。
放成品图:
这里写图片描述
还是要感谢一波师兄的博客,完美的指导!!!!
最后放上鄙人的github:wangld,有需自取。

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

相关推荐

森林冰火人html源码,森林冰火人单人版(源码)

【实例简介】java小游戏——森林冰火人,单人游戏, 实现人物行走,跳跃,吃水晶,具有计时功能,积分功能,倒计时结束游戏失败。【实例截图】【核心代码】森林冰火人单人版├── bin│ ├── game│ │ ├── Help.class│ │ ├── Logon.class│ │ ├── Main.class│ │ ├── Mykey.class│ │ ...

weixin_42507981的博客 6197

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

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

Y2807593076的博客 746

【解决方案】使用transformer指定显卡后,模型依然加载到默认第1张显卡上

按理说指定了环境变量为后面几张显卡,模型会自动加载到我们指定的显卡上。可是查看gpu使用情况,发现还是加载在了第一张显卡上,这是为啥呢?

m0_56745306的博客 2441

Unity 游戏 牧师与魔鬼

MVC游戏架构 牧师与魔鬼 演示视频。

weixin_52388098的博客 1063

Vivado IP核:AXI Uartlite的使用经验分享

1. IP基本设置 在Vivado中,打开IP Catalog,搜索“uart”: 双击“AXI Uartlite”,进入IP配置界面: 这里可以配置IP的具体参数,设置时钟频率、波特率等,完成后,生成IP即可。 2. IP的时序特点 点击下面的链接可以下载该IP核的官方指导文档: https://china.xilinx.com/support/documentation/ip_docume...

weixin_43265132的博客 1万+

YOLOv8改进,YOLOv8添加可变性卷积DCNv2

DCNv2对原始的DCNv1进行了改进,可变形卷积网络的卓越性能源于其适应对象几何变化的能力。通过对其自适应行为的检查,虽然对其神经特征的空间支持比常规的ConvNets更接近于对象结构,但这种支持可能远远超出感兴趣区域,导致特征受到不相关图像内容的影响。为了解决这个问题,我们提出了一种可变形卷积网的重新表述,通过提高建模能力和更强的训练,提高了其专注于相关图像区域的能力。通过更全面地集成网络中的可变形卷积,并引入扩展变形建模范围的调制机制,增强了建模能力。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 3606

魔鬼与牧师——动作分离版

首先回顾一下牧师与魔鬼的小游戏的要求: 在河的一边有三个牧师和三个恶魔。他们都想去这条河的另一边,但是只有一条船,而且这条船每次只能载两个人。一定有一个人把船从一边开到另一边。在flash游戏中,你可以点击它们来移动它们,点击go按钮来移动河两岸的恶魔,它们被杀死,游戏结束。你可以用很多方式来尝试。让所有的牧师都活着! 玩家动作 执行条件 执行结果 点击牧师/魔鬼 游戏未结束,...

Jundesky的博客 515

家里摄像头录像存 NAS,空间爆满了怎么办?一招实现设定容量自动清理实现循环存储!

📷 家用摄像头录像久了会撑爆 NAS 吗?别担心,这篇文章教如何实现自动清理录像,释放 NAS 空间,避免爆盘🧹

XiaoqiangClub的博客 1882

Unity实战——牧师与魔鬼

Unity实现牧师与魔鬼小游戏

weixin_51930942的博客 987

华为od 面试手撕代码题【完成任务最少小时】

华为od 面试手撕代码题【完成任务最少小时】

MISAYAONE的博客 1580

Error: Flash Download failed - Target DLL has been cancelled

由于换了新电脑,keil重装了下,然而之前的MCU的支持包没有安装,以及一些其他的问题,导致可以编译但是不能将程序烧录到单片机中。现整理一下解决思路: 1、将支持包下载并添加: 找到你需要用的MCU的具体型号: 例如: 点击网址,下载安装包,或者在csdn等其他网址下载安装包,将下载好的pack包放到keil5的安装目录下的.Download中: 点击file中的import,将路径选择到.........

hanhan的博客 5万+

Unity——牧师与魔鬼

游戏对象运动的本质,就是游戏对象跟随每一帧发生变化的过程。在变化的过程中,主要是指游戏对象的transform中的rotation与position两个属性。其中,rotation是指游戏对象所处位置的角度变化,而position则是指游戏对象在坐标系中位置的改变。河岸(Coast)、船(Boat)、河流(River)、魔鬼(Devils)、牧师(Priests)第三种:调用transform中的translate函数来改变position。列出游戏中提及的事物(Objects)第二种:添加重力特性。

qq_56266553的博客 686

ADT MCP Server 把 ABAP 开发带进 Agent 模式

今天讨论 ADT MCP Server,不能只把它看成 Visual Studio Code 里多出来的一个开关。它真正有意思的地方,在于它把 ABAP 后端开发里那些原本需要手工点击、手工创建、手工激活、手工查服务元数据的动作,包装成一组可以被 GitHub Copilot 这类 coding agent 调用的工具。SAP 在 RAP130 练习里把它描述为运行在 ADT for Visual Studio Code 扩展内部的本地 HTTP Server,它实现的是 Model Context Pro

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 184

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

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

计算机控制技术及应用

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

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

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

unity3D_牧师与魔鬼

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

qq_36184359的博客 807

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Unity3d入门之路-牧师与魔鬼

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

sir_beginner的博客 351

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

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

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

毕业作品网站 395

Unity3D项目三:牧师与魔鬼

Unity3D项目三:牧师与魔鬼 基本介绍 列出游戏中提及的事物(Objects) 牧师,恶魔,船,河流,左侧陆地,右侧陆地 用表格列出玩家动作表(规则表),注意,动作越少越好 动作 条件 结果 点击角色(牧师或魔鬼) 游戏未结束,角色在船上 角色上岸 点击角色(牧师或魔鬼) 游戏未结束,角色在岸上,点击的角色与船在同一岸边 角色上船 点击船 游戏未结束,船上有至少...

Tifinity的博客 700

unity3D小游戏-牧师与魔鬼MVC版

帮助三个牧师与三个魔鬼过河。过程中,河的两岸分别要满足:牧师数量不能少于魔鬼的数量。角色分为牧师与魔鬼船上只可乘坐一个或两个角色(对应的,在boatcontroller定义座位数),无人时不可移动。点击岸上、船上的角色,对应角色上船、下船。点击船体,船左右移动。船体或角色移动过程中,不响应其他点击事件。角色上岸(回到左岸或上到右岸),则回到岸上一个空位置上(对应的,landconcroller定义位置等参数)角色在左岸、右岸、船上转移,对应的rolecontroller定义角色位置等参数。

JACK9989的博客 324

用Unity3D实现简单的牧师与魔鬼游戏(动作分离版)

用Unity3D实现简单的牧师与魔鬼游戏(动作分离版) 项目地址 牧师与魔鬼游戏(动作分离版) 完成效果图 上次博客链接 牧师与魔鬼游戏 实现心得 这次作业是在上次作业的基础上完成的,具体做出的改变是添加了一个裁判类和一个行为类,将其它控制类中涉及到判断游戏状态的代码都封装到了裁判类中,并在主控制类添加了一个裁判类的成员变量,在主控制器中使用裁判类的相关方法对游戏状态和游戏对象状态进行判断: /* 裁判控制类 */ public class JudgeController { private int g

StuGeek的博客 1160

用Unity3D实现简单的牧师与魔鬼游戏

用Unity3D实现简单的牧师与魔鬼游戏 项目地址 牧师与魔鬼游戏 完成效果图 实现心得 游戏所使用的是MVC模式开发。 首先确定游戏界面组成部分: 由游戏界面组成部分可以设计模式开发结构的视图部分: 可以看到,游戏界面由五个部分组成:船、岸、角色、河流、功能提示框,所以首先可以创建船视图BoatView、岸视图ShoreView、角色视图RoleView、河流视图RiverView和功能视图FunctionView五个视图类,因为移动也需要在界面中展现,所以还可以创建一个移动视图MoveView,从而

StuGeek的博客 1597

unity3D游戏——魔鬼与牧师(Devil and Priest)动作分离版本的实现

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

Y2807593076的博客 469

Unity3d HW4-动作分离版牧师与魔鬼

一、简答并用程序验证 1.游戏对象运动的本质是什么? 答:游戏对象运动的本质是对象在空间中每一帧不同位置的链接。我们在unity中对物体运动的描述其实就是让物体在一个个离散的时间点在空间中的位置不同,例如: this.transform.position += Vector3.left * Time.deltaTime; 2.请用三种方法以上方法,实现物体的抛物线运动。(如,修改Transfo...

wzycxy的博客 328

Unity3D-魔鬼与牧师游戏(动作分离版)开发

动作管理器就是一个对象,管理整个场景中所有的动作。一个SceneController(场景管理器)只配备一个动作管理器对象。不管是游戏角色的移动还是船的移动,都归这个对象管;动作管理器可以添加动作(添加的时候要指定动作所作用的GameObject),监测已经完成的动作并清除。

weixin_63734223的博客 221
上一篇: Unity3d空间与运动
下一篇: Unity3d牧师与魔鬼动作分离版
hellowangld
博客等级 码龄10年 15粉丝 46原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hellowangld

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值