Unity、Godot 和 Unreal Engine对比
个人理解:
Unity是通过GameObject来组织游戏对象,它相当于容器,上面挂了许多的组件来实现这个对象的行为,同时允许自己创建组件挂上去来扩充行为,自定义脚本本身就是组件的一种。
Godot是通过节点来组织游戏对象,每个节点相当于Unity一个组件,要实现类似Unity的一个对象多种行为,是通过添加节点的子节点来扩充。同时一个节点允许挂载一个脚本来拓展逻辑,但是脚本必须与节点类型匹配,只能继承与当前节点自身或其父类。脚本本身也相当于节点类了,也可以直接挂载场景里(相当于实例化一个对象出来)。
UE:todo
在 Unity 中,我们可以将场景内任意一个 GameObject(及其挂载的所有组件、嵌套的子 GameObject)保存为预制体(Prefab),预制体作为 “对象模板”,能在当前场景或其他场景中重复实例化,且修改预制体模板时,所有实例会同步更新(可手动断开关联)。
而 Godot 中实现类似 “可复用对象” 功能的核心是场景(Scene)。Godot 的场景本质是 “以一个根节点为核心的节点树”—— 我们既可以将整个场景(如 “玩家”“敌人” 场景)作为复用单元,也能单独选中场景内某个节点(及其所有子节点,包含子节点自带的功能与脚本),通过 “保存为场景” 功能生成独立的场景文件(.tscn)。后续在其他场景中,只需将这个独立场景文件直接拖入场景编辑器,就能实例化出完整的节点树,实现与 Unity 预制体一致的 “重复使用” 效果。
Godot的场景即Unity里的预制体,Godot把场景跟预制体这个概念统一起来。Godot里的信号即Unity里的事件。
Godot里的MetaData倒是个比较有意思的设定,相当于给每个节点(甚至不止节点,连资源都行)一个白板用来存放数据(数字,字符串啊,纹理啥的都行),然后可以通过代码来读写这些数据,跟脚本里的变量的区别就是,变量只是脚本才能用,一些节点上面没有挂载脚本,但又想给它们存些临时数据,这会就很有用了。比如场景有个摄像机,我想给它存个数字表示它的ID,但又不想挂脚本,那就用元数据
Unity、Godot 和 Unreal Engine 4(UE4)在场景对象、组件和层级管理方面有显著差异,这些差异直接影响开发流程和架构设计。以下是三者在核心机制上的详细对比:
1. 场景与游戏对象基础
| 特性 | Unity | Godot | Unreal Engine 4 |
|---|---|---|---|
| 核心对象 | GameObject(游戏对象) | Node(节点) | Actor(演员) |
| 对象本质 | 空容器,需通过组件实现功能 | 自带基础功能的节点,可直接使用 | 自带 transform 和生命周期的实体 |
| 场景文件格式 | .unity(二进制 / 文本) |
.tscn(文本,类似 XML) |
.umap(二进制,依赖.uasset) |
| 场景实例化 | 支持 Prefab 实例化到场景 | 支持 PackedScene 资源实例化 | 支持 Blueprint/Class 实例化 |
2. 组件系统设计
| 特性 | Unity | Godot | Unreal Engine 4 |
|---|---|---|---|
| 组件与对象关系 | 组件依附于 GameObject,对象本身无功能 | 节点即组件,节点可嵌套形成功能组合 | 组件(Component)依附于 Actor |
| 核心组件 | Transform(必选,控制变换) | Node2D/Node3D(自带变换,可选) | Root Component(必选,如 SceneComponent) |
| 组件继承 | 组件类继承自MonoBehaviour |
节点类继承自Node |
组件类继承自UActorComponent |
| 组件通信 | 通过GetComponent<T>()获取 |
通过节点路径(get_node())或信号连接 |
通过GetComponent<T>()或蓝图节点 |
| 脚本与组件绑定 | 脚本即组件,需挂载到 GameObject | 脚本继承节点类,本身就是节点 | 脚本需作为 Component 添加到 Actor |
3. 层级结构管理
| 特性 | Unity | Godot | Unreal Engine 4 |
|---|---|---|---|
| 层级本质 | 父子 GameObject 的 Transform 依赖 | 节点树(Node Tree),父节点控制子节点变换 | Actor 层级(Actor 可包含子 Actor) |
| 变换继承 | 子对象 Transform 受父对象影响 | 子节点变换默认受父节点影响 | 子 Actor 的 Transform 受父 Root Component 影响 |
| 层级操作 API | transform.parent、SetParent() |
add_child()、get_parent() |
AttachToComponent()、SetActorParent() |
| 层级可视化 | Hierarchy 面板,支持搜索和筛选 | Scene 面板 + 节点树视图,支持折叠 | World Outliner 面板,支持复杂筛选 |
| 实例化层级 | Prefab 实例保留原始层级结构 | PackedScene 实例化完整节点树 | Blueprint 实例保留 Actor 层级 |
4. 资源与对象关联
| 特性 | Unity | Godot | Unreal Engine 4 |
|---|---|---|---|
| 资源引用方式 | 直接拖拽到 Inspector 面板 | 资源路径引用或拖拽到属性面板 | 通过 Content Browser 拖拽关联 |
| 对象与资源分离 | GameObject 是实例,Prefab 是模板 | 节点实例与 PackedScene 模板分离 | Actor 实例与 Blueprint/Class 分离 |
| 实例修改 | 实例可覆盖 Prefab 属性(Override) | 实例可独立修改,不影响模板 | 实例可修改,支持 "Revert to Class Defaults" |
| 资源依赖管理 | 自动管理,可通过 AssetDatabase 查看 | 资源依赖可见,支持手动清理 | 依赖关系复杂,需通过 Reference Viewer 查看 |
5. 特殊机制与差异点
| 特性 | Unity | Godot | Unreal Engine 4 |
|---|---|---|---|
| 场景切换 | SceneManager.LoadScene() |
get_tree().change_scene() |
UGameplayStatics::OpenLevel() |
| 对象激活状态 | SetActive(bool) |
set_visible()/set_process() |
SetActorHiddenInGame()/SetActorEnableCollision() |
| 组件复用 | 可创建自定义组件类 | 可创建自定义节点类 | 可创建自定义 Component 类 |
| 2D 与 3D 支持 | 共享 GameObject,通过组件区分(如 SpriteRenderer vs MeshFilter) | 2D 和 3D 节点分离(如 Sprite vs MeshInstance3D) | 共享 Actor,通过组件区分(如 SpriteComponent vs StaticMeshComponent) |
| 蓝图 / 可视化脚本 | 支持 Visual Scripting(较简单) | 内置 GDScript 和可视化脚本(更轻量) | 蓝图系统(Blueprints,功能强大) |
6.Unity、Godot 和 Unreal Engine 中实现 "可操控移动且有碰撞体积的方块"
1. Unity 实现方式
Unity 采用「空对象 + 组件」模式,通过给 GameObject 添加 GameObject 添加不同组件实现功能组合。
- 在场景中创建一个
3D Object > Cube(自动包含Transform组件) - 为 Cube 添加
Rigidbody组件(处理物理碰撞和移动) - 为 Cube 添加
Box Collider组件(默认已添加,提供碰撞体积) - 将上述
PlayerController脚本挂载到 Cube 上
2. Godot 实现方式
Godot 采用「节点树」结构,通过组合不同类型节点实现功能,脚本直接作为节点的一部分。
- 创建根节点
RigidBody3D(自带物理特性) - 向其添加子节点
MeshInstance3D(用于渲染方块):- 在
MeshInstance3D的Mesh属性中选择BoxMesh
- 在
- 向
RigidBody3D添加子节点CollisionShape3D(提供碰撞体积):- 在
CollisionShape3D的Shape属性中选择BoxShape3D
- 在
- 将上述
PlayerController.gd脚本挂载到根节点RigidBody3D上
3. Unreal Engine 4 实现方式
UE4 采用「Actor + 组件」模式,通过蓝图或 C++ 实现逻辑,组件依附于 Actor。
- 创建一个新的 C++ 类
APlayerCube,继承自AActor - 在构造函数中添加三个核心组件:
UBoxComponent:作为根组件,处理碰撞UStaticMeshComponent:渲染方块(使用引擎自带 Cube 模型)- 启用物理模拟(
SetSimulatePhysics(true))
- 在
Project Settings > Input中设置输入轴:- "MoveForward"(W/S 或上下箭头)
- "MoveRight"(A/D 或左右箭头)
- 将
APlayerCube拖入场景,或通过蓝图实例化
总结
- Unity:采用「空对象 + 组件」模式,灵活性高,适合快速迭代,生态成熟但层级依赖 Transform 可能导致性能开销。
- Godot:基于「节点树」设计,节点即功能单元,层级关系直观,2D/3D 分离清晰,适合中小型项目和独立开发者。
- UE4:以「Actor+Component」为核心,蓝图系统强大,层级管理复杂但功能全面,适合大型 3A 项目,对性能和细节控制更精细。

浙公网安备 33010602011771号