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. 场景与游戏对象基础

特性UnityGodotUnreal Engine 4
核心对象 GameObject(游戏对象) Node(节点) Actor(演员)
对象本质 空容器,需通过组件实现功能 自带基础功能的节点,可直接使用 自带 transform 和生命周期的实体
场景文件格式 .unity(二进制 / 文本) .tscn(文本,类似 XML) .umap(二进制,依赖.uasset
场景实例化 支持 Prefab 实例化到场景 支持 PackedScene 资源实例化 支持 Blueprint/Class 实例化

2. 组件系统设计

特性UnityGodotUnreal Engine 4
组件与对象关系 组件依附于 GameObject,对象本身无功能 节点即组件,节点可嵌套形成功能组合 组件(Component)依附于 Actor
核心组件 Transform(必选,控制变换) Node2D/Node3D(自带变换,可选) Root Component(必选,如 SceneComponent)
组件继承 组件类继承自MonoBehaviour 节点类继承自Node 组件类继承自UActorComponent
组件通信 通过GetComponent<T>()获取 通过节点路径(get_node())或信号连接 通过GetComponent<T>()或蓝图节点
脚本与组件绑定 脚本即组件,需挂载到 GameObject 脚本继承节点类,本身就是节点 脚本需作为 Component 添加到 Actor

3. 层级结构管理

特性UnityGodotUnreal Engine 4
层级本质 父子 GameObject 的 Transform 依赖 节点树(Node Tree),父节点控制子节点变换 Actor 层级(Actor 可包含子 Actor)
变换继承 子对象 Transform 受父对象影响 子节点变换默认受父节点影响 子 Actor 的 Transform 受父 Root Component 影响
层级操作 API transform.parentSetParent() add_child()get_parent() AttachToComponent()SetActorParent()
层级可视化 Hierarchy 面板,支持搜索和筛选 Scene 面板 + 节点树视图,支持折叠 World Outliner 面板,支持复杂筛选
实例化层级 Prefab 实例保留原始层级结构 PackedScene 实例化完整节点树 Blueprint 实例保留 Actor 层级

4. 资源与对象关联

特性UnityGodotUnreal Engine 4
资源引用方式 直接拖拽到 Inspector 面板 资源路径引用或拖拽到属性面板 通过 Content Browser 拖拽关联
对象与资源分离 GameObject 是实例,Prefab 是模板 节点实例与 PackedScene 模板分离 Actor 实例与 Blueprint/Class 分离
实例修改 实例可覆盖 Prefab 属性(Override) 实例可独立修改,不影响模板 实例可修改,支持 "Revert to Class Defaults"
资源依赖管理 自动管理,可通过 AssetDatabase 查看 资源依赖可见,支持手动清理 依赖关系复杂,需通过 Reference Viewer 查看

5. 特殊机制与差异点

特性UnityGodotUnreal 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 添加不同组件实现功能组合。
  1. 在场景中创建一个 3D Object > Cube(自动包含 Transform 组件)
  2. 为 Cube 添加 Rigidbody 组件(处理物理碰撞和移动)
  3. 为 Cube 添加 Box Collider 组件(默认已添加,提供碰撞体积)
  4. 将上述 PlayerController 脚本挂载到 Cube 上

2. Godot 实现方式

Godot 采用「节点树」结构,通过组合不同类型节点实现功能,脚本直接作为节点的一部分。
  1. 创建根节点 RigidBody3D(自带物理特性)
  2. 向其添加子节点 MeshInstance3D(用于渲染方块):
    • 在 MeshInstance3D 的 Mesh 属性中选择 BoxMesh
  3. 向 RigidBody3D 添加子节点 CollisionShape3D(提供碰撞体积):
    • 在 CollisionShape3D 的 Shape 属性中选择 BoxShape3D
  4. 将上述 PlayerController.gd 脚本挂载到根节点 RigidBody3D 上

3. Unreal Engine 4 实现方式

UE4 采用「Actor + 组件」模式,通过蓝图或 C++ 实现逻辑,组件依附于 Actor。
    1. 创建一个新的 C++ 类 APlayerCube,继承自 AActor
    2. 在构造函数中添加三个核心组件:
      • UBoxComponent:作为根组件,处理碰撞
      • UStaticMeshComponent:渲染方块(使用引擎自带 Cube 模型)
      • 启用物理模拟(SetSimulatePhysics(true)
    3. 在 Project Settings > Input 中设置输入轴:
      • "MoveForward"(W/S 或上下箭头)
      • "MoveRight"(A/D 或左右箭头)
    4. 将 APlayerCube 拖入场景,或通过蓝图实例化

总结

  • Unity:采用「空对象 + 组件」模式,灵活性高,适合快速迭代,生态成熟但层级依赖 Transform 可能导致性能开销。
  • Godot:基于「节点树」设计,节点即功能单元,层级关系直观,2D/3D 分离清晰,适合中小型项目和独立开发者。
  • UE4:以「Actor+Component」为核心,蓝图系统强大,层级管理复杂但功能全面,适合大型 3A 项目,对性能和细节控制更精细。
posted @ 2025-09-01 01:13  JeasonBoy  阅读(117)  评论(0)    收藏  举报