Cocos、初のSteamゲームを無料リリース

![iles.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852397/193d3862-f2db-1b92-e80a-ed41d7f0a291.png)
`正直、練習のためにちょっとしたゲームを作ろうとしたんですが、やめられなくなりました。` 
　　　「iles」プロデューサー／プログラム youyouさん

（このブログ記事は、ゲームエンジン開発者のyouyouさんからお送りいただいたものを記事にしました）

少し前になりますが、2022年8月に、**3Dランニング＆ビルディングゲーム『iles』のSteamでの正式サービスが開始されました**。プレイヤーの皆様は、無料でゲームをダウンロードし、体験することができますので、まずは「ウィッシュリスト」に追加してください。同時に、**ゲームのコアとなるソースコードの一部がv3.6にバージョンアップされてリリースされています**ので、こちらはCocos Storeから入手できます（記事末尾のリンク参照）。
<br>
<iframe width="761" height="480" src="https://www.youtube.com/embed/ixtnh6NxRgw" title="iles - A Platforming Puzzle Game For PC & MAC" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
<br><BR>
"iles "は、主にエンジンチームのCANVASと私の2人が、空いた時間を使って開発しています。研究開発のサイクルは4ヶ月近く。私は、レンダリングパイプラインの構築とレンダリングエフェクトの実現を担当しています。Canvasは、ゲームのフレームワークとゲームプレイを担当しています。アートモデルや音楽はほとんど外注で、残りは私たちが作っています。

以前の[cyberpunk](https://www.youtube.com/watch?v=k5EsQi2d-iA)や[Lake](https://www.cocos.com/en/cocos-creator-lake-demo-available-for-preview) のデモをまだ覚えていらっしゃるかもしれませんが、この2つのデモはいずれもエンジンのレンダリング能力を見せることに重点を置いており、シーン内でインタラクティブに操作できる部分は比較的少ないと言えます。多くのユーザーが "いつになったら中に入って走り回れるのか？"というメッセージを残しています。そこで私たちは、**Gameplayコンテンツを直接追加して、ゲームを作ってはどうかと考えたのです。**

ということで、「iles」が誕生しました。このゲームでは、エンジンが作り上げた世界に、より深く入り込み、細部まで見てもらいたいと考えています。**さらに重要なのは、エンジン開発者として、Cocos Creatorを使ったゲーム開発の全プロセスを体験することで、エンジンの欠点や痛点を発見し、その後のイテレーションへの参考とすることができることです。**

Steamを選んだのは、私たちがまだあまりカバーしていないプラットフォームであることが主な理由です。今回は、Steam Greenworksへのアクセス、Mac+Windowsのデュアルプラットフォームでのローンチ、クリエイティブワークショップへのアクセスなど、**Steamでゲームローンチの全プロセスをテストしました。**
<br>
<iframe width="618" height="348" src="https://www.youtube.com/embed/CoVZZ-8_3sE" title="iles_6405" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
<BR><BR>
次に、ゲームプレイデザイン、レンダリング効果、Steamへのリリースの3点に焦点を当て、「iles」の開発舞台裏を紹介します。

# シンプルで楽しく遊べる
プロジェクト開始当初、「どのようなゲームを作りたいか？」考えました。
**軽快でありながら、競争力のあるゲームにしたい。** この観点から、「パルクール＆ブレイクアウト」という方向性を選び、ゲーム操作は極力シンプルに、マウスでキャラクターを走らせるようにしました。また、競技の面白さを向上させるため、走行に少し慣性を持たせ、ゲーム操作を少し複雑にしています。
<br>
<iframe width="618" height="348" src="https://www.youtube.com/embed/HYOqOvuwnlc" title="iles_640 5" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
<br><br>
ゲームプレイは単純明快です。プレイヤーはマウスの動きとクリックでキャラクターの走りとジャンプをコントロールし、50のパルクール島を駆け抜け、キャンディーを集め、様々なトラップを回避していく。各レベルのゲーム時間は1分未満で、キャンディの数とうまくクリアした時間に応じてスコアが加算されます。
<br><br>
「iles」には、レベルをクリアするだけでなく、「ビルド」モードも用意されています。プレイヤーは集めたキャンディーを使ってスキンを購入したり、レベルエディターをアンロックしたり、島を建設して自由にレベルをデザインすることができます。

**UGCコンテンツのサポート、クリエイティブワークショップへのアクセスは、最小限のコストで『iles』の寿命を延ばすためであり、** 
また、プレイヤーがどのようなクリエイティブマップを作れるかか見てみたいということで、Canvasはアニメの女の子を作りました。

「iles」の主人公はニワトリです。キャラクターイメージを決定する作業には、頭も時間も使いました。当時は「もっと違うイメージにしたい」と常々思っていたのですが、自ら大きな穴を開けてしまいました。今でも、ニワトリのデザインはかなり難易度が高いです。Pandaは「大胆に作ればいい」と提案し、大げさな要素も加えてくれました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852397/72ad6ac7-a9dc-5b4a-f48f-6c304821d931.png)        
　　　　　　　　　　Pandaの描いたスケッチ

