初学者,自用笔记
对象池池化工厂(以enemy为例)
数据驱动
// 数据接口定义:等级数据
public interface ILevelData
{
int level { get; }
}
// 数据接口定义:配置ID
public interface IConfigId
{
int Id { get; }
}
// 数据接口定义:敌人数据
public interface IEnemyData : ILevelData
{
int hp { get; }
float damage { get; }
}
// 等级配置基类(数据驱动核心)
public abstract class LevelConfigBase<TLevelData> : ScriptableObject, IConfigId
where TLevelData : ILevelData
{
[SerializeField] private int id;
public int Id => id;
[SerializeField] protected List<TLevelData> levelDatas = new List<TLevelData>();
// 获取对应等级的数据(数据驱动核心方法)
public virtual TLevelData GetLevelData(int level)
{
return levelDatas.Find(d => d.level == level);
}
}
// 敌人配置类(具体数据配置)
[CreateAssetMenu(fileName = "EnemyConfig", menuName = "Config/EnemyConfig")]
public class EnemyConfig : LevelConfigBase<EnemyConfig.EnemyLevelData>
{
// 敌人等级数据模型(数据驱动载体)
[System.Serializable]
public class EnemyLevelData : IEnemyData
{
[SerializeField] private int _level;
[SerializeField] private int _hp;
[SerializeField] private float _damage;
public int level => _level;
public int hp => _hp;
public float damage => _damage;
}
}
// 敌人基类(池化对象具体实现)
public class Enemy : PooledObjectBase
{
public int curLevel;
public int curHp;
public float curDamage;
// 带数据初始化(数据驱动初始化)
public override void OnGet<T>(T _data)
{
if (_data is IEnemyData enemyData)
{
curLevel = enemyData.level;
curHp = enemyData.hp;
curDamage = enemyData.damage;
}
}
// 释放重置(池化对象复用)
public override void OnRelease()
{
curLevel = 0;
curHp = 0;
curDamage = 0;
transform.localScale = Vector3.one;
}
// 无数据初始化
public override void OnGet() { }
}
// 小兵(敌人子类)
public class Soldier : Enemy { }
// Boss(敌人子类)
public class Boss : Enemy { }
其他需配置数据模仿当前代码实现
泛型工厂基类(池化)
// 池化工厂接口:定义池化对象的创建契约,包含产品类型和数据类型约束
public interface IPoolFactory<TProduct, TData>
where TProduct : PooledObjectBase // 约束产品类型必须是池化对象基类
{
// 创建池化对象的方法:接收池标识、位置、旋转和数据参数
TProduct Create(string _poolKey, Vector3 pos, Quaternion rot, TData _data = default);
}
// 所有工厂的基类:统一管理工厂标识
public abstract class FactoryBase
{
public string factoryKey; // 工厂唯一标识
// 构造函数:初始化工厂标识
public FactoryBase(string _key)
{
factoryKey = _key;
}
}
// 池化泛型工厂基类:实现池化工厂接口,封装通用池化对象创建逻辑
public abstract class PoolBasedFactory<TProduct, TData> : FactoryBase, IPoolFactory<TProduct, TData>
where TProduct : PooledObjectBase // 约束产品类型为池化对象
where TData : class
{
public PoolManager poolManager; // 对象池管理器引用
// 构造函数:初始化工厂标识并获取对象池管理器单例
protected PoolBasedFactory(string _key) : base(_key)
{
poolManager = PoolManager.Instance;
}
public virtual TProduct Create(string _poolKey,Vector3 pos=default, Quaternion rot=default,TData _data=default)
{
TProduct obj = null;
// 判断是否传入了数据(TData)
bool hasData = !EqualityComparer<TData>.Default.Equals(_data, default(TData));
// 判断是否传入了位置信息(使用默认值判断)
bool hasPosition = pos != default || rot != default;
if (hasData && hasPosition)
{
// 有数据且有位置:调用带位置+数据的GetObject
obj = poolManager.GetObject<TProduct, TData>(_poolKey, pos, rot, _data);
}
else if (hasData && !hasPosition)
{
// 有数据但无位置:调用带数据的GetObject(默认位置)
obj = poolManager.GetObject<TProduct, TData>(_poolKey, _data);
}
else if (!hasData && hasPosition)
{
// 无数据但有位置:调用带位置的GetObject
obj = poolManager.GetObject<TProduct>(_poolKey, pos, rot);
}
else
{
// 无数据且无位置:调用默认位置的GetObject
obj = poolManager.GetObject<TProduct>(_poolKey);
}
return obj;
}
}
抽象工厂(池化)
// 敌人抽象工厂接口:定义创建小兵和Boss的契约(产品族接口)
public interface IEnemyFactory
{
Soldier CreateSoldier(string poolKey, int enemyId, int level, Vector3 pos=default, Quaternion rot=default);
Boss CreateBoss(string poolKey, int enemyId, int level, Vector3 pos=default, Quaternion rot=default);
}
// 小兵工厂接口:定义创建小兵的契约(单一产品接口)
public interface ISoldierFactory
{
Soldier CreateSoldier(string poolKey, int enemyId, int level, Vector3 pos=default, Quaternion rot=default);
}
// Boss工厂接口:定义创建Boss的契约(单一产品接口)
public interface IBossFactory
{
Boss CreateBoss(string poolKey, int enemyId, int level, Vector3 pos=default, Quaternion rot=default);
}
// 小兵工厂:实现小兵创建逻辑的具体工厂(池化+数据驱动)
public class SoldierFactory : PoolBasedFactory<Soldier, IEnemyData>, ISoldierFactory
{
// 存储小兵配置表(ID映射配置)
private readonly Dictionary<int, EnemyConfig> _configDic = new Dictionary<int, EnemyConfig>();
// 配置加载路径(按游戏模式区分)
public string loadstr= "Configs/Enemy/Soldier";
// 构造函数:初始化工厂标识和游戏模式
public SoldierFactory(string key,GameMode _mode) : base(key)
{
loadstr += _mode.ToString(); // 拼接模式路径(如Default/Event)
LoadConfigs(); // 加载对应模式的小兵配置
}
// 加载配置表(数据驱动核心)
private void LoadConfigs()
{
var configs = Resources.LoadAll<EnemyConfig>(loadstr);
foreach (var config in configs)
{
if (config == null) continue;
_configDic[config.Id] = config; // 缓存配置ID映射
}
}
// 创建小兵:结合配置和对象池
public Soldier CreateSoldier(string poolKey, int enemyId, int level, Vector3 pos=default, Quaternion rot=default)
{
// 查找对应ID的配置
if (!_configDic.TryGetValue(enemyId, out var config)) return null;
// 获取对应等级的属性数据
var levelData = config.GetLevelData(level);
if (levelData == null) return null;
// 通过对象池创建小兵并传入属性数据
return Create(poolKey, pos, rot, levelData);
}
}
// Boss工厂:实现Boss创建逻辑的具体工厂(池化+数据驱动)
public class BossFactory : PoolBasedFactory<Boss, IEnemyData>, IBossFactory
{
// 存储Bo***表(ID映射配置)
private readonly Dictionary<int, EnemyConfig> _configDic = new Dictionary<int, EnemyConfig>();
// 配置加载路径(按游戏模式区分)
public string loadstr = "Configs/Enemy/Boss";
// 构造函数:初始化工厂标识和游戏模式
public BossFactory(string key,GameMode _mode) : base(key)
{
loadstr += _mode.ToString(); // 拼接模式路径
LoadConfigs(); // 加载对应模式的Bo***
}
// 加载配置表(数据驱动核心)
private void LoadConfigs()
{
var configs = Resources.LoadAll<EnemyConfig>(loadstr);
foreach (var config in configs)
{
if (config == null) continue;
_configDic[config.Id] = config; // 缓存配置ID映射
}
}
// 创建Boss:结合配置和对象池
public Boss CreateBoss(string poolKey, int enemyId, int level, Vector3 pos=default, Quaternion rot=default)
{
// 查找对应ID的配置
if (!_configDic.TryGetValue(enemyId, out var config)) return null;
// 获取对应等级的属性数据
var levelData = config.GetLevelData(level);
if (levelData == null) return null;
// 通过对象池创建Boss并传入属性数据
return Create(poolKey, pos, rot, levelData);
}
}
// 普通关卡敌人工厂:组合小兵/Boss工厂的产品族工厂(抽象工厂具体实现)
public class DefaultEnemyFactory : FactoryBase, IEnemyFactory
{
private readonly ISoldierFactory _soldierFactory; // 小兵工厂依赖
private readonly IBossFactory _bossFactory; // Boss工厂依赖
// 构造函数:注入具体工厂依赖(依赖注入)
public DefaultEnemyFactory(
string key,
ISoldierFactory soldierFactory,
IBossFactory bossFactory
) : base(key)
{
_soldierFactory = soldierFactory;
_bossFactory = bossFactory;
}
// 创建普通关卡小兵:委托给小兵工厂
public Soldier CreateSoldier(string poolKey, int enemyId, int level, Vector3 pos=default, Quaternion rot=default)
=> _soldierFactory.CreateSoldier(poolKey, enemyId, level, pos, rot);
// 创建普通关卡Boss:委托给Boss工厂
public Boss CreateBoss(string poolKey, int enemyId, int level, Vector3 pos=default, Quaternion rot=default)
=> _bossFactory.CreateBoss(poolKey, enemyId, level, pos, rot);
}
// 活动关卡敌人工厂:组合小兵/Boss工厂的产品族工厂(抽象工厂具体实现)
public class EventEnemyFactory : FactoryBase, IEnemyFactory
{
private readonly ISoldierFactory _soldierFactory; // 小兵工厂依赖
private readonly IBossFactory _bossFactory; // Boss工厂依赖
// 构造函数:注入具体工厂依赖(依赖注入)
public EventEnemyFactory(
string key,
ISoldierFactory soldierFactory,
IBossFactory bossFactory
) : base(key)
{
_soldierFactory = soldierFactory;
_bossFactory = bossFactory;
}
// 创建活动关卡小兵:委托给活动模式小兵工厂(可扩展特殊逻辑)
public Soldier CreateSoldier(string poolKey, int enemyId, int level, Vector3 pos=default, Quaternion rot=default)
=> _soldierFactory.CreateSoldier(poolKey, enemyId, level, pos, rot);
// 创建活动关卡Boss:委托给活动模式Boss工厂(可扩展特殊逻辑)
public Boss CreateBoss(string poolKey, int enemyId, int level, Vector3 pos=default, Quaternion rot=default)
=> _bossFactory.CreateBoss(poolKey, enemyId, level, pos, rot);
}
具体工厂(池化)
// 基础池化工厂:针对PooledObjectBase基类的具体池化工厂实现
public class BasePoolFactory : PoolBasedFactory<PooledObjectBase, object>
{
// 构造函数:传入工厂标识
public BasePoolFactory(string _key) : base(_key)
{
}
// 重写创建方法:调用基类逻辑,可扩展自定义行为
public override PooledObjectBase Create(string _poolKey, Vector3 pos=default, Quaternion rot=default, object _data = null)
{
return base.Create(_poolKey, pos, rot, _data);
}
}
工厂管理器
// 游戏模式枚举:区分不同游戏场景(普通模式/活动模式)
public enum GameMode
{
Default, // 普通模式
Event, // 活动模式
}
// 工厂管理器:统一管理所有工厂的注册、获取和模式切换(注册表模式+抽象工厂模式应用)
public class FactoryManager : MonoBehaviour
{
public static FactoryManager Instance; // 单例实例
// 工厂注册表:存储所有工厂实例(键=工厂标识,值=工厂实例)
public Dictionary<string, FactoryBase> factoryDic = new Dictionary<string, FactoryBase>();
[SerializeField] private GameObject NonPoolprefab; // 非池化预制体示例
public GameMode gameMode = GameMode.Default; // 当前游戏模式
private void Awake()
{
// 单例模式初始化:确保全局唯一实例
if (Instance == null)
{
Instance = this;
}
else
{
Destroy(gameObject); // 销毁重复实例
return;
}
InitFactors(); // 初始化所有工厂
}
// 初始化所有工厂:注册非池化工厂、池化工厂和敌人工厂
private void InitFactors()
{
factoryDic.Clear(); // 清空注册表
// 1. 注册非池化工厂:传入创建逻辑(实例化预制体)
NonPoolBaseFactory nonPoolFactory =
new NonPoolBaseFactory("NonPoolBase",
(pos, rot) => Instantiate(NonPoolprefab, pos, rot));
AddFactors(nonPoolFactory);
// 2. 注册基础池化工厂
BasePoolFactory BasePoolFactory = new BasePoolFactory("Base");
AddFactors(BasePoolFactory);
// 3. 初始化敌人工厂(根据游戏模式)
InitEnemyFactory();
}
// 初始化敌人工厂:根据当前游戏模式创建对应的敌人家族工厂(抽象工厂模式)
private void InitEnemyFactory()
{
ISoldierFactory soldierFactory; // 小兵工厂接口
IBossFactory bossFactory; // Boss工厂接口
// 根据游戏模式选择对应的具体工厂
switch (gameMode)
{
case GameMode.Default:
// 普通模式:创建普通敌人工厂
soldierFactory = new SoldierFactory("Soldier_Default", gameMode);
bossFactory = new BossFactory("Boss_Default", gameMode);
AddFactors(new DefaultEnemyFactory("Enemy", soldierFactory, bossFactory));
break;
case GameMode.Event:
// 活动模式:创建活动敌人工厂
soldierFactory = new SoldierFactory("Soldier_Event", gameMode);
bossFactory = new BossFactory("Boss_Event", gameMode);
AddFactors(new EventEnemyFactory("Enemy", soldierFactory, bossFactory));
break;
}
}
// 切换游戏模式:动态替换敌人工厂(产品族切换)
public void SwitchGameMode(GameMode newMode)
{
if (gameMode == newMode)
return; // 模式未变化,直接返回
gameMode = newMode;
// 移除旧的敌人工厂(产品族)
factoryDic.Remove("Enemy");
// 根据新模式重新注册敌人工厂
InitEnemyFactory();
}
// 注册工厂到注册表:添加工厂实例并验证有效性
public void AddFactors(FactoryBase _base)
{
if (_base == null || string.IsNullOrEmpty(_base.factoryKey))
{ return; } // 无效工厂,跳过注册
factoryDic[_base.factoryKey] = _base; // 存入注册表
}
// 获取工厂:从注册表中按标识和类型获取工厂(泛型方法)
public T GetFactory<T>(string _key) where T : class
{
if (factoryDic.TryGetValue(_key, out var factory))
{
return factory as T; // 类型转换后返回
}
return null; // 未找到对应工厂
}
// 清空所有工厂:重置注册表
public void ClearAllFactories()
{
factoryDic.Clear();
}
}
泛型工厂(非池化)
//非池化工厂
public interface INonPoolFactory<TProduct, TData>
where TProduct : class
{
TProduct Create(Vector3 pos=default, Quaternion rot=default, TData data = default);
}
// 非池化泛型工厂基类:通过 Func<TData, TProduct> 委托来创建对象
public abstract class NonPoolFactory<TProduct, TData>
: FactoryBase, INonPoolFactory<TProduct, TData>
where TProduct : class
{
// 创建函数:由子类或外部注入,决定如何创建对象
protected System.Func<Vector3, Quaternion, TData, TProduct> _createFunc;
protected NonPoolFactory(string key) : base(key)
{
}
protected NonPoolFactory(string key, System.Func<Vector3, Quaternion, TData, TProduct> createFunc)
: base(key)
{
_createFunc = createFunc;
}
public virtual TProduct Create(Vector3 pos=default, Quaternion rot=default, TData data = default)
{
if (_createFunc == null)
{
return null;
}
return _createFunc.Invoke(pos,rot,data);
}
// 允许运行时重设创建函数
public void SetCreateFunc(System.Func<Vector3, Quaternion, TData, TProduct> createFunc)
{
_createFunc = createFunc;
}
}
具体工厂(非池化)
public class NonPoolBaseFactory
: NonPoolFactory<GameObject, object>
{
public NonPoolBaseFactory(string key, System.Func<Vector3, Quaternion, GameObject> createFunc)
: base(key)
{
_createFunc = (pos, rot, data) => createFunc(pos, rot);
}
// 无参创建方法
public GameObject Create(Vector3 pos=default, Quaternion rot=default)
{
return base.Create(pos,rot,null);
}
}
调用实例
public int EnemyId;
public void Awake()
{
// 直接按接口获取
var enemyFactory = FactoryManager.Instance.GetFactory<IEnemyFactory>("EnemyFactory");
if (enemyFactory == null)
{
Debug.LogError("敌人工厂获取失败!");
return;
}
enemyFactory.CreateSoldier("Soldier", EnemyId, 1, transform.position, transform.rotation);
}
技能工厂
SkillFactory
public interface ISkillFactory
{
SkillType SupportType { get; }
SkillBase CreateSkill(ISkillOwner owner, SkillData data);
}
public class SwapPositionSkillFactory : ISkillFactory
{
public SkillType SupportType => SkillType.SwapPosition;
public SkillBase CreateSkill(ISkillOwner owner, SkillData data)
{
var skill = new SwapPositionSkill(owner, data);
var aimData = data as AimSkillData;
// 创建并注入瞄准器
if (aimData.aimData != null)
{
var aimFactory = AimFactoryRegistry.GetFactory(aimData.aimData.aimType);
if (aimFactory != null)
{
skill.myAim = aimFactory.CreateAim(
owner,
owner.myTransform,
Camera.main,
aimData.aimData,
SupportType
);
}
}
return skill;
}
}
SkillFactory泛型工厂重构
// 泛型Skill工厂基类(抽离通用逻辑)
public abstract class GenericSkillFactory<TSkill> : ISkillFactory
where TSkill : AimSkillBase
{
// 子类只需实现这个属性,指定支持的技能类型
public abstract SkillType SupportType { get; }
// 子类实现:创建具体Skill实例(直接new)
protected abstract TSkill CreateSkillInstance(ISkillOwner owner, SkillData data);
// 通用的创建逻辑(所有Skill工厂都复用这部分)
public SkillBase CreateSkill(ISkillOwner owner, SkillData data)
{
TSkill skill = CreateSkillInstance(owner, data);
// 通用的瞄准器创建逻辑(所有工厂都一样)
var aimData = data as AimSkillData;
if (aimData?.aimData != null)
{
var aimFactory = AimFactoryRegistry.GetFactory(aimData.aimData.aimType);
if (aimFactory != null)
{
skill.myAim = aimFactory.CreateAim(
owner,
owner.myTransform,
Camera.main,
aimData.aimData,
SupportType
);
}
}
return skill;
}
}
// 重构后的具体工厂
public class SwapPositionSkillFactory : GenericSkillFactory<SwapPositionSkill>
{
public override SkillType SupportType => SkillType.SwapPosition;
protected override SwapPositionSkill CreateSkillInstance(ISkillOwner owner, SkillData data)
{
return new SwapPositionSkill(owner, data);
}
}
SKillFactory注册表
public static class SkillFactoryRegistry
{
private static readonly Dictionary<SkillType, ISkillFactory> factories = new();
static SkillFactoryRegistry()
{
RegisterFactory(new SwapPositionSkillFactory());
RegisterFactory(new SwapScaleSkillFactory());
RegisterFactory(new SwapColliderSkillFactory());
RegisterFactory(new SwapTargetSkillFactory());
RegisterFactory(new SwapPlayerSkillFactory());
}
public static void RegisterFactory(ISkillFactory factory)
{
if (factory == null) return;
factories[factory.SupportType] = factory;
}
public static ISkillFactory GetFactory(SkillType type)
{
factories.TryGetValue(type, out var f);
return f;
}
}

京公网安备 11010502036488号