3229 文字
16 分

【Unity】開発前に確認・理解しておきたい10項目

2022-08-09

先月、Android向けスマホアプリとして「突撃!ヨーコ道場」をリリースしました(ぜひ遊んでもらえると嬉しいです!)。

突撃!ヨーコ道場
Androidアプリとしてマサオ君が登場!四方に出てくる人形を、反射と思考とタップで倒そう!ランダムに出てくる人形には偽物も混じっているよ!なかには倒す順番が決まっている人形も!?5つのステージをクリアすると、エンドレスモードがいざ解放!オンラインランキングによる熱い戦いが君を待ってるぜ!
突撃!ヨーコ道場 favicon soryustudio.bona.jp
突撃!ヨーコ道場

それにあたって事前に知っておきたかったこと、開発途中でわかって苦労したことなど含め、Unityで開発前に確認・理解しておきたい10項目を整理してみました。

ぜひご自身の開発と照らし合わせて確認してみてください。

なお、記事内でよそ様の記事・ツイートをいくつか紹介しています。この場を借りて御礼申し上げます。

非常に助かりました、ありがとうございました!

FPSはいくつにするか決めてる?#

そもそもFPSって何?#

FPS(Frame Per Seconds)とは1秒に対してゲーム側がどのぐらいの処理を実行するか、という項目。

30fpsは1秒間に30回、60fpsなら1秒間に60回処理が行われます。この設定値によってUnityの画像描写やUpdate関数(毎フレーム毎に実行)の実行頻度も変わる訳です。

FPSが高いとどんなメリット・デメリットがある?#

処理頻度が高ければ高いほど、細かくオブジェクトやアニメーションを動かすことができるので、全体の動きが非常に滑らかに感じられます。

一方で、処理負荷が高まるため、電池の消耗速度や発熱量が増加するなどの影響があります。

Unityのデフォルト設定値は?#

UnityのデフォルトFPSは画面と同期、すなわちディスプレイのリフレッシュレートに応じて変動するものとなっています。ようはディスプレイが60fpsなら60fps、90fpsなら90fpsで動くという訳です。

高リフレッシュレート対応のディスプレイを使うとより滑らかに動くというのは、格闘ゲームのようにシビアな判断が求められるゲームでは非常に便利そうですね。

ただ人によってゲーム体験に大きな違いを出したくない場合、ゲームの処理負荷や通信量を抑えたい場合は固定FPSにするという選択もありです。

スマホ対応時は要注意!#

「プロジェクト設定(Project Settings)」⇒「品質(Quality)」⇒「VSync数(VSyncCount)」の設定を確認してみると、初期値は「すべてのVブランク(Every V Sync)」、すなわち「画面と同期する」になっているかと思います。

ただし、AndroidやiOSビルドの場合はこんな注意書きもセットに出ているはず。

AndroidやiOSの注意書き

そう、Android・iOS・tvOSではこの設定は無視されます。

ではどんな値が設定されるかというと、実はモバイルの場合は30FPSが初期値として設定されます。

これは公式リファレンスにもきちんと記述されています。

Unity - Scripting API: Application.targetFrameRate
Unity - Scripting API: Application.targetFrameRate favicon docs.unity3d.com
Unity - Scripting API: Application.targetFrameRate

このことを知らずにデフォルト設定のまま開発を進めてしまうと、PC(画面同期)ではぬるぬる動いていたのに実機テスト(30FPS)してみたらめっちゃカクカク! なんてことになってしまうのでご注意下さい。

対処方法は?#

公式リファレンスにもある通り、スクリプト側でApplication.targetFrameRateに値を設定することで、FPSを変更することができます。

ただし、下記記事によると、

30FPSでは10分で12%減る程度だったのに対し、60FPSでは10分で78%程度バッテリーを消費しました。

とのこと。

