ツールエンジニア・ビルドエンジニアに聞く 効率的な開発をかなえる「Cyllista Game Engine」の特長

前回の『「Cyllista Game Engine」開発レポート テクニカルディレクターが開発の進捗や設計のこだわりを語る』では、「Cyllista Game Engine」の開発を統括するテクニカルディレクターのジュンジに、現在の状況や開発への想いを聞きました。開発レポート第2弾となる今回は、ツールエンジニア・ビルドエンジニアに担当業務や開発現場の様子を、そして実際にそれらを利用して開発するエンジニアには使い勝手について聞きました。

「Cyllista Game Engine」ツールエンジニアカツヤ
gutenberg-examples
「Cyllista Game Engine」の構想段階よりツールエンジニア(※1)として開発に携わる。アーケードゲーム開発からキャリアがスタートし、長くゲーム開発に携わる業界歴約30年のベテラン。
「Cyllista Game Engine」ビルドエンジニア カズヤ
gutenberg-examples
ゲーム業界歴17年目。ゲームエンジン開発のグラフィックス担当を経てビルドエンジニア(※2)の業務にシフトしていき、現在は効率的な開発をサポートする役割を担う。
「Cyllista Game Engine」AIエンジニアタカヒラ
gutenberg-examples
2019年に新卒で入社し、「Cyllista Game Engine」開発チームに配属。ゲームエンジン側のAI開発・保守・運用と、ゲームタイトル側でそれらを使うNPC制作の両方を担当している。

※1 ツールエンジニア……開発チームが効率的で快適な作業環境を持つことを目指し、チームが必要とするツールやモジュールを開発・メンテナンスする役割を担う

※2 ビルドエンジニア……開発においてソースコードを正常にビルドし、安定した開発環境を提供にする役割を担う。ビルド環境のセットアップ、ビルドプロセスの自動化、エラーの解決、およびビルド速度の改善など、効率的な開発をサポートしている

ゼロから作るサイゲームスのゲームエンジン開発
関わろうと思った理由

それではまず、みなさんがサイゲームスに合流しようと思った理由について聞かせてください。まずはカツヤさん、お願いします。

gutenberg-examples
カツヤ
サイゲームスには、これからハイエンド向けAAAタイトルのゲームエンジンを開発するという記事を見かけたことがきっかけで興味を持ったんです。当時はいきなりハイエンド向けのエンジンを作ると聞き、思い切った挑戦だなと驚かされました。
通常、ゲームエンジンはタイトル開発のノウハウの積み重ねがあって作っていくものですが、「Cyllista Game Engine」の場合はゼロから作っていて、前提となる制約がない環境はエンジニアからしたら魅力的だなと。その後、年齢的にも高い目標で新しいことをゼロから始められる最後のチャンスかと思い、サイゲームスに合流しました。

カツヤさんが合流したときはゲームエンジンをこれから作っていこうとする段階だったそうですね。

gutenberg-examples
カツヤ
そうですね、私は初期のメンバーです。合流したときは「Cyllista Game Engine」専任のスタッフがテクニカルディレクターのジュンジさんを含めて約3名で、まだ最初の構想段階でした。合流してずっとツールエンジニアを担当しています。

ありがとうございます。それでは、次はカズヤさんお願いします。

gutenberg-examples
カズヤ
以前の職場ではゲームエンジン開発のグラフィックス部門を担当していましたが、プロジェクトの後半でCIツールのJenkins(※3)なども管理するようになり、だんだんビルドエンジニアリングにシフトしていきました。そのような折にサイゲームスでゼロからゲームエンジンを開発すると聞いて興味を持ち、合流しました。

※3 CI……継続的インテグレーション(Continuous integration)の略で、ソフトウェア開発において、コードの変更をメインの保管場所(リポジトリ)に頻繁に統合し、自動的にビルド・テストを行う手法。「Jenkins」は代表的なCIツールの一つ

合流後は実際どんな業務を行ったのでしょうか?

gutenberg-examples
カズヤ
エンジン開発を統括するジュンジさんが私の意向を理解してくださって、合流後は今後の拡張に耐えられるように構成を一新するところから始めました。当時はPC1台で運用していましたが、今は40台超で運用するに至っているのでやっておいてよかったなと思います。現在もチームからの要望を取り入れながらも自由に活動させてもらっています!

ありがとうございます。それでは、タカヒラさんお願いします。

gutenberg-examples
タカヒラ
私は19年の新卒として合流し、「Cyllista Game Engine」開発チームに配属されました。ゲームタイトル側とエンジン側、両方のAI開発に関わっています。私がチームに加わったときにはすでにAIモジュールの基本は出来ていたので、その保守と追加機能の実装、ゲームタイトル側でそれらを使うNPCなどのキャラクター制作を行っています。

