こちらの記事は、Unreal Engine (UE) Advent Calendar 2024 シリーズ4の21日目の記事です。
はじめに
複数人で開発しているときに、ブループリントの変更が衝突して、マージ方法に悩んだ方は多いかと思います。
通常はなるべく同時に編集しないようにするなどの回避策をとるかと思うのですが、
ある程度自動でマージできないかと考え、実験してみたので共有します。
この記事では、ざっくりとどういう事を行ったのか概要だけ記載しますので、詳細は GitHub に上げているプロジェクトを参照してください。
一応、差分ツールは公式で用意されていますが、差分を確認しつつ手動でコピペするなどの対応になるかと思います。
https://logicalbeat.jp/blog/5290/
このツールで、競合している個所をピックアップし(プロパティ単位など細かい粒度で)、どちらを採用するかの選択まで行えたら完璧なんですが......
注意点
今回の内容は実験的なものですので、実際のプロジェクトで使用しようとするとまだまだ課題が多いと思います。
それにより、データが破損したりしても責任はとれないので、参考程度に留めておいてください。
ネット上に情報が少ない機能を利用していることもあって、安定性に不安が残ります......
プロジェクト
※確認にはビルドが必要になります。
環境
エンジンバージョン : 5.5.1
今回やった事 (概要)
Base, Mine, Other の 3 つの BP に対して下記の要素ごとにマージを実行します
- コンポーネント
- SceneComponent が追加されていた場合、末尾への追加のみ対応
- 変数
- 関数
- イベントグラフ
- プロパティのデフォルト値
Mine, Other をそれぞれ Base と比較し、片方のみ変更していた場合はそちらを採用します。
両方で変更されていた場合コンフリクトと判断し、ログに出力して Base の内容から変更されません。
ただし、両方の変更が同じ場合は変更が反映されます。(どちらを採用しても同じなので、とりあえず Mine を採用)
プロジェクト確認方法
上記で共有した、GitHub からプロジェクトを落としたら、
BlueprintMergeTool というフォルダがあるのでその中の、
EUB_MergeTool を右クリックし、Editor Utility Blueprint を実行してください。
すると、BP_Merged という BP が生成されるので、こちらがマージ結果となります。
結果
マージ前
マージ後
画像からだと分かりにくいですが、設定されている StaticMesh などプロパティを含めてマージされていることが分かります。(Mine と、Other のうち片方でのみ変更されている場合)
Base にのみ存在する BaseFunc (関数) はマージ結果からは削除されています。
ぜひ GitHub から落として色々試してみてください。
(複雑な BP をマージしようとするとすぐバグりそうですが......)
今後について
現状は実験のため、最低限の機能にとどまっていますが、機能の拡張について下記のようなものが考えられると思います。(実装するかは別として)
- コンフリクトした際に、どちらを採用するかを選択できるようにする
- UI が欲しい......
- 関数単位にとどまらず、関数内の各ノードのプロパティ単位でマージできるようにする
- 現状は、同じ関数を変更するとコンフリクト扱いになるが、プロパティの変更箇所が被っていなければマージできるようにする
- ノード間の接続なども認識してマージできればいいが、大変そう......
- バージョン管理ツールと連携して、BP のファイルが競合していた場合にマージを実行できるようにする
- 実際のプロジェクトで運用するためには必須の機能かと思います
- 変数、関数などの並び順を考慮した実装にする
- 現状は並び順が意図せず変わってしまうケースあり
まとめ
今回は、BP の自動マージについて実験してみました。
プロパティ単位や、関数単位などでマージできるので、この機能を発展させていけば、
他の人が作業中のファイルを触りたい時に、小規模の変更であればローカルで先に変更しておき、他の人の作業がサブミットされた後に自動マージするなど、ワークフローの選択肢が増えるのではないかと思いました。
今回共有したプロジェクトは、
BP のマージに限らず、BP 内の変数や関数をコードから編集する方法について色々調べながら実装していったので、(主にエンジンコード内)
何か参考になる箇所があれば幸いです。
また、他にこういうやり方があるよーなど、知見がある方はアドバイスを頂けると嬉しいです!
(時間とやる気があれば、実際のコードの説明も追記しておきます......)