【Unity】フレームレートを上げるとバッテリーにも影響が出る
フレームレート(FPS)を上げればゲーム画面が滑らかに動く反面、CPUの処理負荷が上がってバッテリー消費も大きくなります。コンセントに繋いでいない状態でゲームを遊ぶことが想定されるスマホや持ち運びのゲーム機向けにゲームを作る場合はバッテリー消費についても頭に入れておくとベネ。
【Unity】フレームレートを上げるとバッテリーにも影響が出る favicon ekulabo.com
【Unity】フレームレートを上げるとバッテリーにも影響が出る

機種や利用年数にもよるとは思いますが、安易に高FPSにしてしまうとバッテリー消費量がぐっとあがるということはご理解いただけたかと思います。

上記記事内にもある通り、ぬるぬる動かしたいところは60FPSにしてそれ以外は30FPSにするなど、どうしても高FPSにしたい場合は影響を最小限に抑える工夫ができるといいですね。

UI最適化の方法を把握してる?#

新しく作るよりも、一度作ったものを後から変更する方が圧倒的に大変でコストがかかります。

最低限、UIをどういう風に構築していくと処理負荷を抑えられたり、なるべくシンプルな構造にしたりできるだろうか、という点は事前に情報収集しておくとよいでしょう。

という訳で、こちらが参考資料です。

ユニティ・テクノロジーズ・ジャパン株式会社
リアルタイム3Dコンテンツを制作・運用するためのプラットフォームである「Unity」の日本国内における販売、サポート、コミュニティ活動、研究開発、教育支援を行っています。ゲーム開発者からアーティスト、建築家、自動車デザイナー、映画製作者など、さまざまなクリエイターがUnityを使い想像力を発揮しています。Unityのプラットフォームは、携帯電話、タブレット、PC、コンソールゲーム機、VR・ARデバイス向けのインタラクティブなリアルタイム2Dおよび3Dコンテンツを作成、実行、収益化するための包括的なソフトウェアソリューションを提供しています。当社の公式サイトでは、Unityの最新情報やイベント、キャンペーン、学習リソース、成功事例などをご紹介しています。ぜひご覧ください。
ユニティ・テクノロジーズ・ジャパン株式会社 favicon forpro.unity3d.jp
ユニティ・テクノロジーズ・ジャパン株式会社

特に、

  • Canvasは分けて管理しよう
  • Canvasの表示・非表示はCanvasコンポーネント側で操作しよう
  • UIオブジェクトのプール方法に注意しよう

は根本的な設計に関わる部分なので、事前に理解しておくことをオススメします。

PixcelsPerUnit(ユニット毎の参照ピクセル数)決めてる?#

PixcelsPerUnit(略してPPU)は「ワールド空間座標の 1 単位分に相当する、スプライトのピクセル数」のことなのですが、言葉にすると何のこっちゃですね。

解説は下記がわかりやすかったので下記をご参照下さい。

【Unity】pixelsPerUnit (1ユニットのピクセル数)をおさらい【2D向け】
pixelsPerUnit (1ユニットのピクセル数)とはどういうものか、どう向き合えばよいかが何となく分かっ…
【Unity】pixelsPerUnit (1ユニットのピクセル数)をおさらい【2D向け】 favicon pengoya.net
【Unity】pixelsPerUnit (1ユニットのピクセル数)をおさらい【2D向け】

これも最初にベースとなる値を決めておかないと、後から変更しようとしたら画面レイアウトがぐちゃぐちゃになって結局作り直すレベルになってしまう恐れがあります。

いくつかのメイン画像(キャラクターや背景など)を使って、事前に検証しておくとよいでしょう。

その他、参考記事。

