Unity 桥接模式(实例详解)

这篇具有很好参考价值的文章主要介绍了Unity 桥接模式(实例详解)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


在Unity游戏开发中,桥接模式(Bridge Pattern)是一种设计模式,它用于将抽象部分与其实现部分分离,从而允许它们独立变化。这种模式适用于以下场景:
  1. 当一个类有多个维度的变化,并且希望这些变化可以独立扩展而不影响彼此时。
  2. 如果直接使用继承来处理多维度变化会导致类爆炸问题,即需要创建大量子类。

桥接模式的组成部分:

  • 抽象(Abstraction):定义了抽象接口,并包含对实现部分(Implementor)的操作。在Unity中,这可能是某个基础组件或接口,它提供了通用的功能描述,但不关心具体的实现细节。

例如:

public interface ICharacterControl
{
    void Move();
    void Attack();
    void SetWeapon(IWeapon weapon);
}

public interface IWeapon
{
    void Fire();
    void Reload();
}
  • 提炼的抽象(Refined Abstraction):继承自抽象类的具体角色,它可能会添加更多特定的行为,同时调用实现部分的方法。
public class Soldier : MonoBehaviour, ICharacterControl
{
    private IWeapon _currentWeapon;

    public void Move()
    {
        // 实现移动逻辑
    }

    public void Attack()
    {
        if (_currentWeapon != null)
            _currentWeapon.Fire();
    }

    public void SetWeapon(IWeapon weapon)
    {
        _currentWeapon = weapon;
    }
}
  • 实现(Implementor):定义了实现接口,这个接口通常代表了可变的部分,如不同的武器类型。
public abstract class WeaponBase : IWeapon
{
    public abstract void Fire();
    public abstract void Reload();
}

public class Pistol : WeaponBase
{
    public override void Fire()
    {
        Debug.Log("Pistol fires!");
    }

    public override void Reload()
    {
        Debug.Log("Pistol is reloading...");
    }
}

public class Shotgun : WeaponBase
{
    public override void Fire()
    {
        Debug.Log("Shotgun fires!");
    }

    public override void Reload()
    {
        Debug.Log("Shotgun is reloading...");
    }
}

五个实例说明:

  1. 角色和装备系统:游戏角色可以有不同的移动方式(跑、走、跳等)以及不同的武器(枪、剑、魔法等),通过桥接模式可以使角色类型和武器类型相互独立地扩展。

  2. 渲染引擎模块:抽象层为渲染器接口,具体实现包括不同的渲染技术(如Direct3D、OpenGL、Vulkan等)。不论游戏采用哪种渲染技术,上层的游戏对象渲染逻辑保持不变。

  3. UI控件库:抽象层定义了一系列UI控件(按钮、文本框、滑块等)的公共行为,而具体实现可能基于不同的图形API或框架(Unity UI、NGUI、TextMeshPro等)。

  4. AI决策树算法:抽象层是决策树接口,不同类型的AI实体可以根据需求选择不同的决策树实现(简单状态机、有限状态机、蒙特卡洛搜索树等)。

  5. 物理模拟引擎:抽象层提供物理模拟功能,如碰撞检测、刚体运动等,而具体实现可以切换为不同的物理引擎(Unity内置物理引擎、PhysX、Box2D等)。

以下是在Unity中应用桥接模式的五个不同场景的简化代码示例:

示例1:角色与装备系统

// 抽象部分 - 角色接口
public interface ICharacter
{
    void Move();
    void ChangeWeapon(IWeapon weapon);
}

// 实现部分 - 武器接口
public interface IWeapon
{
    void Use();
    void Reload();
}

// 具体抽象 - 战士类,继承自ICharacter
public class Warrior : MonoBehaviour, ICharacter
{
    private IWeapon currentWeapon;

    public void Move()
    {
        // 移动逻辑
    }

    public void ChangeWeapon(IWeapon weapon)
    {
        currentWeapon = weapon;
    }

    public void Attack()
    {
        if (currentWeapon != null)
            currentWeapon.Use();
    }
}

// 实现部分的具体类 - 短剑和长弓
public class ShortSword : IWeapon
{
    public void Use()
    {
        Debug.Log("Short sword is used for attack!");
    }

    public void Reload()
    {
        // 无需重新加载
    }
}

public class LongBow : IWeapon
{
    public void Use()
    {
        Debug.Log("Long bow fires an arrow!");
    }

    public void Reload()
    {
        Debug.Log("Reloading the long bow...");
    }
}

// 在游戏运行时切换武器
var warrior = GetComponent<Warrior>();
warrior.ChangeWeapon(new ShortSword());
warrior.Attack(); // 输出:"Short sword is used for attack!"
warrior.ChangeWeapon(new LongBow());
warrior.Attack(); // 输出:"Long bow fires an arrow!"

示例2:UI控件库

// 抽象部分 - UI控件接口
public interface IUIControl
{
    void Render();
    void SetText(string text);
}

// 实现部分 - 不同UI框架下的文本框实现
public abstract class TextControlBase : IUIControl
{
    public abstract void Render();
    public abstract void SetText(string text);
}

