FURYU Tech Blog - フリュー株式会社

フリュー株式会社の開発者が技術情報を発信するブログです。

Unityファイルのコンフリクト発生を抑えるための戦いの記録~Prefabに祈りを込めて~

この記事は フリュー Advent Calendar 2024 の17日目の記事になります。


フリューでプリントシール機の開発をしている高松です。
以前に以下の記事を執筆いたしました。

tech.furyu.jp

上記記事では、落書き画面には大量のオブジェクトが存在するため
どこから手をつけていいかも含めてハードルが高く、導入としてワークショップを実施したという話をいたしました。

本記事では、別の視点で、大量のオブジェクトが存在する落書き画面というSceneを
複数人で開発する際に起きた問題と、どのように対策を行ったかについて書いていきます。

前提 ~ 開発の流れについて ~


落書き画面のデータ(画像や、ソースコードなど)はGitを用いて管理しています。
作業発生時は担当者が作業用ブランチを作成し、実装が完了したらプルリクエストを発行。
レビューが完了したら本流のブランチにマージをする流れとなっています。

問題① ~とにかくUnityファイルがコンフリクトする!~


落書き画面にはオブジェクトが多く、メイクやペンなど様々なパレットが含まれています。
よって、開発の分担として、ペンパレットはAさん担当、
メイクカテゴリのリップタブはBさん担当、
BGMスライダーなどはCさん担当のように並行で1画面を触るパターンが多いです。

タスクの分担

ただし、すべてのUIはUnityの1つのSceneに配置しているため、
なにも考えずに並行で作業を進めると、 Scene.unityがいとも簡単にコンフリクトしてしまいます。

コンフリクトの様子

コードのコンフリクトではないため、解決も難しく、
一度自分のを取り消し相手側の変更をマージしてから再度やり直すなど
コンフリクト解決に多くの工数が発生します。

対策① ~Prefab化しSceneに置く~


落書き画面に左右同時操作機能を導入していく際に必ず通るアクションではありましたが、
第1のステップとして、左右にあるUIたちを1つのPrefabとして作成し、Sceneに2つ並べて配置するようにしました。
また、上記Prefab内にも数多くのUIが存在するため細かくPrefab化していきました。

BGM調整コントロールなど、Scene上に1つしかないものについてはScene.unityへの編集を行い、
左右にあるUIについてはPrefabへの編集とすることで、編集対象ファイルの分散を行いました。

Prefabを1つ作成しSceneに2つ配置

問題② ~ 左右でUI配置が違う~


ただし、上記図のENDボタンなどのように、左右で機能自体は同じものの、配置が異なるものがいくつかあります。
結果、どちらかの設定はPrefabに登録できないため、Scene.unityに設定を書きこまなければならず、 コンフリクトの発生を抑えるには、さらなる改善が必要となりました。

対策②-1 ~Prefab Variant を活用する~


Unityの機能について調べたところ、Prefab Variantのしくみを発見しました。
簡単にいうと、ベースとなるPrefabを継承した派生オブジェクトのようなイメージです。

どういったものかの詳細は以下の公式ドキュメントをご参照ください!
公式ドキュメント: https://docs.unity3d.com/ja/2023.2/Manual/PrefabVariants.html

ベースからの差分をPrefab Variantに記録できるため左右でUIに差分があっても、Scene.unityへの設定書き込みをしなくてもよくなりました。
プリの落書き画面では、左側のUIをベースのPrefabとし、右側のUIをPrefab Variantにしています。

Prefab Variantを使用

対策②-2 ~実装時のルール周知~


構成だけ工夫をしても、開発者はUnity Editorにて自由に設定ができるため、 コンフリクトしないためのアクションをみんなが意識をしなければ、発生を抑えることはできません。

よって、新メンバー向けの説明資料にて、 以下のように編集していくことをルールとして記載し、伝えるようにしました。 また、レビューでも気づける分には指摘をするようにしました。

メンバーへのレクチャー用資料抜粋

問題③ ~上記対策を経た今でも問題は残っているよというお話~


以上の対策を行い、コンフリクトの発生を抑える取り組みを行いました。 とはいえ、コンフリクト自体をゼロにするのは不可能なので、ある程度の発生は仕方ないと考えています。 (もちろん、なにか効果がありそうなものを見つけられたら随時取り入れていきたいです!)

それ以外に Prefabを多用しているが故か発生している課題と現状の対処について紹介して本記事は終わろうと思います。

~ヒエラルキー順が途中で狂う~

たまにですが、Prefab側とPrefabを配置しているScene側でヒエラルキーの並びが変わることがあります。 これはUnity Editorでの解消が難しく、Scene.unityをテキストエディタで開き、RootOrderの設定を消すといった方法で無理やり解決しています。 おそらく使用側でオブジェクト名を変更すると起きやすいのではないかと考えていますが原因はまだわかっていません…。

階層が変わってしまう

~自動配置系のスクリプト使用時に意図しない値がPrefab配置側に書きこまれる~

たとえば、Prefab側で任意のオブジェクトに Vertical Layout Groupをつけて 自動整列をさせます。 その後そのコンポーネントを外すと、そのPrefabを配置しているPrefabやScene.unityに対して 自動整列させていたオブジェクトに対してRectTransformの値が狂ってしまいます。 この現象が発生した際は、Prefabの差分を一括で見れる機能を用いて、1つ1つリバートしています。

Prefabの設定値が上書きされる

おわりに


1画面を複数人で並行して開発するための工夫を紹介しました! なにかの参考になりましたら幸いです。 さらなる快適なソフトウェア開発をすすめられるよう、効果がある機能やプロセスなどを見つけ次第、取り入れられたらなと考えています。

閲覧いただきありがとうございました!