2D アートアセットの解像度選択
ゲーム関連のイベントやオンラインで、時々「Unity で 2D のゲームを、PC とモバイル向けに作っているのですが、アセットの解像度はどのくらいにするのがいいのでしょうか?」という質問を受けます。この質問に関して、すべてのケースをカバーするシンプルな答えはありません。このブログ記事は、読者の皆さまがプロジェクトにおいて、最善の選択について考える助けとなるように書きました。 近年、私たちは Unity での 2D ゲーム制作に役立つ機能を多数開発しています。スプライトアトラス、2D 物理、Tilemap 機能(長方形、六角形、等角法)、スプラインベースの Sprite Shape、2D アニメーションなどはそのほんの一例です。 Unity では、オブジェクトのサイズはピクセル単位で表記されていませんが、これが 2D ゲーム向けのアセットを製作するときに、アーティストを混乱させることがあります。アセットをどのくらいの大きさで作ればいいのかわからないのです。しかもゲーム開発の現場では、こうした質問をしても「時と場合による」という答えが返ってくるだけということがよくあります。しかし、ここではアセットの仕様決定をより簡単にするための考え方をいくつか示そうと思います。 注:このブログ記事の画像は、アーティストの Mikael Gustafsson が製作した 2D Forest Pack に収録されているアセットです。
2D アートアセットの解像度選択 favicon blog.unity.com
2D アートアセットの解像度選択
【Unity】ドット絵をボヤけさせないSpriteアセットの設定
Unityでドット画像がボヤけたりにじんだりしないようにするためのスプライト推奨設定とUnityの機能「2D Pixel Perfect」について解説します。
【Unity】ドット絵をボヤけさせないSpriteアセットの設定 favicon gamedev65535.com
【Unity】ドット絵をボヤけさせないSpriteアセットの設定

セーフエリア対応やってる?#

そもそもセーフエリアって何?#

スマホは機種によってノッチ(だいたい画面上部にある出っ張りみたいなの)やパンチホールがあります。なので、画面いっぱいに情報を表示してしまうと、見切れてしまう文字や押し辛いボタンなどが出てきてしまう恐れがあるんですね。

そこで、ノッチやパンチホールなどに邪魔されない最大範囲をセーフエリアと呼び、画面サイズとは別に定義することにしました。

セーフエリア対応とは?#

セーフエリア内であれば、どんな文字やボタンを表示しようと、機種側のデザインの問題で見切れたり押し辛いなどの問題が発生することはありません。

そこで、UIなどの視覚情報をセーフエリア内に収まるよう調整する対応のことを「セーフエリア対応」といいます。

具体的な対応方法は?#

セーフエリアは機種毎に違うため、その機種に応じてスクリプトで制御する必要があります。

詳細は下記記事参照。

【Unity】セーフエリアに対応する iOS/Android | くものす
はじめに uGUIで iOS / Androidのセーフエリアに対応するコードの紹介です。セーフエリアに合わせる箇所を上下左右で選択できるようになっています。開発済みのタイトルにも導入しやすいと思います。 コードサンプル UnityのScr
【Unity】セーフエリアに対応する iOS/Android | くものす favicon kingmo.jp
【Unity】セーフエリアに対応する iOS/Android | くものす

また、ヒエラルキー構造も要注意。

【UI開発】背景を画面に内包すると破綻する理由 - 渋谷ほととぎす通信
本記事はオオバも昔やらかしたUI開発初心者が陥りやすい罠について解説していきます。
【UI開発】背景を画面に内包すると破綻する理由 - 渋谷ほととぎす通信 favicon shibuya24.info
【UI開発】背景を画面に内包すると破綻する理由 - 渋谷ほととぎす通信

エリア外をクリックした時の挙動決めてる?#

スマホゲームあるあるですが、メニューなどを開いた際にメニュー外のエリアをクリックした時はメニューが閉じるようになっていることが多いかと思います。

そういうある種のお約束をデザインとして踏襲するかどうかは事前に決めておくとよいでしょう。

後からそういう仕掛けを持ち込もうとすると結構苦労します(体験者談)。

プレハブ&プレハブバリアント活用してる?#

特定のオブジェクトを使い回したり、一部分だけ変更したりすることができるプレハブ

Unityにおける大きなサポート機能ですね。

このプレハブは活用してるよ! という人も多いかと思いますが、プレハブバリアントの方はどうでしょうか?

プレハブバリアントは、元となるプレハブを継承した新しいプレハブを作る機能です。