最初はタイトル周りのところから始めて、後にエンジン開発のほうに関わるようになったのでしょうか?

gutenberg-examples
タカヒラ
いえ、どちらも合流当初から関わらせてもらいました。すでに開発されていたAIモジュールを使ってキャラクターを制作しているときにも、追加の機能が欲しいなと思った時や拡張したい時はエンジン側に変更を加えながら作っていました。
タイトル開発とエンジン開発がシームレスになっているので、作りながらフレームワークを掘り下げるという開発が可能です。そのあたりは、「Cyllista Game Engine」開発チームの良いところだと思いますね。

クラッシュしても問題なし!
「Cyllista Game Engine」のエディタ開発

「Cyllista Game Engine」開発において、エディタ(※4)はどのように開発しているのでしょうか?

gutenberg-examples
カツヤ
私はエディタ班のリードとして、「Cyllista Game Engine」のレベルエディタをはじめとする色々なエディタ周りの開発を行っています。
我々エディタ班がコアとなるエディタモジュール全般や、エディタ上に表示されるボタンやスライダーなどのGUI部品などを保守管理して、ビルドエンジニアやVFX、UIなど、それぞれの専門のチームが個別のエディタやGUIツールを作っているという感じです。エディタ班は現在、4名で業務にあたっています。

※4 エディタ……ゲームクリエイターやエンジン開発者がゲームの構成要素の作成、編集、管理をするソフトウェアツール。例えば、シーンの編集やアセットの管理などが可能

▲「Cyllista Game Engine」エディタのスクリーンショット

他のエンジンと比べて「Cyllista Game Engine」のエディタならではの特長はありますか?

gutenberg-examples
カツヤ
そうですね、有名なゲームエンジンのGUIツールではC#を使っていることが多いと思いますが、「Cyllista Game Engine」はGUIもPythonで実装しているので、試作開発が容易で生産性が高いと考えています。
もう一つの特長として、エディタとゲームのランタイム、その間を取り持つデータを保持しているサーバーの三つのプロセスが連携しています。それによって、エディタかゲームのランタイム(※5)、もしくはその両方がクラッシュしたとしても、サーバーが動作している限りデータは失われず、編集作業をすぐに再開できます。

※5 ゲームのランタイム……ゲームを動かすソフトウェア。プログラム自身とそれが動作するために必要なライブラリ群や環境を含んでいる

▲「Cyllista Game Engine」のエディタ、ゲームのランタイム、サーバ間のデータやりとりの概念図

ユーザーが作業を保存していなくても直前からやり直せるのですか?

gutenberg-examples
カツヤ
そうですね、例えば、マップにオブジェクトを配置している途中でエディタがクラッシュしてしまっても、エディタを起動し直せば最後の編集の状態から再開できます。エディタとゲームのランタイムがそれぞれデータを持っているのではなく、サーバーがデータを保持していて、編集の履歴はサーバー経由で双方に通知されているんです。
▲「Cyllista Game Engine」での地形編集の様子。編集の状態はすべてサーバーが保持しており、エディタとゲームのランタイムで同期している

エディタは適宜アップデートしているのでしょうか?

gutenberg-examples
カツヤ
はい、各開発班からの改善要望を常に受け付け、アップデートの最小要件、最低限の機能を早くリリースするように心掛けています。また、リリース後にもまたフィードバックをもらってすぐに改善、というイテレーションを素早く繰り返しています。「この日にリリースしよう」ではなく、毎日のように何度もリリースしています!

※6 イテレーション……「設計」「開発」「テスト」「改善」などの一連のサイクルを回すこと

すでにエディタのコアな部分は安定的に運用している印象ですが、将来を見据えた上で計画していることがあれば教えてください。

gutenberg-examples
カツヤ
エディタのコア部分はすでにゲームタイトルの制作ができるところまで来ていますが、エンジンを使うユーザー視点での使い勝手や応答性を改善していきたいですね。GUIもエンジニアが作ったデザインをそのまま運用しているので、もっとスタイリッシュなものにしようと考えています。
技術的なところでは、GUIツールのマウス操作などのユーザーが操作した場合のテストをすべてユニットテストでカバーするのは難しいのですが、そのあたりのテストをうまく自動化したいですね。

とにかく速いイテレーションを!
「Cyllista Game Engine」のビルド環境開発