public class UnityUITextControl : TextControlBase
{
    public UnityEngine.UI.Text unityText; // Unity UI组件

    public override void Render()
    {
        // 使用Unity UI渲染文本
    }

    public override void SetText(string text)
    {
        unityText.text = text;
    }
}

public class NGUITextControl : TextControlBase
{
    // 假设NGUI有对应的文本组件引用

    public override void Render()
    {
        // 使用NGUI渲染文本
    }

    public override void SetText(string text)
    {
        // 设置NGUI文本内容
    }
}

// 在游戏运行时创建不同的UI文本框实例
var uiText = new UnityUITextControl();
uiText.SetText("Hello from Unity UI");
uiText.Render();

var nguiText = new NGUITextControl();
nguiText.SetText("Hello from NGUI");
nguiText.Render();

示例3:渲染引擎模块

// 抽象部分 - 渲染器接口
public interface IRenderer
{
    void RenderScene(GameObject scene);
}

// 实现部分 - 不同的渲染引擎实现
public class DirectXRenderer : IRenderer
{
    public void RenderScene(GameObject scene)
    {
        // 使用DirectX渲染场景
        Debug.Log("Rendering scene with DirectX...");
    }
}

public class OpenGLRenderer : IRenderer
{
    public void RenderScene(GameObject scene)
    {
        // 使用OpenGL渲染场景
        Debug.Log("Rendering scene with OpenGL...");
    }
}

// 游戏中的场景管理器调用渲染逻辑
public class SceneManager
{
    private IRenderer _renderer;

    public SceneManager(IRenderer renderer)
    {
        _renderer = renderer;
    }

    public void RenderCurrentScene()
    {
        _renderer.RenderScene(currentScene);
    }
}

// 在游戏启动时根据需要选择渲染引擎
var directXRenderer = new DirectXRenderer();
var sceneManager = new SceneManager(directXRenderer);
sceneManager.RenderCurrentScene(); // 输出:"Rendering scene with DirectX..."

// 如果需要切换到OpenGL,只需更改渲染器实例
var openGLRenderer = new OpenGLRenderer();
sceneManager._renderer = openGLRenderer;
sceneManager.RenderCurrentScene(); // 输出:"Rendering scene with OpenGL..."

示例4:AI决策树算法

// 抽象部分 - 决策树接口
public interface IDecisionTree
{
    Action Decide(AIState state);
}

// 实现部分 - 简单状态机和有限状态机
public class SimpleStateMachine : IDecisionTree
{
    public Action Decide(AIState state)
    {
        // 根据简单状态机决定动作
        Debug.Log($"Decided action based on Simple State Machine: {state}");
        return () => { /* 执行具体动作 */ };
    }
}

public class FiniteStateMachine : IDecisionTree
{
    public Action Decide(AIState state)
    {
        // 根据有限状态机决定动作
        Debug.Log($"Decided action based on Finite State Machine: {state}");
        return () => { /* 执行具体动作 */ };
    }
}

// AI角色类使用决策树接口
public class AIBot
{
    private IDecisionTree _decisionTree;

    public AIBot(IDecisionTree decisionTree)
    {
        _decisionTree = decisionTree;
    }

    public void TakeAction(AIState currentState)
    {
        var action = _decisionTree.Decide(currentState);
        action?.Invoke();
    }
}

// 在游戏运行时选择不同的决策树
var simpleBot = new AIBot(new SimpleStateMachine());
simpleBot.TakeAction(AIState.Idle);

var fsmBot = new AIBot(new FiniteStateMachine());
fsmBot.TakeAction(AIState.Patrolling);

示例5:物理模拟引擎

// 抽象部分 - 物理引擎接口
public interface IPhysicsEngine
{
    void Simulate();
    Rigidbody CreateRigidbody(GameObject obj);
}

// 实现部分 - Unity内置物理引擎和Box2D
public class UnityPhysicsEngine : IPhysicsEngine
{
    public void Simulate()
    {
        // 调用Unity内置物理引擎进行模拟
        Physics.Simulate(Time.fixedDeltaTime);
    }

    public Rigidbody CreateRigidbody(GameObject obj)
    {
        return obj.AddComponent<Rigidbody>();
    }
}

public class Box2DPhysicsEngine : IPhysicsEngine
{
    // 假设有一个用于与Box2D交互的封装类Box2DBody

    public void Simulate()
    {
        // 使用Box2D进行物理模拟
        // ...
    }

    public Rigidbody CreateRigidbody(GameObject obj)
    {
        // 创建一个Box2D对应的刚体组件并附加到对象上
        // 返回Box2DBody的引用或包装对象
        return null; // 这里简化处理,实际需要实现创建Box2D刚体
    }
}

// 游戏中的物理世界管理器使用物理引擎接口
public class PhysicsWorldManager
{
    private IPhysicsEngine _physicsEngine;

    public PhysicsWorldManager(IPhysicsEngine physicsEngine)
    {
        _physicsEngine = physicsEngine;
    }

