見出し画像

テニスゲームの公開と振り返り

unityroomで開発中のテニスゲームを公開したので、本ゲーム開発の振り返りについて記事にします。本ゲームはこちらからプレイ可能です。

タイトル画面

本ゲームについて


開発環境

言語、ゲームエンジン
 ・Unity
 ・C#
プログラミング系ツール
 ・GitHub
 ・GitHub Copilot
 ・VSCode
 ・Draw.io
デザイン系ツール
 ・Photoshop 
 ・After Effects
 ・Premiere Pro
 ・Midjourney
 ・Blender
アセット
 ・Tennis Mobile - full game
  本ゲームのベースとしたテニスゲーム用テンプレート
 ・Very Animation
  ショットアニメーション作成に利用
 ・naichilab/unity-simple-ranking
  ランキングに使用
 ・GUI PRO Kit - Casual Game
  ボタン類に利用
 ・Text Effects For Games 1
  タイトルロゴテキスト作成に利用
 ・Hyper Casual FX
  ショットエフェクト等に利用
 ・Independent 3D Animator, Unity assets and tools
  キャラクターの移動アニメーションに利用
 等

開発期間

約1年

ゲーム紹介

カジュアルな雰囲気のテニスゲームになります。トーナメントモード(*4)とカスタムプレイモード(*5)があります。ゲームの面白さの要素としては、トーナメントモードにおける獲得スコアでランキングを競ったり、そこで獲得したダイヤモンドでプレイヤーのスキンを購入したり、黄金スマッシュ(*1)が決まった場合の爽快感等にあるかと思います。

スキン購入画面

独自の開発機能

本ゲームは既存のテニスゲーム用テンプレートを拡張する形で開発したものであり、具体的には下記機能を独自に実装した。
1. 新ショット
 スマッシュ、黄金化ショット(*1)、ロブ、着地点指定ショット(*2)、ドロップショット等。従来は通常ショットの一種類のみだった。
2. 新ショットアニメーション
 サーブ、スマッシュ、ラケットが弾き飛ばされるショットアニメーションを独自に作成した。
3. プレイヤーと敵の縦移動機能
 従来は横移動のみ可能であったが縦方向にも移動できるよう改良した。また、縦移動時の移動アニメーション(既存アセットを実装)の実装も行なった。
4. タイトル画面
 トーナメントモード(*4)とカスタムプレイモード(*5)を選択できる画面。カスタム設定機能も独自に作成。
5. 一般的な現実世界のテニスルールの実装
 ベースラインの外から打つ、フォルト、ダブルフォルト、レット、アウト、サーブを一定時間内に相手コートサービスボックス内に打つ、デュース等。従来はテニスコートのイン領域のみにボールを打つことができたが、アウト実装のためにアウト領域にも打てるようボールに与える力を修正した。
6. サーブの球速を表示する機能
 サーブ時の球速表示機能の実装と、200km/h以上出た時に表示する派手なテキストアニメーションの自作を行なった。
7. エフェクト実装、UI変更
 既存アセットを使用して、ショット時のエフェクト、アイテム(*3)を派手にするエフェクトを実装した。また、トーナメントに表示するトロフィー画像とゲーム開始画面に表示するタイトルロゴテキストの修正作業(双方既存アセットを少し改造)を行なった。
8. 敵もアイテム(*3)を狙う機能
 従来は敵はアイテムを取得できなかった。
9. ランキング機能
 トーナメントモード下での獲得スコアのランキング表示機能(既存アセット使用)とその計算内訳を表示する画面(独自)を作成した。
 

高速サーブ時の派手な球速テキストアニメーション1
高速サーブ時の派手な球速テキストアニメーション2
ダブルフォルト
ロブ(手前のプレイヤーは頭上を抜かれ打ち返せない)
ランキングスコア内訳画面

反省


反省点

開発期間が長引いた(約1年)点。開発開始当初は漠然とだが2-3ヶ月程度でのリリースを考えていた。

