使用示例¶
本文提供了 LazyConfig 的各种使用场景示例,帮助你快速上手。
🎯 基础用法¶
访问配置¶
using Game.Config;
using UnityEngine;
public class SkillExample : MonoBehaviour
{
private void Start()
{
// 访问单例(自动加载)
var skill = SkillConfigs.Instance.Get(1);
if (skill != null)
{
Debug.Log($"技能: {skill.name}");
Debug.Log($"冷却时间: {skill.cooldown}s");
Debug.Log($"魔法消耗: {skill.manaCost}");
}
}
}
遍历配置¶
public class SkillListExample : MonoBehaviour
{
private void Start()
{
foreach (var skill in SkillConfigs.Instance.Items)
{
Debug.Log($"ID: {skill.id}, 名称: {skill.name}");
}
}
}
🔗 跨表关联¶
基础关联¶
public class SkillDamageExample : MonoBehaviour
{
private void Start()
{
var skill = SkillConfigs.Instance.Get(1);
// 通过自动生成的方法访问关联数据
var damage = skill.GetDamage();
var effect = skill.GetEffect();
if (damage != null)
{
Debug.Log($"{skill.name} 的伤害类型: {damage.name}");
}
if (effect != null)
{
Debug.Log($"{skill.name} 的效果: {effect.name}");
}
}
}
多级关联¶
public class MultiLevelLinkExample : MonoBehaviour
{
private void Start()
{
var level = LevelConfigs.Instance.Get(1);
// 一级关联
var boss = level.GetBossCharacter();
if (boss != null)
{
Debug.Log($"关卡 {level.name} 的 Boss: {boss.name}");
// 二级关联(通过 Boss 角色关联到技能)
foreach (int skillId in boss.skillIds)
{
var skill = SkillConfigs.Instance.Get(skillId);
if (skill != null)
{
Debug.Log($" - Boss 技能: {skill.name}");
}
}
}
}
}
⚡ 加载模式¶
同步加载¶
public class SyncLoadExample : MonoBehaviour
{
private void Start()
{
// 同步初始化所有配置(会阻塞主线程)
ConfigSystem.Instance.Initialize();
Debug.Log("所有配置加载完成");
Debug.Log($"已加载配置数量: {ConfigSystem.Instance.RegisteredCount}");
}
}
异步加载(Await)¶
public class AsyncLoadExample : MonoBehaviour
{
private async void Start()
{
Debug.Log("开始异步加载...");
// 异步初始化所有配置
await ConfigSystem.Instance.InitializeAsync();
Debug.Log("异步加载完成");
// 访问配置
var skill = SkillConfigs.Instance.Get(1);
Debug.Log($"技能名称: {skill.name}");
}
}
异步加载(回调)¶
public class CallbackLoadExample : MonoBehaviour
{
private void Start()
{
Debug.Log("开始异步加载(回调模式)...");
ConfigSystem.Instance.InitializeAsync((success, errors) =>
{
if (success)
{
Debug.Log("加载成功");
var skill = SkillConfigs.Instance.Get(1);
Debug.Log($"技能名称: {skill.name}");
}
else
{
Debug.LogError("加载失败:");
foreach (string error in errors)
{
Debug.LogError($" - {error}");
}
}
});
}
}
并行加载¶
public class ParallelLoadExample : MonoBehaviour
{
private async void Start()
{
Debug.Log("开始并行异步加载...");
// 并行加载所有配置(最快方式)
await ConfigSystem.Instance.InitializeAsyncParallel();
Debug.Log("并行加载完成");
// 访问所有配置
Debug.Log($"角色数量: {CharacterConfigs.Instance.Count}");
Debug.Log($"技能数量: {SkillConfigs.Instance.Count}");
Debug.Log($"伤害类型数量: {DamageConfigs.Instance.Count}");
}
}
📊 条件查询¶
简单条件¶
public class ConditionQueryExample : MonoBehaviour
{
private void Start()
{
// 查找魔法消耗大于 30 的技能
var highManaSkills = SkillConfigs.Instance.FindAll(s => s.manaCost > 30);
Debug.Log("高魔法消耗技能:");
foreach (var skill in highManaSkills)
{
Debug.Log($" - {skill.name}: {skill.manaCost} MP");
}
}
}
复杂条件¶
public class ComplexQueryExample : MonoBehaviour
{
private void Start()
{
// 查找冷却时间在 5-10 秒之间且魔法消耗小于 50 的技能
var skills = SkillConfigs.Instance.FindAll(s =>
s.cooldown >= 5 &&
s.cooldown <= 10 &&
s.manaCost < 50
);
Debug.Log("中等冷却且低消耗技能:");
foreach (var skill in skills)
{
Debug.Log($" - {skill.name}: {skill.cooldown}s, {skill.manaCost} MP");
}
}
}
使用枚举条件¶
public class EnumQueryExample : MonoBehaviour
{
private void Start()
{
// 查找战士职业的角色
var warriors = CharacterConfigs.Instance.FindAll(c =>
c.classType == Game.ClassType.Warrior
);
Debug.Log("战士角色:");
foreach (var character in warriors)
{
Debug.Log($" - {character.name}");
}
}
}
🎮 游戏实战示例¶
示例 1:技能系统¶
public class SkillSystem : MonoBehaviour
{
public void UseSkill(int skillId)
{
var skill = SkillConfigs.Instance.Get(skillId);
if (skill == null)
{
Debug.LogError($"技能 ID {skillId} 不存在");
return;
}
Debug.Log($"使用技能: {skill.name}");
Debug.Log($"描述: {skill.description}");
// 获取伤害类型
var damage = skill.GetDamage();
if (damage != null)
{
Debug.Log($"伤害类型: {damage.name}");
}
// 获取技能效果
var effect = skill.GetEffect();
if (effect != null)
{
Debug.Log($"效果: {effect.name}");
}
}
}
示例 2:角色系统¶
public class CharacterSystem : MonoBehaviour
{
public CharacterConfig GetCharacter(int id)
{
return CharacterConfigs.Instance.Get(id);
}
public void PrintCharacterInfo(int id)
{
var character = CharacterConfigs.Instance.Get(id);
if (character == null)
{
Debug.LogError($"角色 ID {id} 不存在");
return;
}
Debug.Log($"=== {character.name} ===");
Debug.Log($"职业: {character.classType}");
Debug.Log($"生命值: {character.maxHp}");
Debug.Log($"魔法值: {character.maxMp}");
Debug.Log($"攻击力: {character.attack}");
Debug.Log($"防御力: {character.defense}");
Debug.Log($"移动速度: {character.moveSpeed}");
Debug.Log($"出生位置: {character.spawnPosition}");
// 打印技能列表
Debug.Log("技能:");
foreach (int skillId in character.skillIds)
{
var skill = SkillConfigs.Instance.Get(skillId);
if (skill != null)
{
Debug.Log($" - {skill.name}");
}
}
}
}
示例 3:关卡系统¶
public class LevelSystem : MonoBehaviour
{
public LevelConfig GetLevel(int id)
{
return LevelConfigs.Instance.Get(id);
}
public void LoadLevel(int levelId)
{
var level = LevelConfigs.Instance.Get(levelId);
if (level == null)
{
Debug.LogError($"关卡 ID {levelId} 不存在");
return;
}
Debug.Log($"加载关卡: {level.name}");
Debug.Log($"推荐战力: {level.recommendedPower}");
Debug.Log($"关卡阶段: {level.stageCount}");
// 获取 Boss 信息
var boss = level.GetBossCharacter();
if (boss != null)
{
Debug.Log($"Boss: {boss.name} ({boss.classType})");
}
// 打印奖励
Debug.Log("奖励:");
foreach (string reward in level.rewards)
{
Debug.Log($" - {reward}");
}
}
}
🔧 自定义类型示例¶
使用自定义 SkillEffect 类型¶
public class CustomTypeExample : MonoBehaviour
{
private void Start()
{
var skill = SkillConfigs.Instance.Get(1);
// 直接访问自定义类型字段
var effect = skill.effect;
if (effect != null)
{
Debug.Log($"效果 ID: {effect.effectId}");
Debug.Log($"效果名称: {effect.effectName}");
}
}
}
⚠️ 注意事项¶
- 空值检查:
Get(id)可能返回 null,建议进行空值检查 - 线程安全:配置访问不是线程安全的,建议在主线程访问
- 性能优化:频繁访问的配置可以缓存到本地变量
- 加载状态:在异步加载完成前访问会自动转为同步加载
- 资源释放:不需要时可以调用
ConfigSystem.Instance.Dispose()释放资源
📚 更多示例¶
下载 Unity 示例工程¶
你可以下载完整的 Unity 示例包,包含所有示例代码和演示场景:
👉 下载 LazyConfigSamples.unitypackage
导入方式:Unity 菜单 → Assets → Import Package → Custom Package → 选择下载的 .unitypackage 文件。
示例目录结构¶
查看项目中的 Samples 目录获取完整的示例代码:
Assets/LazyConfig/Samples/
├── Scripts/
│ ├── UseageExample.cs # 完整使用示例
│ └── DemoUIBuilder.cs # UI 演示
└── UsageExample.unity # 演示场景