其他分享
首页 > 其他分享> > 【unity】组合模式

【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,运行结果如下
image

优缺点

优点:

  1. 在我看来,组合模式将问题分解,是解决复杂问题的一种有效手段,它通过组合不同的类来实现某些复杂需求。

缺点:

  1. 违反了依赖倒置原则,增加了组合对象之间的的耦合度。

小结

在开发中,对于一些复杂的需求,尤其是为游戏对象附加新功能新模块时,组合模式比较适用。

标签:enemy,组合,Enemy,void,模式,class,unity,Weapon,public
来源: https://www.cnblogs.com/OtusScops/p/16119233.html