原因

1. いつでもリリースできる状態にしなかった
 完成度は低いが一応はリリースできるようなゲームを作ろうとしなかった。
2. 開発規模を大きくしすぎた
 必要以上に多くの機能を作成し過ぎた。
3. 作業の優先度を意識しなかった
 優先度を考えずに思いついた機能を無条件で実装していた。
4. 設計を行なわなかった
 ゲーム設計、プログラム設計、テスト設計等の設計を一切行わなかった。
5. リアルに拘りすぎた
 現実世界のテニスのルールや物理法則を忠実に再現することに無理に拘ることで時間を消費した。例えば上記独自実装機能5(一般的な現実世界のテニスルールの実装)で触れたアウト等の実装に非常に手間がかかった。
6. 大規模なリファクタリングを行わなかった
 本ゲームのベースとしたテニスゲーム用テンプレートのソースコードは、あまり拡張性を考慮したコードになっていないようで、これを大規模なリファクタリングなしに無理矢理改良しようとした。(とはいえ、本テンプレートから学べたことは多く、これを利用したことは有意義であったと考えている。)
7. 進捗報告に時間がかかった
 
twitterでほぼ毎日進捗報告していたが、この報告に時間がかかった。また、何度かPremiere Proでの進捗動画作成を行なったが、テロップ入れ等に非常に時間がかかった。
8. 期限とスケジュールを設定しなかった
 漠然とした期限は設定していたが、しっかりとしたものを考えていなかった。
  

対策

1. 骨格と肉付けを意識
 まずは骨格(動くもの)を作り、余力があれば肉付け(デザインなど)を行うようにする。リリースできる状態のものを早期に作り、それをブラッシュアップすることを意識する。
2. 小規模に作り徐々に拡張する
 MVP開発を意識して、小規模に最短で作る。受けが良ければ拡張していく。
3. 優先度を意識
 優先度を考え、これが高い作業から行う。1で触れた骨格に該当するもの、4の設計等は優先度が高い作業と考える。1の肉の中でも例えば、ショットの黄金化(*1)などは、大して手間もかからない割にプレイヤーの爽快感向上に繋がる機能であり、この実装作業は比較的優先度が高いと感じる。軽微なバグ修正、軽微なリファクタリング、UIの微調整等は優先度は低いと考える。
4. 設計を行う
 ゲーム仕様書、フローチャート、クラス図、テスト設計書を作成して、これらを元に開発を行う。ただし、開発規模が小さく、個人開発の場合、設計書はメモ書き程度でも良いことにする。
5. リアルに拘らない
 ゲームの世界では必ずしも現実世界を再現する必要はない。むしろ効率化や面白さ向上のために非リアルな要素を積極的に取り入れていく。
6. 必要に応じて大規模なリファクタリングを行う
 拡張性が考慮されていないソースコードを改良する場合、早期に大規模なリファクタリングを行う。(ただし、開発規模が小さい場合は大規模なリファクタリングをする方が却って非効率になるため、その辺は柔軟に対応する。)
7. 進捗報告の頻度を減らす
 twitterでの毎日報告に拘らない。2日に1回以上行えば良しとする。また、効率よく進捗動画作成ができるようになるまでは、進捗動画の投稿頻度を大きく減らす。
8. 期限とスケジュールを設定
 期限の設定とスケジュール表の作成を行い、スケジュールに沿って開発する。  

良かった点


デザイン系スキルの向上

具体的には以下のスキル向上を実感している。
1. 3Dモデルのアニメーション作成スキル
 アニメーション作成ツールのVeryAnimationを初めて利用して、初めて3Dモデル(プレイヤー)のアニメーションを作成した。具体的には、サーブ、スマッシュ、ラケットを弾き飛ばすアニメーションを作成した。
2. テキストアニメーションの作成スキル
 初めてテキストアニメーションの自作を行った。具体的には、200km/h以上球速が出た時の派手なテキストアニメーションを作成した。
