Unity初心者が、入門書の「Unityの寺子屋 定番 スマホゲーム開発入門」を実践してみて、習得できた内容や難易度、つまづいた点などを備忘録としてまとめてみました。
今回、Unityのバージョンは2022.3.8f1で実施しました。
書籍でのバージョンとは異なりますが、特に問題なく進めることができました。
今回、使用した書籍はこちらです。
Unityの基本(Chapter1)
この章では、Unityのインストール方法や、Unityというゲームエンジンの構成、また簡単な操作などを説明しています。パソコンの操作に不慣れな方以外はさらっと読んでしまって大丈夫です。
放置ゲーム(Chapter2~3)
この章では、次のような放置ゲームを作ります。
💡このチャプターで習得できること💡
- ゲームオブジェクトの動的な生成と削除
- 物理エンジンを使用した衝突判定
- タッチイベント
- BGM/SEの再生
- 簡単なアニメーション(画像オブジェクトの位置とサイズの変更)
- アセット(DOTween)を使用した曲線移動アニメーション
- ゲームデータの保存と読み込み
初見で理解できなかったところ
インポートした画像の「Generate Mip Map」の設定
スプライトをかなり縮小した状態の画像をあらかじめ用意しておく設定。
書籍での説明文
よく分からなかったので調べてみました。
Mipmapping(ミップマッピング)機能を有効/無効に設定するオプションです。
この機能をONにすると、テクスチャの解像度を自動的に調整してくれます。3Dグラフィックスでは、視点から遠くにあるオブジェクトや、視角に対して斜めになっているオブジェクトのテクスチャを効率よく、かつ綺麗にレンダリングするために使用されます。
この機能をOFFにした場合、視点から遠いオブジェクトを描画する際に、そのテクスチャの多くのピクセルが少ないスクリーンピクセルにマッピングされます。これにより、テクスチャが不自然に見える可能性があります。
“Generate Mip Map”が有効になっていると、テクスチャは複数の異なる解像度のバージョンで保存されます。解像度のバージョンをmipmapレベルと呼びます。最も高解像度のテクスチャ(mipmapレベル0)から始まり、解像度を半分にしたテクスチャ(mipmapレベル1)、さらにその半分(mipmapレベル2)と続きます。このプロセスは、解像度が1×1ピクセルになるまで続きます。
レンダリング時には、各オブジェクトに最も適したmipmapレベルが選択されます。これは通常、オブジェクトのスクリーン上でのサイズと視点からの距離に基づいています。選択されたmipmapレベルは、テクスチャのサンプリングに使用され、結果として遠くのオブジェクトがより自然に見えるようになります。
Mipmappingはメモリと計算リソースを追加で使用しますが、一般的にはテクスチャの品質とレンダリングパフォーマンスが向上します。特に、遠くのオブジェクトや高い視野角を持つカメラで顕著な効果があります。
上記のように、3Dグラフィックス用の機能だから、今回のような2DゲームではOFFにしておくという事ですね。
Canvasの設定(Screen Match Mode)
実機の画面サイズとReference Resolutionの設定値が一致しないときの調整方法の設定。
書籍での説明文
書籍ではMatch = 1に設定していました。これもよく分からなかったので調べてみました。
Screen Match Modeの「Match Width or Height」オプションを選択した場合、Canvasはデバイスの画面サイズに合わせて幅または高さ(またはその中間)をスケーリングします。MatchスライダーはWidthとHeightの比率となっています。
Match = 0の場合:幅に合わせてスケーリングされます。
Match = 1の場合:高さに合わせてスケーリングされます。
Match = 0.5の場合:幅と高さの中間値でスケーリングされます。
テキストUI
今回、Unityのバージョンは2022.3.8f1を使用しました。書籍ではUIの「テキスト」と書いてありますが、今回使用したバージョンだと、Text(TMP)とText(Legacy)の2種類がありました。
とりあえず古いバージョンに合わせるならLegacyの方を使っておけば問題ないと思いました。
この2つの違いがわからなかったので調べてみました。
Text(Legacy)
基本的なテキスト表示には十分な機能を持っている。
シンプルなためリソース消費が少ない。
リッチテキストはサポートしているが、高度なテキストスタイリングオプションは制限がある。
ビットマップベースのフォントを使用している。
Unity最新バージョンではText(Legacy)の使用は非推奨となっている。
Text(TMP)
TMPはTextMeshProの略。
グラデーション、アウトライン、シャドウ、サブピクセルレンダリングなど、多くの高度なテキストスタイリングオプションを持っている。
ベクターベースのフォントを使用するため、スケーリングしてもテキスト品質が落ちない。
独自のフォントアセットを使用することができる。
高機能なため、多用するとパフォーマンスに影響を与える可能性がある。
不具合対策
オーブのタッチイベントでアニメーション実行中、そのアニメーション中のオブジェクトをなぞることで更にタッチイベントが発生してしまい、オブジェクトのデストロイ後にオブジェクトへのアクセスが発生してエラーメッセージが出力されました。
イベントが1回しか発生しないよう、以下のように対処しました。
using UnityEngine.EventSystems; // 追加
// オーブ取得
public void TouchOrb()
{
if(Input.GetMouseButton(0) == false) {
// ボタンが押されていない場合(エディタ上で同じ操作になるための措置)
return;
}
// 2回目以降のイベントを無効化する
GetComponent<EventTrigger>().enabled = false; // 追加
クリッカーゲーム(Chapter4)
この章では、前章の放置ゲームをベースにしてクリッカーゲームに改造します。
💡このチャプターで習得できること💡
- 他のアプリからの復帰判定
上記の「他のアプリからの復帰判定」以外は特に目新しいものは無いので、ここだけ見て終わらせてもOKです。
サイドビューアクションゲーム(Chapter5~6)
この章では、次のようなサイドビューアクションゲームを作ります。
💡このチャプターで習得できること💡
- 頂点スナップを使用したオブジェクトの配置
- マテリアルによる摩擦力の設定(キャラクターが壁などに引っ掛からないようにする)
- レイヤーを使用したキャラクターと地面の接地判定
- タグを使用してプレイヤーキャラが何と衝突したかを判定
- アニメーション(画像の切り替えとプレハブインスタンスに対する相対移動)
- シーンの遷移(Load)
初見で理解できなかったところ
タグとレイヤーの使い分け
タグとレイヤーの役割が似ていて、どう使い分けするのか分からなかったので調べてみました。
タグの使いどころ
単純に1つ1つのオブジェクトを識別したい場合はタグを使用します。
スクリプトでは、gameObject.tagでタグを取得/設定することができます。
また、1つのオブジェクトにつきタグは1つしか付けることができません。
具体例:
- オブジェクトの識別
プレイヤーオブジェクトに(Player)タグをつけて、敵オブジェクトに(Enemy)タグをつけて識別することができます。 - オブジェクトの検索
GameObject.FindWithTagやGameObject.FindGameObjectsWithTagメソッドを使用して、特定のタグが付いたオブジェクトを検索することができます。
レイヤーの使いどころ
複数のブロックをひとまとめに扱いたい場合(物理エンジンを使用する場合や、描画設定に影響を与えるような場合)はレイヤーを使用します。
スクリプトでは、gameObject.layerでレイヤーを取得/設定することができます。
また、1つのオブジェクトにつき所属できるレイヤーは1つのみですが、親オブジェクトと子オブジェクトは異なるレイヤーに所属することができます。
具体例:
- 衝突判定
レイヤーは主に衝突判定で使用されます。Physics settingsで特定のレイヤー同士の衝突を有効/無効にすることができます。 - レイキャスティング(Raycasting:線を投射する)
レイキャスティングの際に、特定のレイヤーを対象にしたり無視することができます。 - 描画設定
カメラのCulling Maskを使用して、特定のレイヤーのオブジェクトだけを描画したりしなかったりできます。
アプリ公開(Chapter7)
この章では、作成したアプリの公開先や収益化について解説されています。
実践してみた感想
初めてUnityを触りましたが、入門者の最初の1冊にちょうど良い難易度でした。
解説は図解もあって丁寧でわかりやすかったです。
ただし、C#が読めない方やオブジェクト指向が分からない方にとっては、C#スクリプトを書いていくところで、つまづいてしまう可能性が高いと思います。
スクリプトが良く分からないという方は、まずはC#やオブジェクト指向の基本から勉強することをお勧めします。
コメント