2. 项目搭建与场景配置
2026/4/15大约 4 分钟
2. 项目搭建与场景配置:搭建你的 MOBA 战场
2.1 创建新项目
打开 Godot 4.x,点击"新建项目",选择 Forward+ 渲染器。
| 项目设置 | 推荐值 | 说明 |
|---|---|---|
| 项目名称 | HonorOfKings | 项目名 |
| 渲染器 | Forward+ | 高质量 3D 渲染 |
| 项目路径 | 你喜欢的位置 | 建议路径不含中文 |
2.2 项目目录结构
MOBA 游戏涉及的系统很多,良好的目录结构是成功的第一步:
honor_of_kings/
├── scenes/ # 场景文件
│ ├── main.tscn # 主场景(游戏入口)
│ ├── world.tscn # 世界场景(地图+建筑)
│ ├── hero_select.tscn # 英雄选择界面
│ ├── heroes/ # 英雄场景
│ │ ├── warrior.tscn # 战士
│ │ ├── mage.tscn # 法师
│ │ └── marksman.tscn # 射手
│ ├── buildings/ # 建筑场景
│ │ ├── tower.tscn # 防御塔
│ │ ├── base.tscn # 基地水晶
│ │ └── shop.tscn # 商店
│ ├── units/ # 小兵和野怪
│ │ ├── minion.tscn # 小兵
│ │ ├── jungle_monster.tscn # 野怪
│ │ └── boss.tscn # Boss怪物
│ └── effects/ # 特效场景
│ ├── projectile.tscn # 弹道(火球、箭矢等)
│ ├── explosion.tscn # 爆炸特效
│ └── buff_effect.tscn # Buff/Debuff特效
├── scripts/ # 脚本文件
│ ├── game_manager.gd # 游戏主控
│ ├── hero_base.gd # 英雄基类
│ ├── skill_system.gd # 技能系统
│ ├── tower.gd # 防御塔逻辑
│ ├── minion.gd # 小兵逻辑
│ ├── minion_spawner.gd # 小兵刷新器
│ ├── jungle_camp.gd # 野怪营地
│ ├── economy_system.gd # 经济系统
│ ├── item_shop.gd # 装备商店
│ ├── behavior_tree/ # 行为树AI
│ │ ├── bt_node.gd # 行为树节点基类
│ │ ├── bt_selector.gd # 选择节点
│ │ ├── bt_sequence.gd # 序列节点
│ │ └── bt_actions/ # 具体行为
│ ├── network/ # 网络模块
│ │ ├── network_manager.gd # 网络管理
│ │ └── sync_manager.gd # 状态同步
│ └── object_pool.gd # 对象池
├── resources/ # 数据资源
│ ├── heroes/ # 英雄数据
│ │ ├── warrior.tres # 战士属性
│ │ ├── mage.tres # 法师属性
│ │ └── marksman.tres # 射手属性
│ ├── skills/ # 技能数据
│ │ ├── whirlwind_slash.tres
│ │ ├── fireball.tres
│ │ └── ...
│ ├── items/ # 装备数据
│ │ ├── sword_basic.tres
│ │ ├── armor_basic.tres
│ │ └── ...
│ └── map_data/ # 地图数据
│ ├── lane_paths.tres # 路线路径
│ └── tower_positions.tres # 塔位置
├── models/ # 3D模型
├── textures/ # 纹理贴图
├── audio/ # 音效
└── ui/ # UI场景
├── hud.tscn # 游戏HUD
├── minimap.tscn # 小地图
└── shop_panel.tscn # 商店面板2.3 配置项目设置
输入映射
我们需要为游戏配置输入操作。进入 项目 → 项目设置 → 输入映射,添加以下动作:
| 动作名称 | 按键绑定 | 说明 |
|---|---|---|
| move_up | W / ↑ | 向上移动 |
| move_down | S / ↓ | 向下移动 |
| move_left | A / ← | 向左移动 |
| move_right | D / → | 向右移动 |
| skill_1 | Q | 技能1 |
| skill_2 | E | 技能2 |
| skill_3 | R / F | 大招 |
| attack | 鼠标左键 / J | 普通攻击 |
| select_target | 鼠标右键 | 选择目标/移动 |
| open_shop | B | 打开商店 |
| recall | T | 回城 |
| level_up_skill | Ctrl+Q/E/R | 升级技能 |
图层设置
MOBA 游戏需要大量的碰撞检测和区域判定。进入 项目 → 项目设置 → Layer Names → 3D Physics:
| 层级 | 名称 | 用途 |
|---|---|---|
| 1 | terrain | 地形碰撞 |
| 2 | hero | 英雄碰撞 |
| 3 | minion | 小兵碰撞 |
| 4 | tower | 防御塔碰撞 |
| 5 | building | 建筑碰撞 |
| 6 | projectile | 弹道碰撞 |
| 7 | jungle | 野怪碰撞 |
| 8 | skill_area | 技能范围检测 |
为什么需要这么多层级?
MOBA 游戏里"谁能打谁"的规则非常复杂。比如:防御塔会优先打攻击己方英雄的敌人,小兵只会打眼前最近的敌方单位。通过分层,我们可以精确控制"谁检测谁",避免不必要的碰撞计算。
2.4 创建主场景
主场景是游戏的入口点,负责管理所有子系统的生命周期:
C#
// Main.cs
using Godot;
public partial class Main : Node3D
{
private GameManager _gameManager;
private Node3D _world;
public override void _Ready()
{
// 加载世界场景
var worldScene = GD.Load<PackedScene>("res://scenes/world.tscn");
_world = worldScene.Instantiate<Node3D>();
AddChild(_world);
// 初始化游戏管理器
_gameManager = new GameManager();
AddChild(_gameManager);
GD.Print("MOBA 游戏初始化完成!");
}
}GDScript
# main.gd
extends Node3D
var game_manager: Node
var world: Node3D
func _ready():
# 加载世界场景
var world_scene = load("res://scenes/world.tscn")
world = world_scene.instantiate()
add_child(world)
# 初始化游戏管理器
game_manager = GameManager.new()
add_child(game_manager)
print("MOBA 游戏初始化完成!")2.5 配置摄像机
MOBA 游戏使用俯视角摄像机,跟随玩家英雄移动:
C#
// CameraFollow.cs
using Godot;
public partial class CameraFollow : Camera3D
{
private Node3D _target; // 跟随目标(玩家英雄)
private Vector3 _offset = new Vector3(0, 25, -15); // 摄像机偏移
private float _smoothSpeed = 5.0f; // 跟随平滑度
public override void _Process(double delta)
{
if (_target == null) return;
var targetPos = _target.GlobalPosition + _offset;
GlobalPosition = GlobalPosition.Lerp(targetPos, (float)(_smoothSpeed * delta));
LookAt(_target.GlobalPosition, Vector3.Up);
}
public void SetTarget(Node3D target)
{
_target = target;
}
}GDScript
# camera_follow.gd
extends Camera3D
var target: Node3D # 跟随目标(玩家英雄)
var offset := Vector3(0, 25, -15) # 摄像机偏移
var smooth_speed := 5.0 # 跟随平滑度
func _process(delta):
if target == null:
return
var target_pos = target.global_position + offset
global_position = global_position.lerp(target_pos, smooth_speed * delta)
look_at(target.global_position, Vector3.UP)
func set_target(new_target: Node3D):
target = new_target2.6 配置灯光
MOBA 地图需要均匀的环境光照:
| 灯光类型 | 设置 | 说明 |
|---|---|---|
| DirectionalLight3D | 方向:(-0.5, -1, -0.3),强度:0.8 | 主光源,模拟日光 |
| WorldEnvironment | 环境光:天蓝色,强度:0.4 | 补充环境光,让阴影区域不会太暗 |
章节导航
| 上一章 | 下一章 |
|---|---|
| ← 1. 核心玩法概述 | 3. 地图与分路系统 → |