その後、発散していろいろなデザインに挑戦しました。
![image-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852397/27f2f867-f0b4-6dcf-2100-75a5ffedb2ea.png)
そして、議論を重ねた結果、次のようなものが出来上がりました。![image-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852397/96387e0d-7775-6584-e0fe-f48da431d85b.png)
個人的にはその傘が好きです。この傘は主人公に欠かせない小道具で、主人公と一緒に飛んだり滑ったりすることができます。もし予算があれば、この傘をみんなのお土産にしたいです。

# ステップバイステップでエフェクトの構築
"iles "のレンダリングエフェクトは、長い時間をかけて作り上げました。ゲームによって提示されるエフェクトが、どのようにステップバイステップで作られていくのか、その反復プロセスのいくつかの項目をご紹介しましょう。

一番最初のプロトタイプの段階では、簡単な白い型をいくつか使ってシーンを構築し、その後のシーンはこのプロトタイプをベースに徐々に最適化されていきました。
![image-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852397/1ef9fb79-12a8-923b-96ec-31cc7aeb1486.png)

また、水際の作成では、深度検査、手作業によるモデル面の作成、レイディテクションによるモデル面の生成、特殊効果など、さまざまな解決策を試みました。それでも、これらの方法には多かれ少なかれ欠点があり、プロジェクトのニーズを満たすことはできません。**ユーザーの編集に応じた水紋を動的に生成し、レンダリング効率を確保しつつ、オブジェクトの表面から波がはみ出るような表現ができればと考えています。**  最終的に私が選んだのは、SDFの実装方法です。ユーザーによる編集時にSDF画像を生成し、水面のレンダリング時にそのSDF画像を読み込んで波紋を生成するのです。
![image-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852397/bf6c735e-8eff-d917-da30-45aca977bc32.png)
![image-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852397/fb549da7-9ea6-69b6-bc74-d7a79220a089.png)
　　　　　　　　　　　水の波紋 SDFテクスチャ

鳥や滝を追加し、プロットを最適化した結果、徐々に少し海の雰囲気が出てきました。![image-6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852397/182a29a6-64f8-4bf5-4c33-d2bd4833a9f5.png)
海の色を「浅い海」から「深い海」に調整して少し神秘的な雰囲気を出し、表面波と波灯を加えて装飾します。ちょっと面白そうになってきましたね。
![image-7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852397/bc9f2e78-ce39-0d58-db3a-6c8ad76e88f7.png)
そして、海底の効果を充実させる。ゲーム内の島のプロットはプレイヤー自身が建設・生成し、海中の陸地や石、木、サンゴはプロットの周りに自動生成されます。スカイボックスを最適化し、水面への反射を追加した後、基本的には今ゲームで誰もが目にするものとなっています。![image-8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852397/fdfb9eea-548e-6cd9-8a72-54783bde46d7.png)
![image-9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852397/ca7975e8-74f8-6fdf-e7b8-dc7ff1f4e9c5.png)
「iles」の高度なエフェクトは、基本的にこのカスタムレンダリングパイプラインに依存しています。このパイプラインのデバッグと整理を容易にするために、視覚的な編集パイプライン機能を一時的に、かつ迅速に実装しました。ソースコードを入手し、その中で実装原理を探ることができます。もちろん、これは "iles "のために一時的に行ったことです。自分のプロジェクトに適用する場合は、原理をマスターした上で、必要に応じてカスタマイズするのが適切でしょう。![image-10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852397/eddd8aa5-8e25-66fa-93c0-5ba70cabb253.png)
また、最も時間をかけたアートエフェクトといえば、実は本作のマップ選択インターフェースです。選択インターフェースでは、編集したレベルを直感的に表示できるようにしたいのですが、そのために様々な解決策を試しました。

最初は、UIスクロールビューのリストで行いましたが、これはちょっとシンプルすぎて見た目も良くなかったです。
![image-11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852397/2055cbe9-ef28-60e1-1868-af9320158601.png)
その後、メッシュ構造に展開し、レイアウトを見やすくしました。
![image-12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852397/fe631f63-1339-3535-44d1-a1f2e89088d1.png)
また、各レベルを区画別に配置し、簡略化した3Dモデルを生成する実験も行いました。当初は3Dモデルの効果をより反映させるために斜めのパースを使用していましたが、少し雑な印象になり、遠くの階層があまりはっきり表示されなくなってしまいました。
![image-13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852397/1316e1b7-a5ed-db3e-9c00-50c1bcc0777d.png)
そこで、トップビューに戻し、エンジンUI嬢の提案で、レベル下部の点線を実線に変更しました。最終的には、独自のスタイルを持つインターフェイスが完成しました。簡略化されたモデルのエッジが泡立ち、解説文や島名が水底に屈折して表示される効果があることが分かります。ここで使われている技術は、水面効果と同じものです。
<iframe width="618" height="348" src="https://www.youtube.com/embed/q-5tU9h46DE" title="iles_640 8" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

