首页 > 代码库 > 【Unity3D】魔鬼与牧师游戏记录——MVC架构

【Unity3D】魔鬼与牧师游戏记录——MVC架构

 

Priests and Devils是一款益智类的小游戏,需要在规定的时间内帮助牧师和魔鬼都安全过河。河边有三个魔鬼和三个牧师,他们都想过河,但河上只有一条船,这艘船每次只能搭载两个,而且必须有一个人驾驶船行驶。如果河一边的魔鬼数量多于牧师,牧师将被魔鬼击杀,游戏结束。游戏链接:http://www.flash-game.net/game/2535/priests-and-devils.html

 

游戏成品图

技术分享

设置60s倒计时——60s后如果未能安全运送所有魔鬼与牧师,游戏失败。

 技术分享

尝试改进界面,对一些东西还不太熟悉。

技术分享


 

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

Object:三个魔鬼(用白cube表示)、三个牧师(用黑sphere表示)、一艘船、两个岸

2游戏架构:

技术分享

 



ISceneController.cs和IUserAction.cs是接口类, ISceneController.cs定义场景控制方法,而FirstController.cs是控制一个场景的具体场景实现,实现的函数定义在ISceneController.cs之中,而场景管理器不知道具体实现方法,具体实现由导演(SSDirector)决定。只有场景设置可见,保证了内部核心代码的安全性。IUserAction.cs定义用户交互方法,UserGUI.cs实现对应方法。MVC,达到模式,视图,控制分离。

例如:
1.接收到用户点击事件(UserGUI.cs)
技术分享

 


2.调用用户接口函数(函数在IUserAction.cs中)

技术分享

 

3.转到函数实现——转到场景控制器FirstController.cs
技术分享

4.请求具体方法实现——转到导演SSDirector.cs——控制

技术分享

 



2.3在 GenGameObjects 中创建 长方形、正方形、球 及其色彩代表游戏中的对象。
游戏中用白正方形表示魔鬼,黑球代表牧师,长方体代表船以及两岸。

2.4用表格列出玩家动作表(规则表),注意,动作越少越好
技术分享

 

与规则表对应的动作函数表:

技术分享

 



行为大致可以分为三种,上船、开船和下船。开船有限制条件,必须要有一个牧师或一个魔鬼船方可开动。

1.上船
分为两种对象——牧师和魔鬼。上船这个动作可以把牧师或者魔鬼作为船的子对象,在船中还有空位的时候就可以加进设置子对象的代码。为区分是魔鬼或者牧师,在预设的时候添加对应的Tag。牧师为Priest,魔鬼为Devil

void AboardTheBoat(GameObject obj) {
            if (_instance.BCapacity() != 0) {
                obj.transform.parent = _instance.boat_obj.transform;
                if (_instance.boat[0] == null) {
                    _instance.boat[0] = obj;
                    obj.transform.localPosition = new Vector3(0, 1.2f, -0.3f);
                } else {
                    _instance.boat[1] = obj;
                    obj.transform.localPosition = new Vector3(0, 1.2f, 0.3f);
                }
            }
        }

 


2.开船
船上必须有一个牧师或者一个魔鬼,将船从一岸到另一个岸边。
技术分享

 


3.下船
不分对象,但分从船左船右下船,解除子对象绑定,再移动对应对象的位置。

public void getOffTheBoat(int side) {
            if (_instance.boat[side] != null) {
                _instance.boat[side].transform.parent = null;
                if (_instance.state == State.BEND) {
                    if (_instance.boat[side].tag == "Priest") {
                        _instance.priestsEnd.Push(boat[side]);
                    }
                    else if (_instance.boat[side].tag == "Devil") {
                        _instance.devilsEnd.Push(boat[side]);
                    }
                }
                else if (_instance.state == State.BSTART) {
                    if (_instance.boat[side].tag == "Priest") {
                        _instance.priestsStart.Push(boat[side]);
                    }
                    else if (_instance.boat[side].tag == "Devil") {
                        _instance.devilsStart.Push(boat[side]);
                    }
                }
                _instance.boat[side] = null;
            }
        }

 

关于代码,将FirstContorller.cs挂载到空对象,将UserGUI.cs挂载到主摄像机即可运行
2.5修改代码,使用 C# 集合类型 有效组织对象,通过 xxSceneController 对象 GenGameObjects 互动完成游戏逻辑。(这一点要求不同,现在改用课件框架。)如需要游戏对象代码,可以动态绑定。

2.6注意事项:
1.整个游戏仅主摄像机和一个 Empty对象,其他对象必须代码动态生成!!!。

使用预制动态生成对象。(未包含界面改进后的对象)

技术分享

 

2.整个游戏不许出现 Find 游戏对象, SendMessage 这类突破程序结构的 通讯耦合 语句。 违背本条准则,不给分
3.注意细节,例如:船未靠岸,牧师与魔鬼上下船运动中,均不能接受用户事件!

 

大致代码逻辑参考师兄博客。

 

【Unity3D】魔鬼与牧师游戏记录——MVC架构