カズヤさんはビルドエンジニアとして、自動ビルドやビルド体制の構築・保守管理が役割だと思います。「Cyllista Game Engine」のビルド環境の設計に際してはどのような思想で作ったのでしょうか?

gutenberg-examples
カズヤ
基本的には「Cyllista Game Engine」のエンジン、ゲームタイトルどちらの開発イテレーションも出来るだけ速く回すことが目標です。ゲームクリエイターが1日に何度も更新をし、いつでも最新のものを使えるようにビルド環境を整備しています。そのためには、Jenkinsが1日あたり何回更新・配信できるか、安定性を何回チェックできるのかが重要になります。今は1日あたりで大体約30バージョンビルドしていて、そのうち約15バージョンはテストをかけて安定バージョンとして配信できています。
▲1日のJenkinsジョブの可動状況。縦軸がJenkins PCの台数/横軸が時間を表している
gutenberg-examples
カズヤ
常に安定バージョンを使いたいというユーザーもいれば、安定していなくても最新機能を試したいというユーザーもいますので、エディタ更新用のツールで各ユーザーがバージョンを選択できるようにしています。プランナーとエンジニアが個別にやり取りをしていて、特定のプランナーだけが使う機能をエンジニアが実装してリリースすることもあるので、開発スタッフみんなが同じバージョンを使っていることはあまりないんです。

タイトル開発のニーズを踏まえたビルド環境になっているんですね。今後はどのようなアップデートを目指していますか?

gutenberg-examples
カズヤ
エンジニアにはもっと速くビルドを回して、もっとたくさん配信してほしいと言われますので、まずはJenkins PCの台数を増やしていかなければと考えています。また、そのような力技だけではなく、ネックになっている箇所の可視化をはじめ、各テストを最適化していくフェーズにも入りつつある感じです。
C++、Python合わせて、約4400ものテストメソッドを実行することになりますが、現状40分ほどかけて実行しているのを15分に短縮してほしいと言われています(笑)。

Jenkinsのジョブは各開発スタッフが発行するのですか?

gutenberg-examples
カズヤ
基本的には設定ファイルに基づいてJenkinsのジョブが自動的に作成されるようになっています。ですから、私以外のエンジニアはテスト項目を設定するだけで、ほとんどJenkinsを触っていません。実際のジョブの実行は私がすべて管理しています。

ということは、その点は現状カズヤさんの属人的な作業になっているのですか?

gutenberg-examples
カズヤ
そうなんですよね、それが現状の課題で……(笑)。コードはすべて共有していますが、作業は分担していません。ですから、ぜひJenkinsの得意な方に来ていただいて、一緒にJenkins談義をしたいです!

その他、ビルド環境について特徴的なことはありますか?

gutenberg-examples
カズヤ
Slackでのビルド通知関連は特に力を入れていて、Jenkinsのページを見に行かなくても、あらゆる通知がSlackに集約されるようになっています。また、通知の内容もできるだけわかりやすくなるように配慮しています。
▲報告されたバグは、Slackで担当者へ通知される
▲クラッシュレポートのSlack通知と、クラッシュレポートを一覧で見られるサイト
gutenberg-examples
タカヒラ
エンジニア以外のスタッフがバグをレポートしたときも、エンジニアの欲しいデータが大体付いてきてくれるから便利ですね。とても助かってます!

「Cyllista Game Engine」の高速イテレーションを支える
ホットリロード・アセット保留・URI共有機能

「Cyllista Game Engine」でゲーム開発のイテレーションを効率的に回すために便利だと思ったものはありますか?

gutenberg-examples
タカヒラ
ホットリロード(※7)、アセットの保留、URI(※8)共有の三つの機能ですね!ホットリロードは他のゲームエンジンにもありますが、「Cyllista Game Engine」ではほぼすべてのアセットでホットリロード可能です。もちろんコードのホットリロードも出来ますので、それだけでも重宝しています。
それに加えて、アセットを保留する機能が強力です。自分自身の環境の変更を保留しておくことはもちろん、それをサーバーに上げて他のスタッフに渡すこともできます。

※7 ホットリロード……開発中、本来ファイルを編集→保存→更新と手動で行うところを、保存した瞬間自動的に更新後のファイルを読み込んでくれる機能のこと

※8 URI……Uniform Resource Identifierの略。リソースの位置と名前を特定する文字列のこと

ゲームタイトル側ではどのように使っているのでしょうか?

