Level
UE中的Level(关卡)和Unity中的Scene(场景)在概念和用途上非常相似,都是用来组织和管理3D环境的基本单位。让我为您详细对比一下:
相似之处:
- 它们都是游戏世界的容器,可以包含游戏对象、光照、地形等元素
- 都支持场景/关卡的切换和加载
- 都可以用来划分游戏内容,比如不同关卡或者不同区域
主要区别:
- 命名习惯不同 - UE使用"Level"这个术语,而Unity用"Scene"
- Level的组织方式 - UE支持多Level同时加载和显示(比如通过Level Streaming),而Unity的Scene虽然也支持叠加模式,但没有UE的层级管理那么灵活
- 子关卡系统 - UE有特殊的子关卡(Sub-Level)概念,可以更好地组织大型场景
Actor
UE中的Actor(演员)确实和Unity中的GameObject(游戏对象)有很多相似之处,它们都是场景中可放置对象的基类。不过还是有一些细微的区别:
相似之处:
- 都是场景中所有对象的基础类
- 都可以附加组件/组件(Unity用Component,UE用Component)
- 都支持父子层级关系
- 都有位置、旋转、缩放等变换属性
主要区别:
- Actor有更多专门的子类 - 比如Pawn(可被控制的角色)、Character(角色)等,而GameObject更倾向于通过组件来实现功能
- 组件管理方式不同 - UE中Actor必须有一个Root Component(根组件),其他组件都依附于此,而Unity的GameObject可以自由添加多个并列的Component
- 网络同步处理 - UE的Actor内置了网络复制功能,而Unity需要另外添加组件实现
- 生命周期 - UE的Actor有BeginPlay、Tick等生命周期函数,而Unity使用Start、Update等
从编程角度看,如果您习惯了Unity的开发方式,可以这样理解转换:
- Unity的 GameObject.Find() → UE的 GetActorOfClass()
- Unity的 Instantiate() → UE的 SpawnActor()
- Unity的 transform组件 → UE的 RootComponent
说白了,Actor和Unity中的Empty Gameobject差不多,就是一个空的物体然后可以放很多的东西
Mobility
UE中的Mobility(可移动性)是用来定义场景中物体或光源的移动属性的设置,它有三种状态:
- Static(静态)
- 完全不能在游戏运行时移动或改变
- 性能最好,因为引擎可以预先计算光照等效果
- 适用于建筑物、岩石等永远不会移动的物体
- 被烘焙进光照贴图中
- Stationary(固定)
- 可以改变一些属性(比如光源的颜色和强度)
- 但不能改变位置和旋转
- 是静态和可移动之间的折中选择
- 适用于需要改变强度的光源,如日光系统
- Movable(可移动)
- 可以完全自由移动和改变
- 性能消耗最大,因为需要实时计算
- 适用于角色、车辆等需要移动的物体
- 使用动态光照
从Unity的角度来理解:
- Static类似于Unity中勾选了Static选项的物体
- Movable类似于Unity中没有勾选Static的普通物体
- Stationary在Unity中没有直接对应,但概念类似于Mixed lighting模式
Physics Asse
在UE中确实也有类似Unity的Rigidbody的功能,它叫做Physics Asset(物理资产),主要通过以下几种方式实现:
- 物理模拟组件:
- Physics Constraint Component (物理约束组件)
- Physics Handle Component (物理句柄组件)
- Physics Spring Component (物理弹簧组件)
- 主要设置方式:
- Simulate Physics (模拟物理) - 在Mesh Component中启用
- 可以设置质量、是否受重力影响等物理属性
- 可以通过Physical Material设置摩擦力、弹性等
从Unity转过来可以这样理解:
- Unity的Rigidbody → UE的Simulate Physics
- Unity的Collider → UE的Collision组件
- Unity的Physics Material → UE的Physical Material
Geometry和Shapes的区别
UE中的Geometry和Shapes都是用于创建基础3D形状的,但它们的用途和特点不同:
Geometry(几何体):
- 用于可见的视觉展示
- 实际会被渲染出来
- 包含完整的网格数据
- 常用于临时的视觉原型或简单的游戏物体
- 默认带有碰撞体积
Shapes(形状):
- 主要用于碰撞检测
- 默认是不可见的
- 比Geometry更轻量
- 专门用作触发器或碰撞体积
- 计算性能更好
举个例子:
- 如果你需要一个可见的立方体作为游戏中的箱子 → 使用Cube Geometry
- 如果你只需要一个不可见的碰撞区域来触发事件 → 使用Box Shape
Shapes更像是Unity中的Collider组件,而Geometry更像是带有Mesh Filter和Mesh Renderer的基础3D物体。
虚幻引擎的标准目录结构
虚幻引擎项目的标准目录结构:
Config/
- 包含引擎和游戏的配置文件
- 存放输入设置、引擎设置等
Content/
- 游戏的主要内容文件夹
- 包含所有资源(模型、材质、蓝图等)
- 建议在Content下建立良好的子文件夹结构,如:
- Blueprints/ (蓝图类)
- Maps/ (关卡文件)
- Materials/ (材质)
- Meshes/ (3D模型)
- Textures/ (贴图)
Source/
- 包含所有C++源代码
- 通常包含两个子文件夹:
- ProjectName/ (项目主要代码)
- ProjectNameEditor/ (编辑器相关代码)
Saved/
- 临时生成的文件
- 包含日志、配置缓存等
- 通常不需要提交到版本控制
Intermediate/
- 中间文件目录
- 存放编译过程的临时文件
- 不需要提交到版本控制
Binaries/
- 编译后的二进制文件
- 包含.exe和.dll文件
- 通常不需要提交到版本控制
.uproject文件
- 项目定义文件
- 包含项目的基本信息和设置
蓝图中的变量
主要功能:
- 基础设置部分:
- 变量命名(Variable Name): 当前设为"delay Time",用于在蓝图中引用这个变量
- 变量类型: 选择为浮点数(float),适合存储带小数点的数值
- 可编辑实例: 允许在对象实例上修改该变量的值
- 私有/公开设置: 控制变量的访问权限
- 类别(Category): 可以对变量进行分类管理,方便在大型项目中组织变量
- 高级设置中的CPF标记:
- CPF_Edit: 允许在编辑器中修改该变量
- CPF_BlueprintVisible: 使该变量在蓝图编辑器中可见和可访问
- CPF_ZeroConstructor: 创建变量时使用零初始化
- CPF_DisableEditOnInstance: 禁止在实例上修改这个变量
- CPF_IsPlainOldData: 标记为简单数据类型,可以优化性能
- CPF_NoDestructor: 不需要析构函数,用于简单类型
- CPF_HasGetValueTypeHash: 支持哈希值计算,用于容器等数据结构
- 配置变量(Config Variable):
- 允许变量值存储在配置文件中,这样可以在不重新编译的情况下修改值
- 临时(Transient):
- 标记变量为临时的,意味着该变量不会被保存或加载
- 通常用于运行时临时数据,不需要持久化存储
- 保存游戏(SaveGame):
- 标记该变量可以在保存游戏时被序列化和存储
- 当玩家加载存档时,这些变量的值会被恢复
- 高级显示(Advanced Display):
- 将变量在属性面板中移到"高级"分类下
- 用于隐藏不常用的设置,使界面更整洁
- 已废弃(Deprecated):
- 标记变量为已废弃
- 提醒其他开发者这个变量将在未来版本中移除
- 通常会在废弃消息中说明替代方案
- 废弃消息(Deprecation Message):
- 当变量被标记为已废弃时,可以在这里输入提示信息
- 解释为什么废弃以及应该使用什么替代方案
- 已定义的属性标记: 这部分显示了所有应用到这个变量的CPF(Core Property Flags)标记,是一个只读的列表,显示当前变量的所有属性标记。
让我用具体的例子解释SaveGame这个选项:
想象你在玩一个RPG游戏:
- 你的角色等级是50级
- 背包里有100金币
- 当前在森林地图
如果这些变量设置了SaveGame标记:
- 当你点击"保存游戏"时,这些数据会被写入存档文件
- 当你下次加载游戏时,这些数据会从存档文件中读取出来
- 你的角色会恢复到:
- 50级
- 100金币
- 森林地图位置
如果没有设置SaveGame标记:
- 这些数据不会被保存到存档文件中
- 加载游戏时会使用变量的默认值
- 比如可能回到:
- 1级(默认等级)
- 0金币(默认金币)
- 起始地图(默认位置)
所以SaveGame标记非常重要,它决定了哪些数据需要在玩家存档中保留。通常用于:
- 角色属性(等级、生命值、经验值等)
- 游戏进度(已完成的任务、解锁的成就等)
- 玩家资源(金币、道具、装备等)
- 游戏状态(当前位置、剧情阶段等)