スマホでのゲーム開発

今まで学んだUnityの知識を拡張し、スマホに関する特別な開発方法を新しく勉強しましょう。

Unityを使用するスマホの開発

Unityでのスマホ開発:何が異なる?

今まで学んできたUnityの機能は大分に変わらない。物理処理に使う「Rigidbody」、当たり判定に使う「Collider」、サウンド再生に使う「AudioSource」、3Dシーンを見るための「Camera」などはそのまま使える

ただし、スマホのゲームを作るには、PCゲームと異なる部分もある:

入力

キーボード、マウス、コントローラーがないため、基本としてタッチの操作でゲームを遊ぶのですが、他の入力も利用できる

image.png

画面サイズが様々ながある

スマホだけではなく、iPad や Android のタブレットがあるため、様々な画面サイズに対応しなければならない。Canvasのアンカーポイントをうまく利用し、どの画面サイズであってもゲームのUIなどが正しく見えるようにしなければならない。

image.png

image.png

PCやゲーム機と比べて、計算力が弱い

CPUとGPU(グラフィックスボード)は PCと比べて弱いため、計算量を減らす必要がある。重い3Dモデルや複雑な処理にすると、ゲームが重くなったり、端末が熱くなったり、バッテリーが速く消費したりするため、ある程度軽く実行できるように設計しなければならない。

iOSの場合は

Androidと比べ、iOS(iPhone か iPad)の開発が大幅に異なる。

ハードウェア

開発端末(スマホ/タブレット)はもちろん必要で、その他に Mac のパソコンが必要です。普段 Mac Mini を使うケースが多い

image.png

ソフトウェア

Unity(Macバージョン)のほかに、Apple専用の開発ソフトウェア「Xcode」(Mac の開発環境)が必要である。(Windows の Visual Studioと同じ)

image.png

その他必要なもの

ハードウェアとソフトウェアを備えても、まだ開発できない。その他に:

Androidスマホの設定、Unityとの接続

まず、開発用のスマホを「開発者モード」にしなければならない。Android端末の「設定」を開き、「ビルド番号」を探す(以下の流れは端末メーカにより多少にことなる場合がある - 参照画像:Google Pixel 7)

image.png

image.png

image.png

「ビルド番号」を7回タップすると、開発者モードになる確認メッセージが表示される。


image.png


これで、開発できるようになった。なお、Unityとの接続できるため、USBデバッグを有効化しなければならない。同じ設定画面で:

image.png

image.png

image.png

を選択すると、Unityの開発で使えるようになる。なお、普通のスマホ操作に戻したいなら「開発者向けオプションを使用」を無効化してください。

Unityとの接続、実機で実行確認

設定のあとに、USBケーブルでPCと接続してください。スマホで以下のような画面が現れる:

image.png

許可してください(チェックボックスを入れなくても大丈夫)。

次、Unityのプロジェクト設定の編集が必要。普通「Windows」の開発になっているが、「Android」に切り替えないといけないので、Unity の「Build Profiles」を開き、プロジェクトのプラットホームを変えてください:

image.png

そして、Unityで作ったゲームをスマホで実行するには、Build Profiles でUSBで接続した端末を選び、「Build And Run」を押す。ゲームをビルドされ、端末に転送される。その後、実機で確認できる!

image.png

その他便利な設定

画面も向きを指定

スマホ開発では画面の向きを固定したい場合もあるので、「プロジェクト設定」で指定できる。

image.png

ここで選択できるのは:

Unityでスマホの画面を真似する

同じゲームは様々な端末でどう見えるのか確かめたいので、Unityは スマホ開発モード(Switch Platformの後)にすると、「Simulator」が現れる。「Simulator」でいろんな画面の向きとサイズを切り替えることができ、見え方をすぐ確認できる:

image.png

Simulator の中で、たくさんの端末を選ぶことができるので、必要だったら、UIを調整し、どの端末でも正確に見えるようにする:

image.png

スマホ機能のまとめ

新入力システム(Input System)

タッチ・マルチタッチ

有効化・無効化

using UnityEngine.InputSystem.EnhancedTouch;

// 有効化
EnhancedTouchSupport.Enable()

// 無効化
EnhancedTouchSupport.Disable()

各タッチのイベント

image.png

using Touch = UnityEngine.InputSystem.EnhancedTouch.Touch; 

// 画面を触れ始めたとき
Touch.onFingerDown += 処理メソッド;

// 指は移動中のとき
Touch.onFingerMove += 処理メソッド;

// 指が画面から放したとき
Touch.onFingerUp += 処理メソッド;

イベントを受け取るメソッド

// finger: 指のデータ
void 処理メソッド(Finger finger)
{
    // イベントを処理
}

タッチの全体状態

// 現在画面を触れている指の本数(int型)
Touch.activeTouches;

// 現在画面を触れている指のデータ(Finger配列型)
Touch.activeFingers;

指のデータ(Finger)

// タッチした画面の位置(Vector2型)
finger.screenPosition

// タッチした指の順番(int型)
// 0 = 1本目
// 1 = 2本目
// 2 = 3本目 
// …
// 9 = 10本目
finger.index

加速度センサー、スマホの傾き

有効化・無効化

using UnityEngine.InputSystem;

// 使えるか?
bool canUse = Accelerometer.current != null;

// 有効化
InputSystem.EnableDevice(Accelerometer.current);

// 無効化
InputSystem.DisableDevice(Accelerometer.current);

位置を求める

// 加速度の値(3次元ベクトル)
Vector3 value = Accelerometer.current.acceleration.ReadValue();

image.png

加速度センサーの座標系

旧入力マネージャー(Input Manager)

以下の機能は「旧入力マネージャー」を使用する機能であるため、「プレーヤー設定」でアクティブな入力を適切に設定しなければならない。

image.png

コンパス、方位

有効化・無効化

// 有効化
Input.compass.enabled = true;

// 無効化
Input.compass.enabled = false;

向きを求める

// 方位(0度~360度の実数)
float value = Input.compass.trueHeading;

trueHeadingは度単位で表す方位である:

image.png

GPSの位置(緯度経度)

有効化・無効化

// 有効化
Input.location.Start();

// 無効化
Input.location.Stop();

位置を求める

// 位置情報
LocationInfo position = Input.location.lastData;
float lat = position.latitude;  // 緯度
float lon = position.longitude; // 経度