【行为型之策略模式】游戏开发实战——Unity灵活算法架构的核心实现策略

文章目录

🎮 策略模式(Strategy Pattern)深度解析

------以Unity实现灵活AI行为 与动态伤害计算为核心案例


一、模式本质与核心价值

核心目标 :

✅ 定义算法族 ,封装每个算法,使它们可互换

✅ 运行时动态切换算法 ,避免使用多重条件判断

✅ 符合开闭原则,易于扩展新算法

关键术语:

  • Strategy(策略接口):定义算法族的通用接口
  • ConcreteStrategy(具体策略):实现具体算法逻辑
  • Context(上下文):持有策略引用,负责调用算法

数学表达 :

设算法集合S = {s₁, s₂, ..., sₙ},上下文C满足:

C.Algorithm = sᵢ → C.Execute() = sᵢ.Process()


二、经典UML结构

<<interface>> IDamageStrategy +CalculateDamage() : float PhysicalDamage +CalculateDamage() MagicDamage +CalculateDamage() CritDamage +CalculateDamage() Weapon -damageStrategy: IDamageStrategy +Attack()


三、Unity实战代码(动态伤害计算系统)
1. 定义策略接口与上下文
csharp 复制代码
public interface IDamageStrategy {
    float CalculateDamage(Character attacker, Character target);
}

public class Weapon : MonoBehaviour {
    private IDamageStrategy _damageStrategy;
    
    public void SetStrategy(IDamageStrategy strategy) {
        _damageStrategy = strategy;
    }
    
    public void Attack(Character attacker, Character target) {
        float damage = _damageStrategy.CalculateDamage(attacker, target);
        target.TakeDamage(damage);
    }
}
2. 实现具体策略
csharp 复制代码
// 物理伤害策略
public class PhysicalDamage : IDamageStrategy {
    public float CalculateDamage(Character attacker, Character target) {
        return attacker.Strength * 2 - target.Defense;
    }
}

// 魔法伤害策略
public class MagicDamage : IDamageStrategy {
    public float CalculateDamage(Character attacker, Character target) {
        return attacker.Intelligence * 3 - target.MagicResist;
    }
}

// 暴击伤害策略
public class CriticalStrike : IDamageStrategy {
    [SerializeField] private float _critChance = 0.3f;
    
    public float CalculateDamage(Character attacker, Character target) {
        float baseDamage = attacker.Strength * 1.5f;
        return Random.value < _critChance ? baseDamage * 2 : baseDamage;
    }
}
3. 客户端使用
csharp 复制代码
public class PlayerCombat : MonoBehaviour {
    [SerializeField] private Weapon _sword;
    
    void Update() {
        if(Input.GetKeyDown(KeyCode.Alpha1)) {
            _sword.SetStrategy(new PhysicalDamage());
        }
        
        if(Input.GetKeyDown(KeyCode.Alpha2)) {
            _sword.SetStrategy(new MagicDamage());
        }
        
        if(Input.GetMouseButtonDown(0)) {
            Character enemy = GetTargetEnemy();
            _sword.Attack(GetComponent<Character>(), enemy);
        }
    }
}

四、模式进阶技巧
1. 策略组合
csharp 复制代码
public class CompositeStrategy : IDamageStrategy {
    private List<IDamageStrategy> _strategies = new();
    
    public void AddStrategy(IDamageStrategy strategy) {
        _strategies.Add(strategy);
    }
    
    public float CalculateDamage(Character attacker, Character target) {
        return _strategies.Sum(s => s.CalculateDamage(attacker, target));
    }
}
2. 策略工厂
csharp 复制代码
public class DamageStrategyFactory {
    public IDamageStrategy Create(WeaponType type) {
        return type switch {
            WeaponType.Sword => new PhysicalDamage(),
            WeaponType.Staff => new MagicDamage(),
            WeaponType.Dagger => new CriticalStrike(),
            _ => throw new ArgumentException()
        };
    }
}
3. 数据驱动策略
csharp 复制代码
[CreateAssetMenu]
public class DamageConfig : ScriptableObject {
    public AnimationCurve DamageCurve;
    public GameObject ImpactEffect;
}

public class ConfigurableDamage : IDamageStrategy {
    private DamageConfig _config;
    
    public float CalculateDamage(Character attacker, Character target) {
        float levelFactor = _config.DamageCurve.Evaluate(attacker.Level);
        return attacker.BaseDamage * levelFactor;
    }
}

