创游世界实战项目结构模板
一句话摘要
本文提供创游世界项目的标准目录结构与组织方式,帮助创作者建立可维护、可扩展、可协作的项目架构。核心原则:真值与显示分离、模块化组件、广播解耦、数据分层。
适合谁阅读
- 准备开始中型或大型项目的创作者
- 希望建立规范项目结构的开发者
- 需要团队协作的项目负责人
- 想提升项目可维护性的进阶用户
你将学到什么
- 如何组织项目的核心目录结构
- 不同类型内容的放置规范
- 脚本的模块化组织方式
- UI 与地图逻辑的分离架构
- 变量与属性的分层管理
- 广播的命名规范
- 可复用的项目模板框架
核心结论
- 真值层与显示层必须分离:游戏核心数据放地图/系统层,UI 只负责显示和交互。
- 组件化设计:把可复用功能封装为自定义组件,减少重复代码。
- 广播驱动:UI 与地图之间通过广播通信,避免直接耦合。
- 数据分层存储:根据作用域选择合适的变量类型。
- 目录结构清晰:按功能分类组织素材、组件和脚本。
1. 为什么需要项目结构模板
1.1 小项目与大项目的区别
小型项目(< 10 个功能点)可以用"堆代码"的方式快速完成。但当项目规模扩大时:
| 问题类型 | 小项目 | 中大型项目 |
|---|---|---|
| 代码量 | 几百行 | 几千行 |
| 功能点 | < 10 个 | 50+ 个 |
| 协作者 | 1 人 | 多人 |
| 维护周期 | 短期 | 长期 |
| 扩展需求 | 低 | 高 |
1.2 结构混乱的代价
- 功能之间相互耦合,改一处牵动多处
- 变量命名混乱,调试困难
- UI 和逻辑混在一起,切地图后状态丢失
- 广播名称不规范,追踪困难
- 难以复用和协作
1.3 好结构的价值
- 局部修改不影响全局
- 新功能可以"插拔式"添加
- 多人协作时互不干扰
- 后期维护和调试成本降低
2. 项目目录组织原则
2.1 核心组织思路
创游世界的项目可以按以下层级组织:
项目根目录
├─ 核心系统层(地图脚本、系统脚本)
├─ 功能模块层(各类功能组件)
├─ UI 界面层(界面设计)
├─ 公共资源层(素材、组件模板)
└─ 配置文件层(配置表、数据表)2.2 功能模块组织
每个功能模块应该包含:
功能模块
├─ 组件定义(自定义组件配置)
├─ 对象模板(素材配置)
├─ 逻辑脚本(行为逻辑)
├─ UI 界面(显示界面)
└─ 配置数据(配置表引用)2.3 命名规范
组件命名
- 使用有意义的名称:
武器管理系统、背包管理组件 - 避免:
组件1、组件2 - 同类组件使用统一前缀:
UI_、System_、Player_
广播命名
- 格式建议:
事件类型_目标对象_动作 - 示例:
道具_获得_玩家、敌人_死亡_通知、UI_刷新_背包 - 避免:太短或太通用的名称如
刷新、更新、1号广播
变量命名
- 使用描述性名称:
当前生命值、背包容量、敌人数量 - 按层级使用不同前缀:
- 局部变量:
l_(如l_临时计数) - 自身属性:
self_(如self_当前状态) - 地图属性:
map_(如map_当前波次) - 系统属性:
sys_(如sys_游戏难度)
- 局部变量:
3. 推荐项目结构模板
3.1 功能模块化结构
项目设计示例
│
├─ 地图层
│ ├─ 主场景地图
│ │ ├─ 地图脚本(核心流程控制)
│ │ ├─ 地图属性(波次、金币、状态)
│ │ └─ 地图广播(场景事件通知)
│ │
│ └─ 战斗场景地图
│ ├─ 地图脚本(战斗逻辑)
│ └─ 地图属性(敌人计数、计时器)
│
├─ 系统层
│ ├─ 玩家系统
│ │ ├─ 玩家控制脚本
│ │ ├─ 状态管理
│ │ └─ 能力组件
│ │
│ ├─ 背包系统
│ │ ├─ 背包组件
│ │ ├─ 物品配置表
│ │ └─ 物品管理逻辑
│ │
│ ├─ 商店系统
│ │ ├─ 商店组件
│ │ ├─ 商品配置表
│ │ └─ 交易逻辑
│ │
│ └─ 战斗系统
│ ├─ 武器组件
│ ├─ 子弹组件
│ ├─ 伤害计算
│ └─ 技能系统
│
├─ UI 层
│ ├─ 主界面 UI
│ │ ├─ 界面设计
│ │ └─ 界面逻辑(仅处理输入和显示)
│ │
│ ├─ 背包 UI
│ │ ├─ 界面设计
│ │ └─ 界面逻辑
│ │
│ ├─ 商店 UI
│ │ ├─ 界面设计
│ │ └─ 界面逻辑
│ │
│ └─ 战斗 UI
│ ├─ 血条
│ ├─ 技能栏
│ └─ 状态显示
│
├─ 公共组件层
│ ├─ 通用 UI 组件
│ │ ├─ 确认弹窗
│ │ ├─ 提示消息
│ │ └─ 加载动画
│ │
│ ├─ 通用逻辑组件
│ │ ├─ 冷却管理
│ │ ├─ 动画控制
│ │ └─ 特效触发
│ │
│ └─ 工具函数
│ ├─ 数学工具
│ ├─ 文本处理
│ └─ 数据校验
│
└─ 配置数据层
├─ 道具配置表
├─ 怪物配置表
├─ 技能配置表
├─ 商店配置表
└─ 任务配置表3.2 组件设计模板
组件命名示例
| 组件类型 | 示例名称 | 用途 |
|---|---|---|
| 功能组件 | 血条管理组件 | 统一管理血条显示 |
| 状态组件 | Buff状态组件 | 管理增益减益效果 |
| 交互组件 | 商店交互组件 | 处理商店交互逻辑 |
| 工具组件 | 冷却计时组件 | 统一管理技能冷却 |
组件结构模板
自定义组件:XXX组件
├─ 属性
│ ├─ 数字1:名称
│ ├─ 数字2:配置ID
│ ├─ 真假值1:是否激活
│ └─ 文本1:状态描述
│
├─ 指令
│ ├─ 初始化
│ │ └─ 当执行"初始化"时:设置初始状态
│ │
│ ├─ 激活
│ │ └─ 当执行"激活"时:启动功能
│ │
│ └─ 重置
│ └─ 当执行"重置"时:恢复默认状态
│
└─ 触发时机
├─ 当被创建时
│ └─ 执行"初始化"
└─ 当收到广播时(如需要)
└─ 处理对应事件4. 数据分层最佳实践
4.1 各层数据职责
| 数据层 | 职责 | 典型数据 |
|---|---|---|
| 局部变量 | 临时计算、中间值 | 循环计数、临时结果 |
| 自身属性 | 对象私有状态 | 血量、冷却、开关状态 |
| 地图属性 | 场景共享数据 | 波次、地图金币、机关状态 |
| 系统属性 | 全局配置数据 | 难度设置、总计时器 |
| 玩家变量 | 持久化存档 | 金币、道具、背包、进度 |
| 配置表 | 静态规则数据 | 怪物属性、技能配置、商品列表 |
4.2 数据流示例
购买道具流程
UI 层
├─ 显示商店界面
├─ 显示商品列表
└─ 监听购买按钮点击
↓
用户点击购买
↓
UI 层
├─ 检查货币是否足够(读玩家变量)
└─ 点击"购买" → 发送广播"请求购买_道具ID"
↓
地图/系统层(处理真值)
├─ 收到广播
├─ 检查货币
├─ 扣除货币(改玩家变量)
├─ 添加道具(改玩家变量)
└─ 发送广播"道具_获得_刷新"
↓
UI 层
├─ 收到刷新广播
└─ 更新背包显示、货币显示战斗伤害流程
事件触发
├─ 玩家攻击
└─ 子弹命中敌人
↓
伤害计算(局部变量)
├─ 基础伤害 = 武器伤害
├─ 最终伤害 = 基础伤害 × (1 - 防御减免)
└─ 暴击判定 = 随机数 < 暴击率
↓
状态更新(自身属性)
├─ 敌人.当前生命 -= 最终伤害
├─ 敌人.是否在战斗中 = 真
└─敌人.最后受击时间 = 当前时间
↓
结果广播
├─ 若死亡:发送"敌人_死亡_通知"
└─ 若存活:发送"血条_刷新"
↓
UI 更新
├─ 血条显示刷新
└─ 飘字显示(伤害数字)5. 广播设计规范
5.1 广播命名规范
推荐使用三段式命名:操作_目标_状态
| 广播类型 | 命名示例 | 说明 |
|---|---|---|
| UI 请求 | 请求_购买_道具ID | UI 向系统发起请求 |
| 状态变化 | 玩家_生命值_变化 | 通知状态已改变 |
| 事件通知 | 敌人_死亡_通知 | 通知某事件已发生 |
| UI 刷新 | 背包_刷新_显示 | UI 需要更新显示 |
| 游戏流程 | 游戏_暂停 | 全局流程控制 |
5.2 广播内容设计
简单广播(无参数)
发送广播"游戏_暂停"带参数广播
发送广播"道具_获得" 参数:道具ID
发送广播"伤害_计算" 参数:目标,伤害值5.3 广播滥用警示
| 滥用情况 | 后果 | 正确做法 |
|---|---|---|
| 广播名称不统一 | 难以追踪 | 建立广播命名表 |
| 一个广播做太多事 | 调试困难 | 拆分成多个专注广播 |
| 频繁广播无意义消息 | 性能浪费 | 只在状态真正变化时广播 |
| 在循环中频繁广播 | 卡顿 | 减少广播频率,批量处理 |
6. UI 与逻辑分离实践
6.1 UI 组件的职责
UI 应该只负责:
- 显示数据
- 接收输入
- 发送请求广播
- 响应刷新广播更新显示
UI 不应该负责:
- 直接修改核心游戏数据
- 复杂的业务逻辑判断
- 跨对象的状态同步
6.2 地图/系统层的职责
地图层应该负责:
- 核心游戏逻辑处理
- 真值数据管理
- 业务规则校验
- 跨对象协调
- 响应 UI 请求广播
6.3 分离示例
错误的做法(UI 承担太多)
当点击"购买"按钮时:
如果 玩家.金币 >= 当前商品.价格:
设置玩家.金币 = 玩家.金币 - 当前商品.价格
背包.添加道具(当前商品.ID)
背包.刷新显示
货币显示.刷新问题:UI 直接操作多个数据源,逻辑耦合严重
正确的做法(UI 只发请求)
当点击"购买"按钮时:
发送广播"请求_购买" 参数:商品ID
当收到广播"购买_成功"时:
背包.刷新显示
货币显示.刷新
---
地图脚本
当收到广播"请求_购买"时:
获取 参数[商品ID]
如果 玩家.金币 >= 商品.价格:
设置玩家.金币 = 玩家.金币 - 商品.价格
背包.添加道具(商品ID)
发送广播"购买_成功"
否则:
发送广播"购买_失败" 参数:"金币不足"7. 组件复用设计
7.1 通用组件示例
冷却管理组件
自定义组件:冷却管理组件
├─ 属性
│ ├─ 数字1:冷却时间(秒)
│ ├─ 数字2:剩余时间
│ └─ 真假值1:是否冷却中
│
├─ 指令
│ ├─ 开始冷却
│ │ └─ 设置剩余时间 = 冷却时间
│ │ 设置是否冷却中 = 真
│ │
│ └─ 检查冷却
│ └─ 如果 剩余时间 <= 0:设置是否冷却中 = 假
│
└─ 触发时机
重复执行直到(是否冷却中 = 假)
等待 1 秒
设置剩余时间 = 剩余时间 - 1
执行"检查冷却"使用方式
当点击技能按钮时:
如果 技能图标.冷却管理组件.是否冷却中 = 假:
播放技能
技能图标.执行"开始冷却"7.2 Buff/状态效果组件
自定义组件:Buff效果组件
├─ 属性
│ ├─ 文本1:Buff名称
│ ├─ 数字1:持续时间
│ ├─ 数字2:剩余时间
│ ├─ 数字3:效果值
│ └─ 真假值1:是否激活
│
├─ 指令
│ ├─ 施加Buff
│ │ └─ 设置持续时间 = 参数[时间]
│ │ 设置效果值 = 参数[值]
│ │ 设置是否激活 = 真
│ │
│ └─ 移除Buff
│ └─ 设置是否激活 = 假
│
└─ 触发时机
当状态改变时(是否激活 = 真)
应用效果8. 配置表使用规范
8.1 配置表 vs 变量表
| 类型 | 用途 | 修改时机 |
|---|---|---|
| 配置表 | 静态规则、策划数据 | 仅在设计阶段修改 |
| 变量表 | 动态状态、玩家数据 | 运行中动态变化 |
8.2 配置表结构示例
道具配置表
| ID | 名称 | 类型 | 效果 | 价格 | 图标 |
|---|---|---|---|---|---|
| 1001 | 生命药水 | 消耗品 | 恢复30生命 | 50 | item_potion |
| 1002 | 魔法药水 | 消耗品 | 恢复30魔法 | 50 | item_mana |
| 1003 | 铁剑 | 武器 | 攻击+10 | 200 | weapon_sword |
怪物配置表
| ID | 名称 | 生命 | 攻击 | 防御 | 掉落 |
|---|---|---|---|---|---|
| 2001 | 史莱姆 | 50 | 5 | 0 | 金币x10 |
| 2002 | 哥布林 | 100 | 10 | 2 | 金币x25、药水x1 |
| 2003 | 骷髅 | 150 | 15 | 5 | 金币x50、装备x1 |
8.3 运行时修改配置表
配置表在运行时的修改:
- 仅对当前会话生效
- 不会保存到原始配置
- 重启游戏后会恢复原始值
- 不应用于持久化玩家数据
9. 项目启动检查清单
开始一个新项目前,建议完成以下检查:
架构设计
- [ ] 确定核心系统(战斗、背包、商店、任务等)
- [ ] 定义数据分层方案
- [ ] 设计广播命名规范
- [ ] 确定组件复用策略
目录组织
- [ ] 建立功能模块目录结构
- [ ] 创建通用组件模板
- [ ] 建立配置表结构
- [ ] 设置 UI 资源分类
基础组件
- [ ] 玩家控制组件
- [ ] UI 响应组件
- [ ] 通用弹窗组件
- [ ] 冷却管理组件
- [ ] 动画控制组件
数据规范
- [ ] 定义变量命名规范
- [ ] 定义属性列表
- [ ] 建立配置表模板
- [ ] 制定存档数据结构
相关页面
- 创游世界脚本实战架构入门 - 脚本架构入门
- 创游世界广播驱动项目结构实战 - 广播架构设计
- 创游世界UI数据同步架构 - UI 与真值解耦
- 脚本作用域与数据流深度研究 - 数据分层详解
- 创游世界新手常见卡点与避坑清单 - 避坑指南
待验证问题
[待验证]大型项目的性能优化建议[待验证]联机模式下的组件同步策略[待验证]多人协作时的版本控制建议
后续优化方向
- [ ] 添加更多通用组件模板
- [ ] 补充具体游戏类型的项目结构示例
- [ ] 添加更多配置表模板
- [ ] 完善调试和排错指南
- [ ] 补充版本迁移指南
