unity 装饰器模式(实例详解)

文章目录

    • 简介
    • [1. **组件装饰器(Component Decorators)**:](#1. 组件装饰器(Component Decorators):)
    • [2. **游戏对象特效装饰器(GameObject Effects Decorator)**:](#2. 游戏对象特效装饰器(GameObject Effects Decorator):)
    • [3. **输入处理装饰器(Input Handling Decorators)**:](#3. 输入处理装饰器(Input Handling Decorators):)
    • [4. **性能优化装饰器(Performance Optimization Decorators)**:](#4. 性能优化装饰器(Performance Optimization Decorators):)
    • [5. **状态机装饰器(State Machine Decorators)**:](#5. 状态机装饰器(State Machine Decorators):)

简介

在Unity中,装饰器模式是一种设计模式,它允许我们在运行时动态地向对象添加新的行为和责任,而不会改变其原有的结构。通过组合(而非继承)来实现功能的扩展。下面举5个在Unity中使用装饰器模式的实例,并简要说明:

1. 组件装饰器(Component Decorators):

在Unity中,组件本身就是一种形式的装饰器。例如,我们有一个基础角色控制器BaseCharacterController,它实现了基本的移动逻辑。我们可以创建一个装饰器组件JumpingAbilityDecorator,它附加到角色上后可以增强基础角色的行为,为其添加跳跃功能。

csharp 复制代码
public class BaseCharacterController : MonoBehaviour { ... }

public class JumpingAbilityDecorator : MonoBehaviour
{
    public BaseCharacterController baseCharacter;
    
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space) && CanJump())
        {
            baseCharacter.Jump();
        }
    }
    
    bool CanJump() {...}
}

2. 游戏对象特效装饰器(GameObject Effects Decorator):

假设我们有一个简单的GameObject,如子弹Bullet,我们想为它添加不同的视觉或物理效果。可以用装饰器类来完成这个任务,比如FireTrailDecoratorExplosionOnImpactDecorator等。

csharp 复制代码
public class Bullet : MonoBehaviour { ... }

public class FireTrailDecorator : MonoBehaviour
{
    public Bullet bullet;
    
    void OnEnable()
    {
        // 添加火焰拖尾粒子系统
        var trail = Instantiate(fireTrailPrefab, bullet.transform);
    }
}

public class ExplosionOnImpactDecorator : MonoBehaviour
{
    public Bullet bullet;
    
    void OnCollisionEnter(Collision collision)
    {
        // 碰撞时触发爆炸特效并销毁子弹
        Instantiate(explosionPrefab, bullet.transform.position, Quaternion.identity);
        Destroy(bullet.gameObject);
    }
}

3. 输入处理装饰器(Input Handling Decorators):

考虑一个基础的玩家控制器,为了增加自定义输入响应,比如摇杆死区控制或者重力感应输入,可以创建装饰器类进行包装。

csharp 复制代码
public class PlayerInputController : MonoBehaviour
{
    public virtual Vector2 GetMoveDirection() { return Input.GetAxisRaw("Horizontal"); }
}

public class AnalogDeadzoneDecorator : MonoBehaviour
{
    public PlayerInputController inputController;
    public float deadZone;

    public override Vector2 GetMoveDirection()
    {
        var rawInput = inputController.GetMoveDirection();
        if (Mathf.Abs(rawInput.x) < deadZone) rawInput.x = 0;
        return rawInput;
    }
}

4. 性能优化装饰器(Performance Optimization Decorators):

对于渲染相关组件,比如SpriteRenderer,可以创建装饰器来管理启用/禁用渲染以优化性能,比如当对象离开摄像机视野时自动禁用渲染。

csharp 复制代码
public class AutoDisableRendererDecorator : MonoBehaviour
{
    public SpriteRenderer spriteRenderer;
    Camera mainCamera;

    void Start()
    {
        mainCamera = Camera.main;
    }

    void LateUpdate()
    {
        if (!mainCamera.OrthographicBoundsContain(spriteRenderer.bounds))
        {
            spriteRenderer.enabled = false;
        }
        else if (!spriteRenderer.enabled)
        {
            spriteRenderer.enabled = true;
        }
    }
}

5. 状态机装饰器(State Machine Decorators):

在构建复杂的状态机系统时,装饰器可用于扩展或修改特定状态的行为。例如,一个基础的 MovingState 可以被 DashModifierStateDecorator 装饰,以便在移动过程中添加短暂冲刺的功能。

csharp 复制代码
public class MovingState : IState
{
    public void Enter(Character character) { ... }
    public void Execute(Character character) { ... }
    public void Exit(Character character) { ... }
}

public class DashModifierStateDecorator : IState
{
    private readonly MovingState movingState;
    private bool canDash;

    public DashModifierStateDecorator(MovingState state)
    {
        movingState = state;
    }

    public void Enter(Character character)
    {
        movingState.Enter(character);
        canDash = true;
    }

    public void Execute(Character character)
    {
        movingState.Execute(character);

        if (Input.GetKeyDown(KeyCode.LeftShift) && canDash)
        {
            character.Dash();
            canDash = false;
        }
    }

    public void Exit(Character character)
    {
        movingState.Exit(character);
    }
}

以上每个示例都展示了如何通过装饰器模式在不更改原有类代码的基础上增加新功能。在实际开发中,这种模式有助于保持代码的可维护性和灵活性。

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

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

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

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

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


​最后我们放松一下眼睛

相关推荐
向宇it5 小时前
【unity小技巧】unity 什么是反射?反射的作用?反射的使用场景?反射的缺点?常用的反射操作?反射常见示例
开发语言·游戏·unity·c#·游戏引擎
九鼎科技-Leo6 小时前
什么是 WPF 中的依赖属性?有什么作用?
windows·c#·.net·wpf
Heaphaestus,RC7 小时前
【Unity3D】获取 GameObject 的完整层级结构
unity·c#
芋芋qwq7 小时前
Unity UI射线检测 道具拖拽
ui·unity·游戏引擎
baivfhpwxf20237 小时前
C# 5000 转16进制 字节(激光器串口通讯生成指定格式命令)
开发语言·c#
直裾7 小时前
Scala全文单词统计
开发语言·c#·scala
tealcwu7 小时前
【Unity服务】关于Unity LevelPlay的基本情况
unity·游戏引擎
ZwaterZ9 小时前
vue el-table表格点击某行触发事件&&操作栏点击和row-click冲突问题
前端·vue.js·elementui·c#·vue
大眼睛姑娘10 小时前
Unity3d场景童话梦幻卡通Q版城镇建筑植物山石3D模型游戏美术素材
unity·游戏美术
ZwaterZ11 小时前
el-table-column自动生成序号&&在序号前插入图标
前端·javascript·c#·vue