基本介绍
- 玩家动作表(游戏规则表):
动作 | 条件 | 结果 |
在船上点击角色 | 游戏未结束 | 角色上到最近的岸上 |
在岸上点击角色 | 游戏未结束,角色与船在同一个岸边 | 角色上船 |
点击船 | 游戏未结束,船上至少有一个角色 | 船从一个岸边移动到另一个岸边 |
点击restart | 无 | 游戏初始化 |
- 游戏的预制体有(有些是从官网下载的模型):
- 使用MVC结构程序
- 除了主摄像机和一个Empty对象,其它对象必须通过代码动态生成
项目资源
- 视频
Priests-and-devils演示_哔哩哔哩bilibili
项目演示
完成过程
- UML图辅助表达对象设计
- 代码实现
BaseCode:包含导演类以及牧师、魔鬼、船等游戏对象的Controller和通信
ClickGUI:鼠标点击事件的对象判断与动作结果,并显示游戏信息
FirstController:游戏对象在Unity3D当中的初始化、移动事件的设置、游戏restart
UserGUI:游戏状态的判断事件
- 具体实现
(SSD)irector:使用单例模式创建,继承于System.Object
,不受Unity内存管理,负责控制当前场景的运行、切换、游戏对象通信、游戏的暂停恢复和退出等等。
// BaseCode
public class Director : System.Object {
private static Director _instance;
public SceneController currentSceneController { get; set; }
public static Director getInstance() {
if (_instance == null) {
_instance = new Director ();
}
return _instance;
}
}
SceneControllor:场景控制器的接口,导演使用这个接口与场景控制器沟通和加载资源。
// BaseCode
public interface SceneController {
void loadResources ();
}
IUserAction:用户操作的接口,对应上文的动作表(规则表),是View与Controllor之间的桥梁。
// BaseCode
public interface UserAction {
void moveBoat(); // 移动船
void characterIsClicked(MyCharacterController characterCtrl); // 移动角色,在鼠标click后调用
void restart(); // 游戏初始化
}
Moveable(BaseCode.cs中):控制移动,通过标志(1和2)来区分源地点和目的地并控制移动方向。使用Update来实现对象的运动。在使用控制器创建对象时会将该脚本挂载到需要运动的对象上。
MyCharacterController(BaseCode.cs中):角色控制器,有用于区分牧师或恶魔的标志,使用了Moveable用于定位和移动。
CoastController(BaseCode.cs中):陆地控制器,首先陆地有两块,所以需要标志是开始岸还是目的岸;而且陆地可以看作一个‘容器’,上面装了牧师和魔鬼(或许还可以装船),所以它有一系列空位置,用来放置角色。
BoatController(BaseCode.cs中):船控制器,有区分两岸的标志,和陆地相似,但是多了一个移动的动作。
ClickGUI(ClickGUI.cs中):响应鼠标点击事件。
UserGUI(UserGUI.cs中):建立restart按钮和识别游戏当前状态并进行游戏初始化。
FirstControllor:场景控制器,是该场景中所有游戏对象“动起来”的核心,使用底层控制器控制各个对象,实现上文中的所有接口供GUI和导演使用。
void Awake() //游戏初始化
public void loadResources() //场景加载
private void loadCharacter() //场景加载中角色的加载
public void moveBoat() //船的移动事件
public void characterIsClicked(MyCharacterController characterCtrl) //角色点击事件
check_game_over() //游戏状态检测
public void restart() //游戏初始化按钮