はかせのラボ

私の頭の中を書いていく雑記ブログです

ゲーム開発 ゲームエンジン×Gitのワークフローの一例

あいさつ

どうも、はかせです。

最近チーム開発をする機会がかなり増えました。

ついこないだJPHACKSに参加し、
今もUnityとUE4のプロジェクトに参加させていただいております。
(ありがとうございますm(__)m)

学校は学校でチームを組み卒業研究を行っております。

チーム開発をやっていくと必ずぶつかる壁があります。
「マージどうする?」
「データの共有どうする?」

この辺ですね。

そして大抵ちょっとした有識者であれば
「Gitで管理すれば解決できるよ」
と言うでしょう。

自分もそのちょっとした有識者と同じ提案をすることが多かったです。

ですが、ただGit使おうぜでは解決できない問題なんかも
ありました。

今回はそういった話をしながら
ゲームエンジン×Gitのワークフローとしては
こんなんも有りまっせという話をしていきます。

Git使おうぜで解決できない問題

Gitを使えばコードのバージョン管理やらマージなんかが
自動でうまいことになることを
我々ちょっとした有識者は知っています。

ただGitでうまいことになるのは
あくまで扱うデータがテキストデータだった場合です。
ゲームエンジンでよく扱うアセットなんかは
テキストデータではなくバイナリデータです。
バイナリデータはうまいことなりません。
Gitはバイナリ苦手なので。

まぁ完全に扱えないことは無いんですけどね。
(LFS使うとか)
ただGitの根本性質的にやはり向きません。

うまいこと管理ができるようになったとしても
プッシュやプル、クローンなんかにかかる時間が
バカほど膨れ上がります。
それこそ1時間2時間かかってもプルが終わらないとか。

そうなると開発のイテレーションが激重になり
開発がなかなか進まなくなります。

他にもGitHubを使っている場合は
リポジトリや1ファイルのサイズ制限にかかることもあります。

そうなるともはやそれは問題であり、
問題解決のために導入したGitの影響で
別の問題を呼び込んでしまうという
ある意味本末転倒な事態になります。

テキストデータとバイナリデータを別で管理する

さてでは問題を解決していきましょう。

今回の問題はバイナリデータをGitで管理すると
開発イテレーションが重くなったり、
GitHubの制限なんかに引っかかってしまうというものでした。

究極論この問題の原因はバイナリデータと言う
Gitと相性の悪いデータをGitで管理しようとしていることです。

ならば理屈は単純で
Gitでバイナリデータを扱わなければいいだけです。

バイナリデータってのはさっきも書きましたが
要はアセットです。

アセットそのものを都度バージョン管理する必要が
果たしてあるでしょうか?

おそらくキャラクターのモデルなら
アーティストさんが作ったものをそのまま使うはずです。
ピンナップ画像なんかもデザイナーさんが描いたものを
そのまま使うでしょう。

何か不具合等があったとしても
それをGitで管理するところ、
要はプログラマーやエンジンで対応するかと言ったら
答えはおそらくNoでしょう。
大抵がアーティストさんやデザイナーさんに
修正を依頼して修正済みのデータを新しくもらうはずです。

そうなった時以前の不具合があるモデルや画像は不要になります。
復元はしないでしょう。
(まぁ少なくともプロジェクトが終わるまではどっかでバックアップ取ってると思いますが)

とどのつまりバイナリデータであるアセットを
Gitで管理する必要性自体存在しないのです。

管理しなくていいのならば管理しなければいい。
必要なデータがあるならば必要な人が
ローカルの環境に入れればいいのです。
別に全てのアセットが全ての端末に必要ってわけでもないでしょうし。

個人開発ならばそれこそドライブとかにアセット置いておいて
必要に応じて落としてくればいいだけですし。

テキストデータだけならばGitの得意分野なので
プッシュもプルもサクサクできますし、
変更差分を追うのも自動マージもほぼ100%うまく行きます。
(Gitをちゃんと扱えれば)

今回の仕組みを図にしてみるとこんな感じです。
f:id:hakase0274:20191031181402p:plain

この形にすれば
テキストデータはGitで
アセットは外部のストレージなどで
それぞれ管理できます。

あとがき

今回はゲームエンジン×Gitのワークフロー一例ということで
テキストデータとバイナリデータをそれぞれ別で管理する方法でした。

確かに管理する場所が増えるんで
最初はちょいとめんどくささを感じるかもですが
開発後半のプルの遅さとかに比べたら全然ましです。

今回はあくまでドライブでアセット管理としましたが、
別にローカルにファイルサーバ等があるならば
それを使ってもらって構いません。

今回の仕組みはあくまでテキストはGitで、
それ以外のバイナリはどこかストレージに置いて適宜使うってだけですので
割とどの環境でも作れると思います。

結局銀の弾丸は無く、
適材適所でツールを使ってそれを組み合わせるのが
今では最良なのではないかと思っております。

いつかはテキストもバイナリも全て等しく管理できるような
仕組みやツールが生まれるといいかもしれませんね。

今回の記事が良ければスターやコメント等よろしくお願いします。
それでは今回はこの辺でノシ