gutenberg-examples
タカヒラ
プランナーと話しながら開発を進めるときには、エンジニアとプランナーが手を動かしながら相談したほうがよい場合があります。そんなときには画面共有しながら「こういうふうにしたい」とか「じゃあこんな実装が必要だね」などと話し合いつつ、プランナーからはスクリプトなどを保留して渡してもらい、それを受け取ってエンジニアの環境でビルドして実行……といったスムーズなやり取りができています。
gutenberg-examples
カツヤ
保留したアセットのデータは一旦共有フォルダにアップロードして、そこからダウンロードするんですよね。
gutenberg-examples
タカヒラ
はい、それを可能にするのが三つめの機能であるURI共有です。アセットを保留にすると、保留解除のURIをポップアップ表示してくれて、それをSlackで共有します。受け取った人がそのURIをクリックすると、「Cyllista Game Engine」のメソッドが呼ばれて、それだけでアセットの保留を解除できます。プランナーとやり取りしているときにも、基本的にはゲーム画面とSlack、連絡ツールだけですべてのイテレーションが完結することが本当に便利だなと思っています。
gutenberg-examples
カツヤ
チームメンバーが使うアセットやコードなどを更新しなくても、お互いローカルの環境だけでやり取りができるということですね。
gutenberg-examples
タカヒラ
そうですね!エンジン本体の更新も結構早いと思いますが、それでも数十秒かかるときがあります。それに比べて、アセットの保留を使えばワンクリック5秒程度で反映されますので、イテレーションが非常に速いです。
▲ホットリロード、アセットの保留、URI共有のデモ

アセットのホットリロードはバージョンの更新とは違うのでしょうか?

gutenberg-examples
タカヒラ
バージョンの更新と違って、ゲームを起動したままできるんですよね。例えば、赤い箱が置いてあってもアセット保留解除したら丸い青い玉に変えるとか、そのようなことをリアルタイムにそのまま更新できます。
gutenberg-examples
カズヤ
それらをPerforceの更新情報にするまでもなく、保留状態も含めて一時的にURIでプランナーと共有できるという感じですね。

それは便利ですね。AI周りの開発でもホットリロードなどの仕組みは役に立っていますか?

gutenberg-examples
タカヒラ
とても助かっています!私はエンジンのAIを開発していますが、同時にキャラクター・NPCの制作もしているので、タイトル側のコード実装でホットリロードの機能が非常に役に立っています。

タカヒラさんの業務とも相性が良いのですね。最後に、このメンバーの中で一番の若手であるタカヒラさんの今後の目標はありますか?

gutenberg-examples
タカヒラ
「Cyllista Game Engine」はAI周りのデバッグも便利ですが、もっと根本的に、バグ自体が少なくなる作りにしていきたいと考えています。タイトルの開発でNPCとAIを兼任しているため、どうしてもタイトル側のコードで対応してしまうことが多いのですが、長期的なことを見据えてその機能をエンジン側に反映させて、エンジンのAIモジュールを堅牢な仕組みにしたいです。

「Cyllista Game Engine」チームの将来に向けて

「Cyllista Game Engine」が日々進化していることがよくわかりました。今後、開発チームもさらにスタッフを増強していくと思います。どんな方に来ていただきたいでしょうか?

gutenberg-examples
カツヤ
ツールエンジニアについては、やはりコンテンツが好きで、コンテンツを作るクリエイターをリスペクトし、その人たちを裏方で支えたいというモチベーションのある方に来ていただきたいなと。私自身、社内のクリエイターにツールを提供したり、バグ修正の対応をしたりして感謝の言葉をもらった際にとてもうれしいので、そういう気持ちを持てる方と一緒にお仕事したいなと思っています。
gutenberg-examples
カズヤ
色々なスキルセットの方に来ていただきたいですが、3点お伝えするとすれば、まずは新しいことに取り組むのに全く躊躇しない人。次に、ユーザー目線に立てる人ですね。やはり僕らが開発するゲームエンジンは使ってもらってなんぼなので、どのように使いたいかという目線を持てると強いです。最後に、多くの方に頼られる一面があるので、面倒見の良い人も向いていると思います。
gutenberg-examples
タカヒラ
AIやNPCキャラクターはゲームの面白さに直結する要素だと思うので、面白いものが好きな方とぜひ一緒にお仕事をしたいです。作りながらプランナーと話すことも多くあるので、ゲームエンジン開発者だけどプランナーよりも面白い物を提案するぞ、という気概のある方でしたらうれしいなと思います。といっても私はまだ若輩で、そんなことを言えるような立場ではないですが……!(笑)

以上、「Cyllista Game Engine」開発チームで活躍するスタッフのご紹介でした。
サイゲ―ムスでは現在一緒に働く仲間を募集しています。ご興味を持たれた方はぜひご応募ください。

Cyllistaチーム採用