【Unity3D与23种设计模式】桥接模式(Bridge)

摘要:
GoF定义:“分离抽象和实现,以便它们可以独立更改”在游戏中,经常会出现基类角色类(ICharacter)的情况。下面有下级士兵(ISoldier)和敌人(IEnemy)的基础级武器(IWeapon)。下面有子类枪(IGun)和枪(ICannon)。当然,持枪士兵和持枪士兵是后期游戏的2*2=4种类型的组合,当角色类添加到角色类时,它变成2*3=6类。如果添加其他武器类别,3*3


GoF定义:

“将抽象与实现分离,使二者可以独立的变化”


游戏中,经常有这么一种情况

基类角色类(ICharacter),下面有子类士兵类(ISoldier)、敌军类(IEnemy)

基类武器类(IWeapon),下面有子类枪类(IGun)、炮类(ICannon)


当然,有用枪的士兵,有用炮的士兵

IMG_3106(20170719-143220)

这么一组合,就是2*2 = 4个类

游戏后期,当角色类添加一个角色类时,变成了2*3 = 6个类

若再添加一个武器类,3*3 = 9个类

类成倍数增长

维护起来也就越来越困难


这种两个类群组之间,“交叉组合汇编”的情况

桥接模式是一种解决方法


群组一类中的每一个类,可以使用“群组二类”中的每一个类来实现所定义的功能

IMG_3105(20170719-142928)


using UnityEngine;

public abstract class IWeapon{
     public abstract void DamageValue(ICharacter character);
 }

public class IGun : IWeapon {
     public override void DamageValue(ICharacter character)
     {
         Debug.Log("Gun");
     }
 }

public class ICannon : IWeapon {
     public override void DamageValue(ICharacter character)
     {
         Debug.Log("Cannon");
     }
 }

public abstract class ICharacter {
     protected IWeapon m_Weapon = null;

    public void SetWeapon(IWeapon theWeapon) {
         m_Weapon = theWeapon;
     }

    public abstract void InstantiateCharacter();
 }

public class ISoldier : ICharacter {
     public override void InstantiateCharacter()
     {
         m_Weapon.DamageValue(this);
     }
 }

public class IEnemy : ICharacter {
     public override void InstantiateCharacter()
     {
         m_Weapon.DamageValue(this);
     }
 }


上面代码只为演示桥接模式设计思想使用

若想使用到自己的工程中

还需结合自己工程写出代码

免责声明:文章转载自《【Unity3D与23种设计模式】桥接模式(Bridge)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇椭圆曲线密码学在OpenSSL中的实现Parallel.ForEach 之 MaxDegreeOfParallelism下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Mac下发布Unity3d中Android平台下出现“android (invokation failed)”的错误

 昨天想要给Murphy同学编译一个Andorid版本的工程,但我本机没有Android SDK,于是安装了Murphy发给我的安装包,并升级设置,结果在发布的最后出现了如下错误: Error building Player: Exception: android (invokation failed)ERROR: unknown errorcmd:an...

[zz]使用unity制作雨滴涟漪效果

之前看了以前版本的unity3d demo AngryBots ,觉得里面的下雨效果不错,刚好前段时间学习了,写出来跟大家分享下,直接开始。 使用自带动画系统制作下雨效果。 先制作下雨的雨滴涟漪 步骤1: 在 project中新建文件夹,命名为rainFX。将图片素材RainStreak及Ripple导入到rainFX文件夹中,创建一个plane,改名...

【Unity】伪线框渲染Shader的实现

线框Shader的渲染在游戏应用上还是有一定的需求,这次分享一个伪的线框渲染Shader。之所以称之为伪线框,是因为真正的线框应该渲染的是线,这在常规上是使用几何体着色器输出线段图元来实现。但是几何体着色器是DirectX 10的特性,所以针对移动平台,如果有少量线框渲染需求的,这个实现方法的门槛更低。 先说一下实现的原理:通过模型UV的边界来实现线框的渲...

unity3d 导出 Excel

我在unity里需要导出成Excel格式,试了一些方法,其中用c#的com组件的我还没成功不知道该怎么在unity里调用,(如果哪位大哥用别的方法在unity里成功了,可以交流下,最好给我一个小demo(849288321@qq.com),谢谢啦.),不过后来找到了这个org.in2bits.MyXls  ,需要导入这个dll(网上有很多),然后用着还挺好...

unity3D 对话系统的制作

准备两个C#代码+1个txt文本 多数报错都是代码的公开变量没有获取到,导致空引用! 1:对话框内容文本文件.txt 自行准备文本信息(如果显示的是乱码,请更改编码格式为UTF-8) A 你好啊,勇士! B 你好,老爷爷. A 欢迎来到帕利镇,我是这的村长,萨罗特. B 喔,原来是村长啊,您好! 2:NPC代码,挂在到要对话的物体对象身上 1 using...

不同版本的Unity要求的NDK版本和两者对应关系表(Unity NDK Version Match)

IL2CPP需要NDK Unity使用IL2CPP模式出安卓包时,需要用到NDK,如果没有安装则无法导出Android Studio工程或直接生成APK,本篇记录一下我下载NDK不同版本的填坑过程。 IL2CPP需要NDK 不能使用最新的NDK版本 NDK的大版本和小版本号都要一致 每个Unity版本要求的ndk版本对照表 Unity versi...