问题:
1.多人提交UE项目,遇到主关卡冲突怎么解决
2.遇到蓝图事件图表冲突怎么解决
UE 的 .umap 和 .uasset 都是二进制文件,SVN不能自动合并。处理原则统一为:
先备份自己的版本,再接受远程版本,最后在UE编辑器里手动补回自己的修改。
速通版:
1.成员各自创建子关卡->放置所需Actor在子关卡->子关卡添加到主关卡,并修改流送方式为always loaded->提交之前子关卡也添加到SVN版本管理中;
2.保留更新的蓝图,UE同时打开新蓝图和旧蓝图,人工对比蓝图区别,可以把旧的添加的事件复制到新蓝图。
一、拉取时遇到主关卡冲突
假设A已提交主关卡,B本地也向主关卡放入了Actor。
处理流程
-
不要立即选择
Resolve using theirs。 -
关闭 Unreal Editor。
-
备份B的本地主关卡
.umap。 -
最好在UE中复制为临时关卡:
CesiumMainMap_B_Backup.umap
- 在备份关卡中选中B新增的全部Actor:
World Outliner(世界大纲)
→ 选中Actor
→ Ctrl+C
- 关闭UE,在SVN冲突中接受远程主关卡:
Resolve using theirs
-
打开A更新后的正式主关卡。
-
从B的备份关卡复制Actor,粘贴到正式主关卡:
备份关卡中 Ctrl+C
→ 正式关卡中 Ctrl+V
-
检查:
-
Transform(变换); -
Actor之间的引用;
-
父子关系;
-
蓝图公开变量;
-
Level Blueprint(关卡蓝图)引用; -
Data Layer(数据层); -
Sequencer绑定。
-
-
保存、运行测试。
-
再次执行
SVN Update。 -
没有新冲突后提交合并完成的主关卡。
Actor较多时
可以把自己的Actor放入独立子关卡:
Content/QiY/Maps/QiY_Measurement.umap
主关卡通过:
Window(窗口)
→ Levels(关卡)
→ Add Existing(添加现有关卡)
→ QiY_Measurement
→ Always Loaded(始终加载)
以后你主要提交自己的子关卡,减少多人修改主关卡。
第一次建立子关卡关系时,仍需要提交一次主关卡,因为主关卡需要保存对子关卡的引用。
二、拉取时遇到蓝图事件图表冲突
蓝图事件图表存储在 .uasset 中,也不能由SVN自动合并节点。
处理流程
-
不要直接覆盖本地蓝图。
-
关闭UE。
-
将B的本地
.uasset复制到项目外备份。 -
如果蓝图当前还能正常打开,最好先在
Content Browser(内容浏览器)中复制一份:
BP_ControlPC
→ Duplicate(复制)
→ BP_ControlPC_B_Backup
- 打开备份蓝图,在
Event Graph(事件图表)中框选B新增的完整节点:
Ctrl+C
-
将节点粘贴到
.txt文件,额外保存一份蓝图节点文本。 -
单独记录不能靠节点复制完整保留的内容:
-
新增变量及类型;
-
变量默认值;
-
新增函数;
-
自定义事件;
-
Event Dispatcher;
-
Blueprint Interface;
-
新增组件;
-
Class Defaults设置。
-
-
关闭UE,对正式蓝图选择:
Resolve using theirs
-
获取并保留A的远程蓝图。
-
使用蓝图比较工具查看差异:
右键蓝图
→ Source Control(源代码管理)
→ Diff Against Depot(与仓库版本比较)
-
打开B的备份蓝图和A的正式蓝图。
-
将B新增的节点复制到A的正式蓝图。
-
手动创建缺少的变量、函数、组件和事件分发器。
-
重新连接执行线和数据线。
-
执行:
Refresh All Nodes(刷新全部节点)
→ Compile(编译)
→ Save(保存)
- 运行测试后,再次
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_ControlPC、MainUI和主关卡。 -
修改重要二进制资产前先使用
SVN Lock/Get Lock。 -
修改完成后及时提交并
Release Lock。 -
每次开始工作先执行
SVN Update。
一句话总结:
关卡冲突:
备份本地关卡 → 接受远程关卡 → 从备份复制Actor回来
蓝图冲突:
备份本地蓝图和节点文本 → 接受远程蓝图 → 手动补回节点、变量和函数