3. PV作成スキル
 ゲーム系PVを初めて作成した。AfterEffectsを利用して作成。黄金ショット、着地点指定モード(*2)等見せたい機能の映像の繋ぎ合わせで構成した。
4. 3Dモデル作成スキル
 初めて3Dモデルの作成作業を行った。具体的には、テニスコート内に設置する街灯をblenderを使用して作成した。夜間モードを作り使用する予定で開発したが、現時点では未実装。
5. シーン遷移時のトランジション作成スキル
 初めてシーン遷移時のトランジション作成作業を行った。具体的には、赤、黄の2枚の平行四辺形を利用したトランジションや、黒背景と円形逆マスクを使用した円形状にフェードイン(アウト)するトランジションを作成した。結局採用しなかった。
6. タイトル画面デザインスキル
 初めて、タイトル画面のデザインを作成する作業を行なった。具体的には、背景を2種類生成した。生成した背景は、Midjourneyを利用して初めてAIに自動生成させた背景と、本ゲームのテニスコートの背景(こちらの背景を採用)の2点である。また、初めてPhotoshopのニューラルフィルタ(調和)を利用して、これらの背景に合うようにキャラクターをAI自動加工することを行った。また、Canvaを利用してテニスゲーム系ロゴを初めて作成した。その他、既存アセットとPhotoshopを利用してテニスゲーム系テキストロゴを生成する作業を行ったりした。
7. パーティクル、UI画像作成スキル等
 
既存アセットを少し改造してサーブとスマッシュ時のボールを黄金化するパーティクルや、トーナメントに表示するトロフィー画像の作成作業を行なった。また、既存アセットをそのまま使用して、ショット時のエフェクト、アイテム(*3)を派手にするエフェクトを実装した。

PV

AI(Midjourney)に自動生成させた背景を利用したタイトル画面
テニスコートの背景のタイトル画面(こちらを採用)
ヒットエフェクトと黄金化パーティクル1
ヒットエフェクトと黄金化パーティクル1

プログラミング系スキル、知識の向上 

具体的には以下のスキル、知識が向上したと感じる。
1. コードを書くスキル
 プログラミングの有名な原則(構造化プログラミング、KISS、DRY、YNGNI、SLAP等)をある程度考慮したコードを書けるようになった(開発前はこれらのまともな知識すらなかった)。
2. GitHubの知識
 これまで、Gitを利用してローカル環境のみで開発中のゲーム関連のデータを管理してきたが、今回初めてGitHubを利用して管理するようにした。ファイルが大容量なためGit LFSを利用した。
3. GitHub Copilotの知識
 初めてGitHub Copilotを利用して、AIを利用してコードを書く経験を積んだ。利用することで生産性が向上したと感じている。Unityのインテリセンスが頻繁に効かない状態になることがあったが、効かない場合でもGitHub Copilotがある程度その代用をしてくれるため重宝した。GitHub Copilotは心強い相棒という印象がある。
4. 負荷削減に関する知識
 Unity固有の負荷削減方法について学べた。具体的には、初めてScriptalObjectを利用して敵キャラパラメータをアセット化したり、GetComponentやAnimator等の重い処理を避けるリファクタリングを行なったり、Profilerを利用して重い処理を特定する作業を行ったりした。
5. UniTaskの知識
 初めてUniTaskを利用した非同期処理の実装作業を行い、この知識が向上した。  
6. ネットワーク対戦用ライブラリの知識
 
ネットワーク対戦の実装に向けて、その基礎学習を行った。具体的にはMirrorとMLAPIを利用して、簡単なネットワークゲーム(ホストとクライアント間でプレイヤーの位置とアニメーションを同期させるのみ)を作成した。ネットワーク対戦は今後余力があれば実装するかもしれない。
7. バグ修正、テストスキル
 バグが頻発したが、その修正作業を通じてバグ修正やリファクタリング、テストスキルが向上したと感じる。テストの効率化等のために、各種チート行為を行えるデバッグモードを初めて作成した。
