来说说SubClass沙盒模式

本文介绍了一种称为“子类沙盒模式”的设计方法,该方法通过将技能的不同表现形式(如移动、播放特效等)封装在基类中,并通过子类重新组合这些行为来实现灵活的技能系统设计。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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个技能,技能一: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,来说说他的缺点

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值