来说说SubClass沙盒模式

来源:互联网 发布:json编辑 编辑:程序博客网 时间:2024/06/01 16:31

1,子类沙盒模式的意义。

此模式其实是一种非常小巧的模式,其实也是一种小技巧,我们来说说游戏中的技能系统的设计吧,它大致分为主动技能,被动技能,增益技能,减益技能,一个技能又可能有多种表现形式,有种不同的等级,那我们怎么办呢?凭借我这么多的经验来说其实在简单不过了,等级不同怎么办,设置成配表,不同技能怎么办,大多数没什么经验的人都会设计成继承关系,然后子类来改写基类的实现方法,从而实现不同的技能,这是最低级的做法,这样做到最后你会发现基类越来越大,子类也越来越复杂,到最后摸不着头老,怎么办,堵不如疏,我们慢慢来分析技能的表现形式,他无非能够让主角状态发生改变,产生位移段,播放粒子特效,播放一个音效,然后产生不同的buffer,不同的伤害,等等。。。哪我们怎么办呢,我们的子类沙河模式正好派上了用场,何为子类沙河模式,就是把先这些技能的位移啊,播放动作啊,播放粒子特效啊,播放技能音效啊都在子类中实现了,然后提供protected的方法给子类,然后子类在根据配表来进行组装,只需要重新实现基类的action方法即可。

2,我门来看看一个简单的实现。

   我们来随便实现一个基类,包括一个配表信息

using System;using UnityEngine;using System.Collections.Generic;//==========================子类黑盒模式================================//==========================================================//==========================================================/// <summary>/// 技能的配置表,列举一个大概的例子/// </summary>public class SkillDesign{public int skill_id; //技能的IDpublic IList<string> move_distance;//自身移动的位移public IList<string> move_times;//自身移动的位移 public string voice_id;//音效的IDpublic string skill_animalID;//技能动画的IDpublic string entity_animalID;//技能动画的IDpublic int  heart_num;//伤害的技能//..................等等,你需要的配置参数}/// <summary>///  子类沙河模式,封装一个技能的基础类/// </summary>public class SkillBase{private SkillDesign skill_design;private GameObject entity_objects;public SkillBase(SkillDesign  skillDesign,GameObject gameObjects){skill_design = skillDesign;gameObjects = entity_objects;}protected void move(){IList<string> skillMove = skill_design.move_distance;//拿取配表中的技能移动的配置集合来进行操作移动主角IList<string> moveTimes = skill_design.move_times;//拿取配表中的技能移动的配置集合来进行操作移动主角//来实现具体的移动操作Debug.Log ("开始移动啦。。。。。。。。。。。。。。。");}protected void playVoice(){string voiceId = skill_design.voice_id;  // 拿取技能音效配置来进行播放音效//来实现具体的方法Debug.Log ("开始播放音效啦。。。。。。。。。。。。。。。");}protected void playAnimal(){string entityAnimalId = skill_design.entity_animalID; //还是拿取自己动画的id来播放动画Debug.Log ("开始播放特效啦。。。。。。。。。。。。。。。");}/// <summary>/// 让子类来继承此方法,来进行组合上述的元方法。。。。。/// </summary>public virtual void action(){}}
很简单吧!我们来随便实现2个技能,技能一:AssassinationSkill
using System;using UnityEngine;public class AssassinationSkill:SkillBase{public AssassinationSkill(SkillDesign  skillDesign,GameObject gameObjects):base(skillDesign,gameObjects){}//我们来组装技能  例如一个暗杀技能/// <summary>/// 基本上就是个模式,基本上可以根据配置表来实现各种的技能,在必要的时候在skillbase 里面增加新的方法/// </summary>public override void action(){//移动起来this.move ();//技能特效播放起来this.playAnimal();//音效搞起来this.playVoice();}}
技能2:
using System;using UnityEngine;public class BeheadedSkill:SkillBase{public BeheadedSkill(SkillDesign  skillDesign,GameObject gameObjects):base(skillDesign,gameObjects){}//我们来组装技能  斩杀技能/// <summary>/// 基本上就是个模式,基本上可以根据配置表来实现各种的技能,在必要的时候在skillbase 里面增加新的方法/// </summary>public override void action(){//技能特效播放起来this.playAnimal();//音效搞起来this.playVoice();}}
就这样子类沙河模式就这样实现了,子类action方法就可根据需求来组合基类的元方法来表示不同的技能需求, 然后我们就可以通过工厂模式来创建自己需要的各种技能了,

3,说说他的优点

  1.减少了子类和游戏引擎,游戏系统大大的耦合
  2.减少了子类会有大部分重复代码的问题。
  3.他比较适合派生类特别多的系统

4,来说说他的缺点

  个人认为他提供了大部分技能的元方法,所以会导致基类特别的大,这个就看我们自己愿不愿意在这方法下功夫了,愿不愿意在把基类按照不同的性质在拆分成多个类了。。。。一切尽在你的掌握中。


原创粉丝点击