UE项目SVN提交冲突解决记录:主关卡冲突和蓝图事件图表冲突

问题:

1.多人提交UE项目,遇到主关卡冲突怎么解决

2.遇到蓝图事件图表冲突怎么解决

UE 的 .umap.uasset 都是二进制文件,SVN不能自动合并。处理原则统一为:

先备份自己的版本,再接受远程版本,最后在UE编辑器里手动补回自己的修改。

速通版:

1.成员各自创建子关卡->放置所需Actor在子关卡->子关卡添加到主关卡,并修改流送方式为always loaded->提交之前子关卡也添加到SVN版本管理中;

2.保留更新的蓝图,UE同时打开新蓝图和旧蓝图,人工对比蓝图区别,可以把旧的添加的事件复制到新蓝图。

一、拉取时遇到主关卡冲突

假设A已提交主关卡,B本地也向主关卡放入了Actor。

处理流程

  1. 不要立即选择 Resolve using theirs

  2. 关闭 Unreal Editor。

  3. 备份B的本地主关卡 .umap

  4. 最好在UE中复制为临时关卡:

复制代码
CesiumMainMap_B_Backup.umap
  1. 在备份关卡中选中B新增的全部Actor:
复制代码
World Outliner(世界大纲)
→ 选中Actor
→ Ctrl+C
  1. 关闭UE,在SVN冲突中接受远程主关卡:
复制代码
Resolve using theirs
  1. 打开A更新后的正式主关卡。

  2. 从B的备份关卡复制Actor,粘贴到正式主关卡:

复制代码
备份关卡中 Ctrl+C
→ 正式关卡中 Ctrl+V
  1. 检查:

    • Transform(变换)

    • Actor之间的引用;

    • 父子关系;

    • 蓝图公开变量;

    • Level Blueprint(关卡蓝图)引用;

    • Data Layer(数据层)

    • Sequencer绑定。

  2. 保存、运行测试。

  3. 再次执行 SVN Update

  4. 没有新冲突后提交合并完成的主关卡。

Actor较多时

可以把自己的Actor放入独立子关卡:

复制代码
Content/QiY/Maps/QiY_Measurement.umap

主关卡通过:

复制代码
Window(窗口)
→ Levels(关卡)
→ Add Existing(添加现有关卡)
→ QiY_Measurement
→ Always Loaded(始终加载)

以后你主要提交自己的子关卡,减少多人修改主关卡。

第一次建立子关卡关系时,仍需要提交一次主关卡,因为主关卡需要保存对子关卡的引用。


二、拉取时遇到蓝图事件图表冲突

蓝图事件图表存储在 .uasset 中,也不能由SVN自动合并节点。

处理流程

  1. 不要直接覆盖本地蓝图。

  2. 关闭UE。

  3. 将B的本地 .uasset 复制到项目外备份。

  4. 如果蓝图当前还能正常打开,最好先在 Content Browser(内容浏览器) 中复制一份:

复制代码
BP_ControlPC
→ Duplicate(复制)
→ BP_ControlPC_B_Backup
  1. 打开备份蓝图,在 Event Graph(事件图表) 中框选B新增的完整节点:
复制代码
Ctrl+C
  1. 将节点粘贴到 .txt 文件,额外保存一份蓝图节点文本。

  2. 单独记录不能靠节点复制完整保留的内容:

    • 新增变量及类型;

    • 变量默认值;

    • 新增函数;

    • 自定义事件;

    • Event Dispatcher;

    • Blueprint Interface;

    • 新增组件;

    • Class Defaults设置。

  3. 关闭UE,对正式蓝图选择:

复制代码
Resolve using theirs
  1. 获取并保留A的远程蓝图。

  2. 使用蓝图比较工具查看差异:

复制代码
右键蓝图
→ Source Control(源代码管理)
→ Diff Against Depot(与仓库版本比较)
  1. 打开B的备份蓝图和A的正式蓝图。

  2. 将B新增的节点复制到A的正式蓝图。

  3. 手动创建缺少的变量、函数、组件和事件分发器。

  4. 重新连接执行线和数据线。

  5. 执行:

复制代码
Refresh All Nodes(刷新全部节点)
→ Compile(编译)
→ Save(保存)
  1. 运行测试后,再次 SVN Update,最后提交。

三、双方修改同一区域时

不能机械地把两套节点直接粘贴到一起,要人工重新组织。

例如双方都修改了 Event BeginPlay(事件开始运行)

复制代码
A:初始化WebRouter
B:初始化Measurement

不要保留两套相互独立的初始化入口。可以整理成:

复制代码
Event BeginPlay
→ Sequence
    Then 0 → InitializeWebRouter
    Then 1 → InitializeMeasurement

更推荐封装为函数:

复制代码
Event BeginPlay
→ InitializeWebRouter
→ InitializeMeasurement

如果双方修改了相同的 Branch(分支)、变量类型或默认值,需要根据最终业务要求人工决定,不存在可靠的自动合并方法。

四、不要进行的操作

不要:

  • 使用文本工具编辑 .uasset.umap

  • 对二进制资产执行自动内容合并;

  • 未备份就选择 Resolve using theirs

  • 直接选择 Resolve using mine 覆盖他人提交;

  • 对整个项目执行 Revert

  • 粘贴节点后不编译、不测试就提交;

  • 同时保留重复的输入事件、按钮事件或初始化逻辑。

五、长期避免冲突

推荐采取以下协作方式:

  • 主关卡只由指定人员维护。

  • 每个人使用独立子关卡。

  • 大型蓝图拆成多个独立Actor、Actor Component或Widget。

  • 避免多人同时修改 BP_ControlPCMainUI 和主关卡。

  • 修改重要二进制资产前先使用 SVN Lock/Get Lock

  • 修改完成后及时提交并 Release Lock

  • 每次开始工作先执行 SVN Update

一句话总结:

复制代码
关卡冲突:
备份本地关卡 → 接受远程关卡 → 从备份复制Actor回来
​
蓝图冲突:
备份本地蓝图和节点文本 → 接受远程蓝图 → 手动补回节点、变量和函数
相关推荐
颜早早8 个月前
Unreal Engine MobileFSR插件实现机制分析
图形渲染·gpu·unreal engine 5·graphic
kissSimple2 年前
给UE5优化一丢丢编辑器性能
ue5·虚幻引擎·unreal engine·unreal engine 5
kissSimple2 年前
UE行为树编辑器图文笔记
笔记·ue5·编辑器·unreal engine·unreal engine 5
暂时先用这个名字2 年前
UE5学习日记——制作多语言版本游戏,同时初步学习UI制作、多语言化、控制器配置、独立进程测试、打包配置和快速批量翻译等
学习·游戏·ue5·虚幻引擎·ue·多语言·unreal engine 5
暂时先用这个名字2 年前
UE5学习日记——蓝图节点前缀关键字整理
学习·游戏·ue5·节点·蓝图·unreal engine 5·前缀
暂时先用这个名字2 年前
UE5制作一条底部挂着物体的悬垂的绳子
ue5·虚幻·cube·unreal engine 5·cable·constraint·虚幻5