1,子类沙盒模式的意义。
此模式其实是一种非常小巧的模式,其实也是一种小技巧,我们来说说游戏中的技能系统的设计吧,它大致分为主动技能,被动技能,增益技能,减益技能,一个技能又可能有多种表现形式,有种不同的等级,那我们怎么办呢?凭借我这么多的经验来说其实在简单不过了,等级不同怎么办,设置成配表,不同技能怎么办,大多数没什么经验的人都会设计成继承关系,然后子类来改写基类的实现方法,从而实现不同的技能,这是最低级的做法,这样做到最后你会发现基类越来越大,子类也越来越复杂,到最后摸不着头老,怎么办,堵不如疏,我们慢慢来分析技能的表现形式,他无非能够让主角状态发生改变,产生位移段,播放粒子特效,播放一个音效,然后产生不同的buffer,不同的伤害,等等。。。哪我们怎么办呢,我们的子类沙河模式正好派上了用场,何为子类沙河模式,就是把先这些技能的位移啊,播放动作啊,播放粒子特效啊,播放技能音效啊都在子类中实现了,然后提供protected的方法给子类,然后子类在根据配表来进行组装,只需要重新实现基类的action方法即可。
2,我门来看看一个简单的实现。
我们来随便实现一个基类,包括一个配表信息
using System;
using UnityEngine;
using System.Collections.Generic;
//==========================子类黑盒模式================================
//==========================================================
//==========================================================
/// <summary>
/// 技能的配置表,列举一个大概的例子
/// </summary>
public class SkillDesign
{
public int skill_id; //技能的ID
public IList<string> move_distance; //自身移动的位移
public IList<string> move_times; //自身移动的位移
public string voice_id; //音效的ID
public string skill_animalID; //技能动画的ID
public string entity_animalID; //技能动画的ID
public 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个技能,技能一:AssassinationSkillusing 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,来说说他的缺点
个人认为他提供了大部分技能的元方法,所以会导致基类特别的大,这个就看我们自己愿不愿意在这方法下功夫了,愿不愿意在把基类按照不同的性质在拆分成多个类了。。。。一切尽在你的掌握中。