文章目录
-
- 简介
- [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
,我们想为它添加不同的视觉或物理效果。可以用装饰器类来完成这个任务,比如FireTrailDecorator
、ExplosionOnImpactDecorator
等。
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)
最后我们放松一下眼睛