何だか複雑になりそうで面倒臭そうと思われるかもしれません。ですが、この機能を使うと特にUIで変更に強い構造にすることができます。

例えば、フォントサイズは同じだが文字色が異なるテキストオブジェクトを作成する場合。

<プレハブのみ使用>

プレハブ①:フォントサイズA-文字色白 プレハブ②:フォントサイズA-文字色黒

<プレハブバリアントも活用した場合>

プレハブ①:フォントサイズA プレハブバリアント①(プレハブ①継承):文字色白 プレハブバリアント①(プレハブ①継承):文字色黒

もしベースとなるフォントサイズを変更したいとなったら、プレハブのみ使用パターンでは2つのプレハブのフォントサイズを変更する必要があります。ですが、プレハブバリアントではベースとなるプレハブ①のフォントサイズを変更するだけで済むのです(プレハブバリアントはその値を継承しているため)。

<プレハブのみ使用>

プレハブ①:フォントサイズA-文字色白 ⇒ フォントサイズBに変更 プレハブ②:フォントサイズA-文字色黒 ⇒ フォントサイズBに変更

<プレハブバリアントも活用した場合>

プレハブ①:フォントサイズA ⇒ フォントサイズBに変更(一箇所修正でOK!) プレハブバリアント①(プレハブ①継承):文字色白 プレハブバリアント①(プレハブ①継承):文字色黒

プレハブバリアントを活用すると、変更を最小限に抑える開発を行うことができるようになります。積極的に活用していきましょう!

重い処理把握してる?#

便利だからという理由で使っているコードが、実は公式・非公式問わず非推奨で有名だった、なんてことがままあります。

有名どころではGetComponent、Find、Destroyは処理が重いことで有名ですが、他にもちょっとした工夫で処理負荷を減らすことができるので、事前に色々調べておくとよいでしょう。

Unity 開発における C# のパフォーマンス最適化のTips
Unity で C# を扱う際のパフォーマンス最適化につながる Tips を紹介します。本記事は以下のページを参考に作成しています。 GetComponent<T>() や Camera.main を繰り返し ...
Unity 開発における C# のパフォーマンス最適化のTips favicon www.midnightunity.net
Unity 開発における C# のパフォーマンス最適化のTips
Unity 最適化メモ
Unity 最適化メモ favicon dskjal.com
Unityでの最適化について
Unityでゲームを作ったけど動作が重くてまともにゲームを進行出来ない!という時に最適化をしてゲームプレイに支障が出ないような方法を見ていきます。
Unityでの最適化について favicon gametukurikata.com
Unityでの最適化について

プライバシーポリシーをきちんと表明してる?#

昨今、プレイヤーの情報を全く収集・活用しないゲームというのはほとんど存在しません。

例えばオンラインを活用した機能、TwitterやLineなどの外部アプリを利用したシェア機能、ユーザの活動内容を収集するアナリティクスなどなど。

これらの情報を収集する場合、必ず下記の対応が必要となります。

  • プライバシーポリシーを明記したページの作成
  • ゲーム内にプライバシーポリシーへのリンク設置

これをしておかないとせっかく登録したアプリが削除されてしまうことがあるようです。ご注意をば!

Unityで作ったAndroidアプリがGoogle プライパシーポリシー違反で削除された時の解決方法
先週、Unityで開発した初のゲームアプリをGoogle Play にリリースしました。 Chicken Stop 開発元:KuneoApps 価格:無料(広告を含む) 平均評価: 5.0/5(合計件) インストール:1 […]
Unityで作ったAndroidアプリがGoogle プライパシーポリシー違反で削除された時の解決方法 favicon kuneoresearch.com
Unityで作ったAndroidアプリがGoogle プライパシーポリシー違反で削除された時の解決方法

JSON Utilityの対応型を把握してる?#

.NETに古くからあるJSON操作ライブラリに比べて、非常に軽量で有名なUnity独自のライブラリJSON Utility

皆さんもUnityでセーブデータなどを取り扱う際はこのJSON Utilityを使っていることが多いのではないかと思います。

