Unity 自主学习之用设计模式模拟王者荣耀 (一)-- 状态模式实现张飞开大

前言:笔者最近由于学习了一些开发模式,觉得里面有很多模式非常有趣,而正好本人又喜欢玩儿王者荣耀,所以就想着复制一下,看能不能做出来,笔者并不是大牛,这个只是个人对于设计模式的应用学习,只是目标是为了实现王者荣耀功能的实现,而且开发顺序是笔者对 设计模式的学习顺序,所以后面可能会出现 大篇幅修改的情况,如果是真心想复刻王者荣耀的就可以不看了,另希望各位大牛给出一些框架的修改意见

简介:

状态模式介绍:网上有很多完善的说明,这里就简单提一下我自己的理解,“状态模式”顾名思义就是将一个对象的一个或多个属性按不同状态划分出来,通过设置对象本身的参数来修改对象 当前的状态。

就比如说王者荣耀里面有两种形态的张飞呀,凯之类的,他们开大招和不开大招是不一样的,这就是说它有两种状态(开大状态和普通状态),这两种状态通过按钮事件和时间来互相切换,所以,对于这种对象的脚本开发, 选择状态模式可以说是理所当然的了。

状态模式理解起来并不难,但是代码实现可能会没有头绪,所以我们还是直接来看用代码怎么实现吧。

 

效果: 

 首先给个效果:

张飞一开始处于普通状态,当我点击了按钮之后,他就会进入开大状态,模型就会随之改变(王者荣耀里面的有过度的那种感觉我估计是普通状态结束的时候他播放了一段动画,当动画结束后它就会像我上面这样切换模型,这里我没有些资源,只有这样将就一下了)

 

代码:

 首先状态模式中,每一种状态都是一个类,所以为了保证这些类都能用一个变量来保存,而且为了方便后续规范开发,所以我们需要一个同一父类来规定我们角色的状态。

状态模式中,所有状态都是通过一个类来管理的,这个类就是上图所示的"CharactorStateManager"(下面简称CSM),因为每个状态除了通过外界调用CSM里面的设置状态的方法,状态内部之间还可以在一定条件下切换(比如开大后一定时间内切换回原状态),所以每一个类里面都要在创建的时候设置CSM

父类里面有一个DestroyAllChild,这个是后面用来删除人物模型的,与模式无关。

之后有三个关于state状态的函数。他们是来标识状态在进入、更新、结束时分别应该处理的操作,由于我们的状态模式代码并没有基础自MonoBehaviour,所以我们把要在update里面更新的代码写在StateUpdate里面,然后再在 外界调用即可。

应为还要考虑到 每个状态都会对应一个模型, 所以父类里面定义了加载的路径(这里以Resource方式加载,热更新暂时不考虑)

父类写完了,后面创建状态就简单多了,只要继承自这个父类即可:

普通状态:

开大状态:

应为每一个状态都是要自己去重写的,所以一些操作就放在了这些状态类的子类里面了,代码很简单,应该不难理解。PlayerParrent是一个空物体,这个空无体主要是用来放置模型的。后面再解释。

然后就是CSM的代码:

很简单,就一个设置,和一个Update更新,注意这里也是没有继承自MonoBehaviour的,这个只是一个管理的工具,所以我们想要在其它地方用到这个CSM,就只需要新建一个对象就行了。

使用这个CSM的代码:

当按钮点击的时候,去通过CSM更改状态,在CSM刚刚创建的时候就需要去设置一个状态。

Hierarchy面板结构,Player就是PlayerParrent所表示的物体,之所以这么设置,是因为如果每一个模型都是直接创建出来的,那我以后绑定操作哪些岂不是又得去重新做一遍?我只是需要它展示的人物模型不同,而不需要修改其他操作,所以创建一个Player空物体, 即方便管理,也 方便我以后扩展,Button就绑定上面那段 代码里面的OnButtonClick函数就行,这段代码放在 哪个物体上都行。

 优点:

我将每一个英雄都划分为一个状态,好处就是如果我想新添加一个英雄或是新添加一个英雄的状态,我只需要继承自状态父类,然后重写里面的方法就行了,后面我只需要在CharatorSystem里面去设置这个状态,那么我选定的英雄就会是我新添加的英雄了。

这个还只是一个基础类,实现了模型的变换,后面关于英雄的共同属性及技能我肯定都会写在这里面,而怎么绑定按钮操作,这我就打算用另外一种模式,外观者模式来处理,这里就不 多做介绍了。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值