需求
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 of this river, but there is only one boat and this boat can only carry two persons each time. And there must be one person steering the boat from one side to the other side. In the flash game, you can click on them to move them and click the go button to move the boat to the other direction. If the priests are out numbered by the devils on either side of the river, they get killed and the game is over. You can try it in many > ways. Keep all priests alive! Good luck!
类的设计
具体代码请参考下面仓库地址。
ECS架构
为什么要做的这么复杂呢,试想,如果不采用这种模式,思考如何解决以下问题:
- 点击牧师后,船怎么知道是谁要上船?
- 怎么判断牧师在船上还是在岸上
- 怎么判断点击的牧师在左岸还是右岸?
- …
说白了ECS架构就是解决这种游戏对象实例过多而造成对象之间通信复杂化,耦合变高,维护困难。对象承受了过多不该承受的职责。我们的目标就是把这些职责分离开:Entity(实体),Component(组件),System(系统)。其核心思想就是组合优于继承
其实Unity本身就是遵循这种架构的,已经帮我们把整体的框架都搭好了,比如每次创建新对象的时候都默认给你创建了Tranfrom,render等组件。
Entity对应的就是实际的GameObject,就是实实在在被放置在场景中的物体,船,牧师,魔鬼,岸 。
Component就是运动组件Move和鼠标事件处理组件ClickGUI等,保证相关的任务只交给对应的组件去处理,上层系统只需要知道处理的结果是什么,不需要关注过程和其中涉及到的数据,这样就保证了高内聚性。
System对应各种各样的牧师控制器,魔鬼控制器,船控制器,他们拥有关于某个实体的数据,通过组件来实现各种各样的功能(运动,鼠标监听),控制实体的生命流程。
相关链接
- 仓库地址: https://gitee.com/liht29/unity3d/tree/master/hw2_PastorAndDemon
- 项目演示:https://www.bilibili.com/video/BV1JQ4y1B7YA/
Unity编程
多文件编程时如何编写类?
在牧师魔鬼游戏中,需要设计较多的类,全部混在一起会相当混乱,我们可以通过命名空间将不同的类联系起来。
运行时报错
the object you want to instantiate is null. 查阅资料是目录结构的问题,Resources.Load默认是在Assets下的Resouces目录下查找相关文件的,所以将Prefab文件移动到此即可使用Prefabs/boat来读取模型
|