が、ただただ軽量で完全に上位互換という訳でもないのです。

特に注意してもらいたいのは下記の点。

  • Dictionary型は対象外
  • DateTime型は対象外
  • List型をルートに使用するのは不可(何かのクラスのメンバー変数とかならOK)

他にも色々差異があるので、その他選択肢の候補も含めて、下記記事を一度確認しておくことをオススメします。

【Unity】JSONのシリアライズ・デシリアライズの性能比較 - PG日誌
Unity環境で使用できる JSON をシリアライズ・デシリアライズできるライブラリとパフォーマンスを調査したいと思います。 はじめに Unity で使用できるJSONライブラリ レギュレーション 確認環境 使用するJSON型 使用するクラスの定義 測定結果 1件を100回シリアライズ・デイシリアライズ シリアライズ デシリアライズ 10件を100回シリアライズ・デシリアライズ シリアライズ デシリアライズ 100件を100回シリアライズ・デシリアライズ シリアライズ デシリアライズ 1000件を1回シリアライズ・デシリアライズ シリアライズ デシリアライズ 結論 測定コード JsonTest…
【Unity】JSONのシリアライズ・デシリアライズの性能比較 - PG日誌 favicon takap-tech.com
【Unity】JSONのシリアライズ・デシリアライズの性能比較 - PG日誌

ビルド方法確認してる?#

これは開発前というより主に開発後期以降に役立つ話になりますが、Unityのデフォルトのビルド設定(Mono)はビルド速度優先で、処理速度優先ではないです。

そのため、実機起動時に長いロード時間が発生することがあります。

ビルド方法を「IL2CPP」に変更することで劇的に改善されるので、「自分の処理の組み方がだめなのかな……」などと悩んでしまうことがないようにしておきましょう(iOSはデフォルトで「IL2CPP」)。

その上でそれでも処理が遅いのであれば、改善を検討してみてください。

手順は下記参照。

IL2CPP を使用してプロジェクトをビルドする - Unity マニュアル
IL2CPP を使用してプロジェクトをビルドするには、Build Settings ウィンドウを開きます (File > Build Settings)。ビルドを作成するプラットフォームを選択し Player Settings&#8230; ボタンをクリックして、Inspector 内に Player 設定 ウィンドウを開きます。
IL2CPP を使用してプロジェクトをビルドする - Unity マニュアル favicon docs.unity3d.com
IL2CPP を使用してプロジェクトをビルドする - Unity マニュアル

また、Google Playは2019年8月以降、64bit版のみ対象としています。64bit版は現状「IL2CPP」でしかできないので、Androidアプリとしてリリースする場合は最終的に必ず「IL2CPP」でビルドすることになります。

詳細は下記参照。

【Android】IL2CPPビルド失敗時に考えられる3つの理由 - 渋谷ほととぎす通信
IL2CPPビルドに切り替えた途端、Android向けビルドでエラーが発生していませんか?Monoではうまくいっていたのに、IL2CPPにした途端にビルドが失敗する……。実はこの現象、Unityユーザーの間ではよくある悩みです。本記事では、IL2CPPビルドに失敗する代表的な原因とその対処法を紹介しています。Google Playストアに64bit対応アプリを公開するにはIL2CPPは必須。ぜひこの記事を読んで、ビルドエラーをスムーズに解決しましょう。
【Android】IL2CPPビルド失敗時に考えられる3つの理由 - 渋谷ほととぎす通信 favicon shibuya24.info
【Android】IL2CPPビルド失敗時に考えられる3つの理由 - 渋谷ほととぎす通信

おまけ.バックキー対応してる?(Android限定)#

Androidにはバックキーと呼ばれる、常に押すことができる共通・強制の「戻るボタン」があります。

違和感のないユーザ体験を提供するのであれば、「戻るボタン」を押しているのに何もゲーム内アクションが発生しないのは問題なので、このボタンを押下した際の挙動も事前に決めておくとよいでしょう。