游戏开发论坛

 找回密码
 立即注册
搜索
查看: 16895|回复: 10

如何在Unity中实现MVC模式?

[复制链接]

1万

主题

1万

帖子

3万

积分

论坛元老

Rank: 8Rank: 8

积分
36572
发表于 2015-7-20 13:51:19 | 显示全部楼层 |阅读模式
本帖最后由 小篱 于 2015-7-20 13:53 编辑

3614327_094200033911_2副本.jpg

  GameRes游资网授权发布 文 / 伍一峰

  在Unity游戏的开发当中,我并没有刻意地采用MVC框架,因为不像网站开发那样,Model,View,Controller在游戏这个领域里还没有很清晰的定义。

  究其原因,可能是由于不同游戏类型本身的软件架构可以相差很远,而且游戏里面的Object之间有大量的交互,所以垂直的MVC似乎不是十分应景。

  然而,某种程度的分离代码逻辑是必要的,可以提高代码的可维护性和重用性。

  下面我说说自己的一些经验。

  假设我们在做一个马里奥:

  对于游戏里的角色,我会采用这样一个结构。

  Character Manager,它的作用是包含这个角色的Controller(s),并提供一个黑板(Blackboard)[1]。

  Controller,利用Reusable Models来处理角色在这个游戏中的某一状态的逻辑。

  Reusable Model,是一个虚的概念,并不是一个父类,通常这类Model都负责某一个特定的功能,可以重复利用,可看做游戏引擎的延伸。

  我会将Character Manager和Reusable Model继承MonoBehavior,这样我们就能够直观地知道这个角色是什么类型的Character,并且可以利用inspector调节Model的参数。

1.jpg

  怎么将上面的架构应用在马里奥身上呢:

  作为Character Manager,我们可以采用Finite State Machine或者Behavior Tree。一个好处是它们都天然地提供了“Controller”。

  例如Finite State Machine,它的每一个State都可以看作一个Controller。

  而Behavior Tree里面的Action Node,也可以看作是一个Controller。

  在每一个Controller里面,都会有指针指向一些Reusable Model。

  例如下图Move State可以有一个Move Motor,专门来实现GameObject的移动,而Sprite则封装GameObject的表现,如动画、旋转、位置等等。

  这些Reusable Model通常都提供丰富的参数可供调整,可以用于不同游戏当中。

  用户输入和游戏里面的消息,则会暂存在Character Manager里面的Blackboard里,供Character Manager使用,让它决定是否需要更换Controller。

  例如马里奥里面我按左键,往左行动的信息会写在FSM的Blackboard里面,然后通过FSM的State转换机制 [2],从Idle State转换到Move State。

  这样的好处是,往左的信息可以从Input Manager (图中没给出)那里得来,也可以从Enemy AI Manager(图中没给出)那里得来。

  这样,一个类型(如拥有Idle,Move,Jump等状态)的FSM,就可以用在所有类似的角色身上,无论是玩家控制的还是AI控制的。

2.jpg

  最终在Unity里面会是这样一个情况,FSM,Sprite,MoveMotor都作为Component,而Controllers则包含在FSM里面。

3.jpg

  以上方案虽然并不严格,但是在一定程度上提高了代码的可复用性和可维护性。

  例如现在我基本都把MoveMotor,Sprite等Model写好,新项目就直接扔进来就能用;

  MoveState,IdleState,JumpState等一些在平台游戏里常用的状态封装好,留出一些可调参数,例如状态间的转换。

  [1] Blackboard的本质是一个Dictionary。

  [2] 比较原始的FSM会将State转换直接放在State里面,但这样大大降低了State的可复用性。因此可以尝试将State的转换作为一个可调参数。一些可视化的FSM的原理也是这样,利用连线将两个State链接起来,然后通过定义一些转换的条件。

17

主题

1629

帖子

5982

积分

论坛元老

Rank: 8Rank: 8

积分
5982
QQ
发表于 2015-7-20 19:48:43 | 显示全部楼层
MVC 完全是扯淡的玩意

17

主题

1629

帖子

5982

积分

论坛元老

Rank: 8Rank: 8

积分
5982
QQ
发表于 2015-7-20 19:49:51 | 显示全部楼层
另一个比较扯淡的玩意是 状态机, 这些扯淡的概念跟本就不应该出现在软件里

0

主题

5

帖子

102

积分

注册会员

Rank: 2

积分
102
发表于 2015-7-21 09:37:17 | 显示全部楼层
__BlueGuy__ 发表于 2015-7-20 19:48
MVC 完全是扯淡的玩意

只能说你眼光和认识太浅

17

主题

1629

帖子

5982

积分

论坛元老

Rank: 8Rank: 8

积分
5982
QQ
发表于 2015-7-21 10:37:29 | 显示全部楼层
chengmingxing12 发表于 2015-7-21 09:37
只能说你眼光和认识太浅

你是什么东西,有什么资格评价别人?

0

主题

769

帖子

1052

积分

金牌会员

Rank: 6Rank: 6

积分
1052
发表于 2015-8-8 10:31:46 | 显示全部楼层
然后这么做得好处是啥鸟?
仅为了MVC而MVC?
我不觉得如此设计有什么亮点,纯粹地把简单问题复杂化,明明几行代码可以搞定的事情非要搞得那么拖沓
直接点 马里奥一个动画播放器 该啥时候执行啥动画的时候去播放对应动画,改位移到什么地方直接挪动gameobject。逻辑代码各管各的就好,非要扯啥状态机,晕菜

11

主题

1238

帖子

1782

积分

金牌会员

Rank: 6Rank: 6

积分
1782
发表于 2015-8-8 16:58:13 | 显示全部楼层
无名剑 发表于 2015-8-8 10:31
然后这么做得好处是啥鸟?
仅为了MVC而MVC?
我不觉得如此设计有什么亮点,纯粹地把简单问题复杂化,明明 ...

不要鸡冻,老兄

1

主题

7

帖子

56

积分

注册会员

Rank: 2

积分
56
发表于 2015-8-19 11:40:08 | 显示全部楼层
无名剑 发表于 2015-8-8 10:31
然后这么做得好处是啥鸟?
仅为了MVC而MVC?
我不觉得如此设计有什么亮点,纯粹地把简单问题复杂化,明明 ...

他不是说复用吗?直接复用在各种项目中。你写的马里奥能通用?

7

主题

42

帖子

92

积分

注册会员

Rank: 2

积分
92
发表于 2015-8-20 18:04:38 | 显示全部楼层
MVC架构能有效果提高项目的可维护性和复用性

0

主题

2

帖子

12

积分

新手上路

Rank: 1

积分
12
发表于 2015-8-28 10:34:30 | 显示全部楼层
__BlueGuy__ 发表于 2015-7-21 10:37
你是什么东西,有什么资格评价别人?

那你又有什么资格评论别人说的话
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-2-25 17:02

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表