【unity】组合模式
作者:互联网
引子
为什么要用组合模式?
魂系列游戏一直有武器质变这一系统;很多游戏里有镶嵌宝石这一设定......
使用组合模式可以很好地实现类似功能。
什么是组合模式
将不同的类组合起来(一般分为高层类与低层类),使较高层的类能够像使用独立类一样,使用组合进来的类。
实现
模仿魂系列的武器质变系统,举个例子
定义敌人类 Enemy
using UnityEngine;
public class Enemy : MonoBehaviour
{
//具体实现略...
}
定义武器的抽象基类 Weapon
public abstract class Weapon : MonoBehaviour
{
private Change change;
public void SetChange(Change c)
{
change = c;
Debug.Log("Weapon " + c.GetType().Name + " change done.");
}
public abstract void Attack(Enemy enemy);
}
定义武器质变的抽象基类 Change ,使其作为 Weapon 的成员
public abstract class Change
{
public abstract void ExtraAttack(Enemy enemy);
}
定义 LothricKnightGreatsword ,使其继承 Weapon
using UnityEngine;
public class LothricKnightGreatsword : Weapon
{
public override void Attack(Enemy enemy)
{
Debug.Log("Lothric Knight Greatsword attack the enemy " + enemy.gameObject.name);
change?.ExtraAttack(enemy);
}
}
定义火焰质变 FireChange
using UnityEngine;
public class FireChange : Change
{
public override void ExtraAttack(Enemy enemy)
{
Debug.Log("Cause fire damage to enemy " + enemy.gameObject.name + ".");
}
}
定义雷电质变 ThunderChange
using UnityEngine;
public class ThunderChange : Change
{
public override void ExtraAttack(Enemy enemy)
{
Debug.Log("Cause thunder damage to enemy " + enemy.gameObject.name + ".");
}
}
编写主类 BattleMain
using UnityEngine;
public class BattleMain : MonoBehaviour
{
public Weapon sword;
public Enemy enemy;
private void Update() {
if(Input.GetKeyDown(KeyCode.F))
sword.SetChange(new FireChange());
if(Input.GetKeyDown(KeyCode.T))
sword.SetChange(new ThunderChange());
if(Input.GetKeyDown(KeyCode.A))
sword.Attack(enemy);
}
}
依次按下AFATA,运行结果如下
优缺点
优点:
- 在我看来,组合模式将问题分解,是解决复杂问题的一种有效手段,它通过组合不同的类来实现某些复杂需求。
缺点:
- 违反了依赖倒置原则,增加了组合对象之间的的耦合度。
小结
在开发中,对于一些复杂的需求,尤其是为游戏对象附加新功能新模块时,组合模式比较适用。
标签:enemy,组合,Enemy,void,模式,class,unity,Weapon,public 来源: https://www.cnblogs.com/OtusScops/p/16119233.html