# Steamでのパブリッシングの落とし穴
私たちは、ゲームのパッケージングとパブリッシングの一通りのプロセスをSteamで行いましたが、Steamのクリエイティブワークショップとデータインターフェースにアクセスするのに多くの時間を費やしました。以下は、Steamプラットフォームでのリリースを希望する小規模な開発チームの参考のために、私たちが遭遇した落とし穴と解決策をまとめたものです。
![image-14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852397/60d7d5b2-eb77-6cf2-0eec-b789c03730d9.png)
**アップロードしたMac AppがSteamダウンロード後に開けない。** 以前はSteam WorksのWeb UIでアップロードしていましたが、速度が遅く、Mac AppのElectron symlinksが途切れてしまいました。長い間調べた結果、コマンドラインを使ってアップロードすることができ、コマンドラインアップロードは増分アップロードをサポートしており、アップロード時間を大幅に短縮できることがわかりました。
参考リンク:https://trashmoon.com/blog/2022/automating-steam-releases-for-html-games-with-electron-forge-and-github-actions/

https://trashmoon.com/blog/2022/automating-steam-releases-for-html-games-with-electron-forge-and-github-actions/


**Steam Workshopのテスト。アップロードインターフェースを呼び出すと、アップロードの失敗が何度も返ってきます。**
最初は、Steamがまだパーミッションを開いていないか、ネットワークに問題があるためと考えました。しばらくすると、やはりうまくいかなくなりました。ソースコードをめくってみると、String型でなければならないIDパラメータがあることがわかり、数字が渡されることをテストしました。
参考リンク：https://github.com/greenheartgames/greenworks/blob/12392db8e88ec9c0f6a1e244672992b972413e54/src/api/steam_api_workshop.cc#L193

**Steamに出品する場合、レビューの期間を考慮する。** Steamの審査は1週間程度かかります。審査に合格したからといって、すぐにゲームをダウンロードできるわけではありません。最低でも2週間は、ストアページに「近日発売」と表示する必要があります。この2週間の間、プレイヤーは普通にゲームを検索することができます。さらに、ユーザー登録の時間にも注意が必要です。新規ユーザーは30日以上ユーザー登録をしてからでないとリリースできません。

**アーリーアクセスの審査**はまだ比較的厳しく、Steamから出される質問には慎重に答える必要があります。そうでないと、何度も呼び戻される可能性があります。

**Steamオーバーレイに対応していること**、オーバーレイを開くためのショートカットキー「Shift + Tab」に対応していることが必要です。Electronのメインプロセスは、デフォルトでは毎フレーム描画されません。この問題を解決するには、スタートアップ項目にコマンドを追加する必要があります。
![image-16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852397/151ec527-5331-531b-66c7-9573f3803c59.png)
また、Steamのリーダーボードシステムにアクセスし、各レベルでのタイムランキングなどを確認できるようにすることも検討していました。しかし、事前調査の結果、Steamのインターフェースと通信するためのサーバーを構築する必要があることが判明し、当面は断念しました。

**ゲームとソースコードの入手**

"iles "のSteamアドレス
https://store.steampowered.com/app/2001150/iles/

「iles」ソースコードダウンロード
https://store.cocos.com/app/detail/4010/

「iles」のソースコードがCocos Creator 3.6にアップグレードされ、**ビジュアルカスタムレンダリングパイプライン全体、ゲームキャラクターの操作、スタートシーン、関連資料など、コアとなるソースコードの一部**をCocos Storeでダウンロードすることが可能です。ストアの初期設定は99元ですが、ゲームを最終レベルまでプレイしさえすれば、ソースコードを無料で交換できるバウチャーを入手することができます。クリアの難易度は高くありません。ぜひ体験して、フィードバックして、より良い作品に仕上げてください。

最後になりましたが、この場をお借りして、ゲーム開発中にお世話になった仲間たちに感謝の気持ちを伝えたいと思います また、開発者の皆様にも、ご配慮とご支援をいただきありがとうございました。皆様のご期待に沿えるような「iles」でありたいと思います。

[引用元](https://www.cocos.com/en/cocos-releases-its-first-steam-game-for-free)