    public void UpdatePhysics()
    {
        _physicsEngine.Simulate();
    }

    public Rigidbody AddRigidbody(GameObject obj)
    {
        return _physicsEngine.CreateRigidbody(obj);
    }
}

// 在游戏启动时选择物理引擎
var unityPhysics = new UnityPhysicsEngine();
var physicsManager = new PhysicsWorldManager(unityPhysics);
// ...

// 如果要切换到Box2D
var box2DPhysics = new Box2DPhysicsEngine();
physicsManager._physicsEngine = box2DPhysics;

python推荐学习汇总连接:
50个开发必备的Python经典脚本(1-10)

50个开发必备的Python经典脚本(11-20)

50个开发必备的Python经典脚本(21-30)

50个开发必备的Python经典脚本(31-40)

50个开发必备的Python经典脚本(41-50)
————————————————

​最后我们放松一下眼睛
Unity 桥接模式(实例详解),unity C#设计模式详解,unity,桥接模式,c#文章来源地址https://www.toymoban.com/news/detail-819874.html

到了这里,关于Unity 桥接模式(实例详解)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 津津乐道设计模式 - 桥接模式详解

    😄 19年之后由于某些原因断更了三年,23年重新扬帆起航,推出更多优质博文,希望大家多多支持~ 🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志 🎐 个人CSND主页——Micro麦可乐的博客 🐥《Docker实操教程》专栏以最新的Centos版本为基础进行Docker实操教程,入门

    2024年02月11日
    浏览(31)
  • 设计模式之解释器模式详解及实例

    1、解释器设计模式概述: 解释器模式(Interpreter Pattern)是一种设计模式,它主要用于描述如何构建一个解释器以解释特定的语言或表达式。该模式定义了一个文法表示和解释器的类结构,用于解释符合该文法规则的语句。解释器模式通常用于实现编程语言解释器、自定义脚

    2024年02月12日
    浏览(26)
  • Unity设计模式——原型模式

            原型模式 (Prototype)用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。原型模式其实就是 从一个对象再创建另外一个可定制的对象 ,而且不需知道任何创建的细节 。 原型类 Prototype:  ConcretePrototypel类,具体原型 客户端: 由于克隆实在太

    2024年02月07日
    浏览(30)
  • Unity实现设计模式——状态模式

    状态模式最核心的设计思路就是将对象的状态抽象出一个接口,然后根据它的不同状态封装其行为,这样就可以实现状态和行为的绑定,最终实现对象和状态的有效解耦。 在实际开发中一般用到FSM有限状态机的实现,GF框架中的FSM和流程控制就是基于这个原理实现的。 状态

    2024年02月08日
    浏览(27)
  • Unity设计模式之工厂模式

    一、什么是工厂模式 工厂模式是一种创建型设计模式,它提供了一种封装对象创建的方式,将对象的创建过程与使用过程分离,使得代码更加灵活、可扩展和可维护。在Unity中,工厂模式常用于创建和管理游戏对象。 对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习

    2024年02月14日
    浏览(27)
  • Unity实现设计模式——解释器模式

    解释器模式(Interpreter Pattern)是一种按照规定语法进行解析的模式,现实项目中用得较少。 给定一门语言,定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子。 下面用一个例子演示:将罗马文字转换为十进制的格式 解释器基类 千位数

    2024年02月07日
    浏览(30)
  • Unity设计模式之观察者模式

      在平常玩游戏的时候会遇到这种情况,以简单的Rpg举例。 勇者击杀了怪物,怪物死了,勇者摆出胜利姿势,系统提示怪物死亡 。如果按照一般逻辑可能会在怪物死亡的方法中去获取Player、Dialog,这样看上去其实也不太难。但如果需要去关联的事件很多,就需要在类中去获

    2024年02月06日
    浏览(24)
  • Unity设计模式之单例模式

    单例模式(Singleton)是设计模式中很常见的一种设计模式,目的是为了让一个类在程序运行期间有且仅有一个实例,且方便全局访问。 1、私有的构造函数。 2、含有一个该类的静态私有对象。 3、静态的公有函数或属性,方便用户创建或者获取它本身的静态私有对象。 当项目

    2023年04月09日
    浏览(58)
  • Unity设计模式—命令队列

    概要 本篇将介绍命令队列并用命令队列模式实现一个Unity里的WindowManager。 命令队列是一个按照FIFO顺序存储一系列通知或请求的队列。发出通知时系统会将请求置入队列并立即返回,请求处理器随后从命令队列中获取并处理这些请求。请求可由处理器直接处理或转发给对其感

    2024年02月02日
    浏览(26)
  • Unity设计模式之对象池(缓存池)模式

    对象池模式是我们在Unity开发中会经常用到的几种设计模式之一,最常见的例子就是在FPS游戏中子弹的创建与销毁或者说在无双游戏中敌人的创建和销毁都会使用到对象池模式。 首先我们先看一下为什么会使用到对象池模式,拿最简单的一个例子,在FPS游戏中,我们按下鼠标

    2024年02月12日
    浏览(25)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包