8. 難易度調整スキル
 プレイヤーと各レベルの敵キャラの各種ステータス(移動速度、球速、各種ショットを打つ確率、各種ショットを打てる範囲等)をテストプレーを繰り返しながら調整する作業等を通して、適度な難易度に調整するスキルが向上したと感じる。。
9. 設計スキル
 開発時期の後半に、初めて(本ゲームに関する)フローチャートやpad図、クラス図を作成する作業を行い、これらの知識、作成スキルは高まったと感じている。

類似のコードを自動補完するGitHub Copilot
本ゲーム画面のpad図

テニス系知識の向上

現実世界の一般的なテニスの知識とテニスゲームの知識を得る事ができた。

ブログ作成スキル向上

本ブログ作成作業を通じて、ブログの書き方に関する知識や文章の質が向上したと感じる。また、毎日ブログを書く習慣も身についた。

フォロワー増加

twitterで頻繁に進捗報告を行なってきた甲斐あってか、twitterでのフォロワー数が開発前1000人以上増加した。

今後の課題


黄金ショット時のエフェクトをより派手なものに改良

未解決の再現性の低い原因不明のバグ修正

アイテム(*3)の追加

チュートリアルの作成

ストア(google play等)への公開

ショットの追加

夜間モードの実装

対人戦の実装

ネットワーク対戦(対人戦)の実装


所感・謝辞


想定外に時間はかかったものの、得られたことは多く、有意義な時間を過ごせた。
また、本ゲーム開発環境提供者の方々、Twitter等でフォロー、応援してくれた方々、並びに本記事読者の方々全ての方々に深く感謝します。

用語説明 


ショットの黄金化(*1)

黄金化スマッシュ

スマッシュ時とサーブ時にボールが黄金になり強力なショットになる機能。具体的にはネットに引っ掛からなくなり、稀に相手のラケットを弾き飛ばす(勝利確定)ショットになる。サーブの黄金化はバーが溜まった時にタイミングよくサーブを打つ時に発生する。スマッシュの黄金化はスマッシュ時に一定確率で稀に発生する。敵はランクが上がるほど頻繁に使用してくるようになり、頻繁に使用されるとかなり厄介。

着地点指定モード(*2)

真上視点で着地点を指定
指定した地点にショット

ボールの着地地点を指定するための真上から見た視点のモード。このモードで敵反対側のライン際を指定して打つスマッシュショットはまず返球されない。また、中央に浮かぶ出現アイテム(*3)を確実に取得する際にも有効。強力なため、このモードの使用回数に制限がかけられており、ライン際を狙った場合等に稀に使用回数が増加する。

アイテム(*3)

アイテムを狙う敵
アイテムヒット時の演出

 稀にネット上空に出現する。現時点では当てるとボールが爆発して勝利が確定する黄金の球体のアイテムのみ出現する。敵はレベルが上がると高確率でアイテムを狙うようになるので高レベルを相手にする場合、最優先で狙いたいところ。なお、アイテムまで微妙に届かない位置に稀に敵がボールを(低レベルほど)打つ機能があり、届かないのを見ると少しほっとする。 

トーナメントモード(*4)

トーナメント表

3段階の強さの敵相手に勝ち抜くことで優勝となるモード。その過程で得られたダイヤモンドを使用してキャラクターのスキンを購入したり、得られたスコアでランキングを競うことができる。優勝時は連続でダイヤモンドを獲得できるボーナスシーンに遷移する。

カスタムプレイモード(*5)

カスタム設定画面

敵の強さなどを設定してプレイするモード。具体的には、敵の強さ(3段階)、勝利に必要な得点数、テニスコートの種類、アイテムの出現有無、黄金ショットの有無をカスタマイズ可能。

いいなと思ったら応援しよう!