五、游戏开发典型应用场景
  1. AI行为系统

    csharp 复制代码
    public class NPCController {
        private IMovementStrategy _movementStrategy;
        
        public void SetMovementStrategy(IMovementStrategy strategy) {
            _movementStrategy = strategy;
        }
        
        void Update() {
            _movementStrategy.Move(transform);
        }
    }
  2. 技能效果系统

    csharp 复制代码
    public class SkillSystem {
        private ISkillEffect _effect;
        
        public void CastSkill() {
            _effect.ApplyEffect(target);
        }
    }
  3. 成就解锁条件

    csharp 复制代码
    public class AchievementCondition {
        private IUnlockStrategy _strategy;
        
        public bool CheckUnlock(Player player) {
            return _strategy.IsUnlocked(player);
        }
    }
  4. 物理材质系统

    csharp 复制代码
    public class SurfaceResponse {
        private IBounceStrategy _bounceStrategy;
        
        public Vector3 CalculateBounce(Vector3 input) {
            return _bounceStrategy.CalculateBounce(input);
        }
    }

六、性能优化策略
策略 实现方式 适用场景
策略缓存 对象池管理策略实例 高频策略切换
预编译策略 使用C#委托或表达式树 高性能计算场景
数据导向设计 策略参数结构体化 大量相似策略
异步加载 按需加载策略资源 复杂策略配置

七、模式对比与选择
维度 策略模式 状态模式
关注点 算法实现 状态转换
切换机制 主动切换 自动转换
对象关系 平行策略 状态链
典型应用 伤害计算 AI状态机

八、最佳实践原则
  1. 接口最小化:策略接口保持单一职责

  2. 无状态策略:尽量设计无状态的策略类

  3. 防御性编程 :

    csharp 复制代码
    public void SetStrategy(IDamageStrategy strategy) {
        _damageStrategy = strategy ?? throw new ArgumentNullException();
    }
  4. 策略验证 :

    csharp 复制代码
    public bool IsStrategyValid() {
        return _damageStrategy != null && _damageStrategy.IsAvailable();
    }

九、常见问题解决方案

Q1:如何处理策略间共享数据?

→ 使用上下文传递参数

csharp 复制代码
public interface IStrategy {
    void Execute(SharedData context);
}

public class SharedData {
    public Character Attacker;
    public Character Target;
    public float EnvironmentFactor;
}

Q2:如何实现跨策略配置?

→ 使用策略配置中心

csharp 复制代码
public class StrategyConfig : MonoBehaviour {
    [SerializeField] private StrategyMapping[] _mappings;
    
    public IStrategy GetStrategy(string key) {
        return _mappings.FirstOrDefault(m => m.Key == key)?.Strategy;
    }
}

[System.Serializable]
public class StrategyMapping {
    public string Key;
    public IStrategy Strategy;
}

Q3:如何调试策略执行流程?

→ 实现策略日志代理

csharp 复制代码
public class LoggingStrategyProxy : IStrategy {
    private IStrategy _wrapped;
    
    public void Execute() {
        Debug.Log($"开始执行策略:{_wrapped.GetType().Name}");
        _wrapped.Execute();
        Debug.Log("策略执行完成");
    }
}

上一篇 【行为型之状态模式】深度剖析------Unity角色行为控制与AI决策的终极解决方案
下一篇 【行为型之模板方法模式】游戏开发实战------Unity标准化流程与可扩展架构的核心实现

相关推荐
曹牧5 小时前
C#:未被引用的函数
c#
上位机妹子10 小时前
EF Core 两种继承映射:每层次一张表(TPH)与每类型一张表(TPT)
数据库·c#·.netcore·ef core
染指111011 小时前
140.Agent-多Agent框架-Agent执行Skills流程
数据库·人工智能·设计模式·langchain·agents
小羊没烦恼!12 小时前
jQuery1.5的改进细节
java·服务器·开发语言·前端·c#
下页、再停留13 小时前
【C#桌面客户端系列学习-8】批量导出数据为csv格式
开发语言·c#·visual studio
波力海苔夹心脆67514 小时前
C# 视觉检测实战:PLC 按钮触发 VisionPro 检测,OK 亮灯 / NG 灭灯(西门子 PLC,含界面显示与图片存档)
开发语言·经验分享·c#·自动化·视觉检测·.net
kim15 小时前
一个人 + AI,用 WinForms 搓了个 376KB 的 Windows 便签:便签 / 截图 / 标注 / OCR / 待办全塞进去了
c#
hez201015 小时前
一行代码在 .NET 项目里启用 Satori GC
c#·.net·.net core·gc·clr
宇卿.15 小时前
C#语句:
开发语言·c#
咕白m62516 小时前
使用 C# 将 TIFF 转换为 PDF
前端·c#