2021年4月よりApple Arcadeで配信されているゴルフゲーム『CLAP HANZ GOLF』。コンシューマーゲーム『みんなのGOLF』シリーズで知られる株式会社クラップハンズが制作を手がけた。
同社にとってモバイルゲームの開発は今回が初めてだったが、Unityを導入することでマルチプラットフォーム対応などの難所を乗り越えられたという。
「ゲームの重要な部分に、より多くの時間を使えるようになった」と振り返るのは、Lead Programmerの桑原利行氏とLead Artistの二見圭介氏。Unityの導入理由や利点、開発において苦労した点、ゲーム制作の変化について伺った。
検索したら解決できる、情報の豊富さに惹かれた
──はじめに『CLAP HANZ GOLF』の制作が始まった経緯について教えてください。
桑原:クラップハンズはずっとコンシューマーゲームを作ってきたのですが、2019年頃からモバイルゲームにも挑戦したいという話が社内で盛り上がっていたんです。
ちょうど数ヶ月後、Apple Arcadeから「ゲームを配信しませんか」と打診を受け、『CLAP HANZ GOLF』の制作が動き出しました。
──Unityでの開発を決めたのは、なぜだったのでしょうか?
桑原:そもそもモバイルゲームの開発を検討し始めた頃から、Unityを社内で試していたんです。
コンシューマーゲームに比べ、モバイルゲームはスペックや画面サイズも異なる幅広い機種に対応しなければいけません。そのための開発エンジンを自社で作ろうとしたこともあるのですが、なかなか大変で。マルチプラットフォームに展開できるUnityであれば、その点を越えやすいと考えました。
──マルチプラットフォーム対応であること以外に、決め手となったポイントは?
二見:他の開発エンジンと比べ、世界中でもすでに利用している人が多く、インターネット上に情報が豊富にあるのは魅力でした。開発が始まってからも、検索すれば大抵の課題は解決できましたから。
桑原:あとは実機での動きをシミュレーションできることですね。直近の1年くらいはテレワークで開発しているのもあって、エンジニア各自にすべての対応機種を配るわけにもいかず、実機で検証することの難しさが課題でした。
出社ができない環境であっても実機検証を効率化ができたのは、デバッグなど含め、かなりの工数削減につながりました。
──制作はどのような体制で進められたのでしょうか。
桑原:各部門に数名ずつの体制です。
・プログラミング:4人
・ゲームデザイン:2、3人
・UI周り:2人
・キャラモデル:3、4人
・モーション:2、3人
・コース:2人
・翻訳管理含む開発サポートと管理:3人
開発時期によって変動しますが、概ねこういった構成でしたね。
統合された環境で素早いイテレーションが可能に
──プログラミングで、Unityの優位性を感じた点はありますか?
桑原:ベースとなるプロトタイプが完成してから量産体制に移るまでが、非常に速かったですね。わからないことがあっても調べたら大体解決できますし、コードを書き換えて動かすといったイテレーションも高速化できました。
──UnityはC#での開発になりますが、使用言語の違いに戸惑いなどはありませんでしたか。
桑原:これまでは主にC++で開発していたので、戸惑いはありました。特にメモリ管理の違いには試行錯誤しました。
C#には、使用されていないメモリを自動で解放し、メモリ容量を節約するガベージコレクションという機能があります。この機能によって処理が中断されると、プログラムの実行に遅延が起きてしまうんです。
──どのように解決していったのでしょうか?
桑原:Unityのインクリメンタルガベージコレクションを使っています。短時間の中断を複数回発生させ、結果的に大きな遅延を防ぐ機能ですね。エディターにあるプロファイラーウィンドウで、処理の中断が起きていないか、随時チェックしながら設定していきました。
これ以外にも、どの処理が滞っているか、エディターでまとめて確認できるのは非常に助かりました。たとえば、インスタンシング(※少ない処理で複数の描画、レンダリングを行う機能)が有効になっているかなども、ツールを行き来せずに確認し、修正できる。統合された開発環境の利点だと思います。
──反対に、Unityでの開発で苦労した点があれば教えてください。
桑原:一つはボールの衝突判定です。ゴルフゲームではボールが地面に当たったとき、地面がラフなのかバンカーなのかといった属性によって挙動を変える必要があります。属性を取得してボールの動きに反映する部分は、Unityの機能だけでは実装するのが難しかったのです。
結果としては、どの属性に衝突したかを判定する部分はUnityの搭載機能で、その後のボールの挙動は別途開発したシステムを組み込んで処理しています。
もう一つはカップの処理です。今回、コースに置かれるカップの位置は8パターンあります。コースを生成するプログラムの実行時に、カップの穴を描画したかったのですが、Unityだけでは実装ができなくて。地面やグリーンなどのオブジェクトをモディファイするプログラムを使っています。
この二つは、ゴルフゲーム特有の課題ということもあって、検索しても得られる情報が少なく、なかなか苦労しました。
CGはMayaからの取り込みもスムーズ、従来と変わらぬ機動性
──CGの面では、Unityの導入はうまく進みましたか。
二見:想定していたよりもスムーズにモデルをインポートでき、手軽に使える印象を受けました。
以前から使用していたMayaでモデリングをして、Unityにインポートする手順だったので、そのインポート先が変わっただけという感触です。
プログラマーよりも従来の開発環境から変わった部分は少なかったように思います。
──手軽だったなかでも、工夫が必要だった、苦労した点はありますか?
二見:インポートしたときにキャラクターが地面から浮いてしまうことがありました。もっと調べれば専用アセットなども見つかったかもしれないのですが、ちょっと時間が足りなくて。30から40個のモーションごとに、キャラクターの位置を手作業で調整していきました。
あとは、UVスクロール(※テクスチャを動かしてアニメーションを表現する)ですね。Mayaでキャラクターの顔や目の動きをUVスクロールで設定しているので、その情報をUnityにも出そうとしたのですがスムーズにいかず、プログラマーに協力してもらったことがありました。今は問題なく設定できるようになっています。
制作の効率化、少人数チームでも広がる表現の幅
──今回はUnityでの開発だけでなく、初めてのApple Arcadeでの配信に、コンシュマーゲームとの違いや難しさは感じましたか?
桑原:モバイルゲーム自体が初めてでしたから、Apple Arcade「ならでは」とは言えないですが、機種ごとのパフォーマンスの違いに合わせてクォリティーを調整する必要がありました。ただこれも、UnityのQuality Settingsでレンダリングの画質を3種類ほど用意して対応できています。
また、機種ごとにUIの縦横比を変える必要があったのですが、それらもUnityのアセットで簡単に設定できて、非常に助かりました。
──ゲームデザインの面で影響を受けた部分もありますか?
桑原:実は大きく変わった部分はなかったです。Apple Arcadeはサブスクリプションサービスなので、ユーザーは定額料金を支払ってゲームを遊びます。一般的にイメージされるモバイルゲームのように、無料でダウンロードしてもらったユーザーに、ゲームごとに都度の課金を促す必要がないわけです。
これまで作ってきたコンシューマーゲームの考え方を活かせたと、ゲームデザインの担当者も話していましたね。
──次のプロジェクトはこれから企画していく段階かと思いますが、今後もUnityを使って開発する予定はありますか。
桑原:プロジェクトにもよりますが、個人的には使い続けていきたいです。まだまだ使いこなせていない機能も多く、活用の可能性は無限大だと思っています。
二見:同感です。私もシェーダーグラフやビジュアルエフェクトなどを使いこなし、もっと良いものを作っていきたいですね。
──Unityを使い続けていった先で、クラップハンズのゲーム制作はどのように進化していきそうでしょうか。
桑原:ゲームの重要な部分により多くの時間を使えるようになっていくと思います。
これまで、開発の前半はプログラマー4人のうち1人分くらいのリソースを開発エンジンに割いていました。後半になっても、機能が加わるたびに作業が必要でした。
しかし、今回はエンジンに割いていたリソースを全て、ゲームの中身を作り込む部分に充てられました。プロセスが大幅に効率化されたと感じます。
二見:CG制作としても、プログラマーに力を借りずに作れるものが増えていくのではと思っています。実際に、今回の開発でも、「理想のシェーダー」を自分で作り込んでいたCG担当者もいました(笑)。
クラップハンズのような小規模の会社でも、Unityの導入によって表現の幅をもっと広げていけるのではないかと期待しています。
桑原:あとは、Unityは多くの企業で活用されていますから、習得することによって、キャリアの可能性が広がると思います。どこでも通用する、役に立つスキルや経験を得られるのも、Unityで開発する大きな利点といえるかもしれません。
──まさにUnityを習得することで、ゲームに限らず多様な企業、業界で活躍するチャンスが広がっていく。そんな状態を目指していきたいと考えています。
今日はたくさんお話を聞かせていただき、ありがとうございました!