0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Androidの加速度センサーで操作するUnityゲームを作ってみた

Last updated at Posted at 2025-12-17

この記事はレコチョク Advent Calendar 2025 の18日目の記事となります。

はじめに

こんにちは!株式会社レコチョクでAndroidアプリ開発をしている我那覇です。

今年は、念願だったサンリオピューロランドのオールナイト音楽フェス「SPOOKY PUMPKIN 2025」に初めて参加してきました。出演アーティスト達のDJやパフォーマンスを楽しみながら、ピューロランドで朝まで過ごす時間は最高でした。

また、今年で3回目の出展となった Maker Faire Tokyo 2025 にて、私は初めて作品の制作に携わり、主にUnityでのゲーム部分の開発を担当しました。

制作したのは、M5Stickのジャイロセンサー情報を利用して照準を操作するシューティングゲームです。開発の検証段階ではNintendo SwitchのJoy-Conを使ったりもしたのですが、その流れで「普段使っているAndroid端末でも同じような操作ができないか?」と思い、試してみることにしました。

この記事では、端末上で手軽に動作確認が行える「Unity Remote 5」のセットアップ方法と、実際にこれを利用しながらUnityでAndroid端末の加速度センサーを使ったアプリ作りについて紹介します。

※加速度センサーの利用部分に着目するため、ゲーム自体の細かい実装については割愛しています。

完成イメージ

play_image_1.GIF

Android端末の加速度センサーを利用してキャラクターを操作する簡単なゲームを作成しました。
端末を横向きに持ち、左右に傾けることでキャラクターが動きます。

開発環境

  • macOS: 15.6.1
  • Unity: 6000.1.8f1
  • Android端末: arrows We F-51B (Android 11)
  • Unity Remote 5: 5.5

テスト環境の構築

はじめに、UnityエディタとAndroid端末を接続するためのテスト環境を整えます。

毎回実機にビルドして動作確認を行うのは時間がかかるため、手軽に確認できる方法を調べたところ、Unity Remote 5 というツールを見つけました。
必須ではありませんが、今回は端末のセンサーを取得して動作を検証することが目的のため、このツールを使って試していきます。

Unity Remote 5とは?

Unity Remote 5は、Unityでのモバイルアプリ開発を効率化するための公式モバイルアプリです。

PCのUnityエディタで再生しているゲーム画面を接続した端末にリアルタイムで表示し、逆に端末からのタッチ操作やセンサー情報をPC上のUnityエディタに送り返してくれます。

ビルドをすると時間がかかりますが、Unity Remote 5を使うと開発中のゲームがモバイルデバイスでどう表示され、どう操作できるかをすぐに確認できます。

セットアップ手順

  1. 準備
    • Android端末に、Google Playストアから Unity Remote 5 をインストールしておきます
  2. Unity側の設定
    • File > Build Profiles > Platforms の一覧から「Android」を選択し、右下の Switch Platform ボタン押下でプラットフォームを切り替えます
    • Edit > Project Settings > Editor を開き、「Device」をAny Android Deviceに設定します
  3. 端末側の設定
    • 端末の「開発者向けオプション」を有効にし、「USBデバッグ」をオンにします
    • PCと端末をファイル転送が可能なUSBケーブルで接続します(※充電専用ケーブルでは動作しません)
    • 端末に接続確認のポップアップが表示されたら、「ファイル転送」を選択します
  4. Unityエディタ側でゲームを再生
    • Android端末で先にUnity Remote 5アプリを起動しておきます
    • Unityエディタ側で再生ボタン▶を押します
    • 少し待つと端末の画面にゲームが表示され、操作が可能になります

うまくいかない時

最初はなかなか接続できず、開発者設定のオン/オフを切り替えたり、ケーブルを抜き差ししたりと、かなり手こずりました。もし接続できない場合は、特に以下の点を確認してみてください。

⚠️ USBケーブルと接続方法

  • USBケーブルは「ファイル転送」が可能なものを使用し、接続時に端末に表示されるモード選択でも、必ず「ファイル転送」を選択してください(「充電」や「USBテザリング」では認識されません)

⚠️ adbサーバーの競合

  • Android Studioなど他のツールを併用していると、ADBサーバーが競合してエラーが出ることがあります
  • その場合、Unityのコンソールに以下のようなエラーが表示されます
Multiple ADB server instances found, the following ADB server instance have been terminated due to being run from another SDK. Process paths:

 解決方法

  • 実行中のADBサーバープロセスを終了させる必要があるため、ターミナルを開き、以下のコマンドを実行します
adb kill-server

実行後、Unityエディタの再起動とUSBケーブルの再接続をすることで私は解決できました。

セットアップ手順の詳細やその他の解決策については、以下の記事が参考になりました。

端末の傾き(加速度)を取得する

センサーの座標系を理解する

次に、Unityでセンサーの値を取得します。端末の傾きを利用するために、まずはセンサーがどのように方向を認識しているかを確認します。

sensor_image.png

センサーのXYZ軸は、端末をデフォルトの向き(縦)で持った時を基準に、以下のように定められています。

  • X軸: 画面の水平右方向
  • Y軸: 画面の垂直上方向
  • Z軸: 画面の手前(こちら側)方向

この軸は端末本体に固定されているため、端末を横向きにすると軸も一緒に回転します。

参考:センサーの座標系

実際にセンサーの値を取得する

それでは実際に、Unityで Input System を使ってセンサーの値が取得できているかを確認します。

デバイスが加速度センサーを搭載していて、Input System がそれを認識しているかを確認するには Accelerometer.currentという形式でアクセスします。もしセンサーが利用可能であれば有効なAccelerometerオブジェクトを返し、利用できない場合はnullを返します。

センサーはデフォルトで無効になっているため、InputSystem.EnableDevice()を呼び出してセンサーを有効にします。これにより、センサーからの入力データの読み取りが開始され、Update()メソッドで正確な加速度値を取得できるようになります。

補足:コンソールにDebug.Logで出力しても良いのですが、今回は手元の端末でも数値の変化が確認できるようにテキストを配置しています。

参考:Sensor support

public class DebugText : MonoBehaviour
{
    [SerializeField] private TextMeshProUGUI debugText;

    void Start()
    {
        // 加速度センサーを有効化
        if (Accelerometer.current != null)
        {
            InputSystem.EnableDevice(Accelerometer.current);
        }
    }
    // Update処理
}

センサーからはX,Y,Zの3軸の値がVector3という形式でまとめて返ってくるため、まずはこれを取得します。
その中から.xのようにして特定の軸の値を取り出します。

void Update()
{
    if (Accelerometer.current != null && debugText != null)
    {
        // 加速度を取得
        Vector3 acceleration = Accelerometer.current.acceleration.ReadValue();
        
        // テキストを更新(小数点以下2桁)
        debugText.text = $"X: {acceleration.x:F2}\n" +
                       $"Y: {acceleration.y:F2}\n" +
                       $"Z: {acceleration.z:F2}";
    }
}

sensor.GIF

端末をそれぞれの軸方向に傾けると、画面の数値がリアルタイムで変化します。
これで、センサーの軸の動きとUnityでの値の取得方法が確認できました!

傾きでオブジェクトを操作する

センサーの値が取得できることを確認できたので、その値を使ってキャラクターを操作します。ここでは以下の2ステップに分けて説明します。

  • ステップ1:センサーから値を取得し、移動量に変換
  • ステップ2:計算した移動量をキャラクターの座標に反映

1. センサーから値を取得し、キャラクターの移動量に変換

 // 傾き感度
[SerializeField] private float tiltSensitivity = 500f;

// X軸の傾きを取得
Vector3 acceleration = Accelerometer.current.acceleration.ReadValue();
horizontalInput = acceleration.x * tiltSensitivity;
  • ReadValue()で取得した値の中から、.xでX軸の値だけを取り出します
  • センサーから得られる元の値は-1.0〜+1.0の範囲と小さいため、tiltSensitivity(傾き感度)を掛けて、キャラクターがどれだけ機敏に動くかを調整しています

2. 移動量をキャラクターの座標に反映

次に、計算したhorizontalInputを使ってキャラクターの新しいX座標を計算し、位置を更新します。

// 現在の位置を取得
Vector2 currentPos = rectTransform.anchoredPosition;

// 新しいX座標を計算
float newX = currentPos.x + horizontalInput * Time.deltaTime;

// 位置を更新
rectTransform.anchoredPosition = new Vector2(newX, currentPos.y);
  • 現在のX座標 currentPos.x に対して、先ほどの移動量 horizontalInput を足しています
  • このとき Time.deltaTime(1フレームを描画するのにかかった時間)を掛けて、移動する距離を計算しています
  • そして、今回は左右にだけ動かしたいため、currentPos.yでY座標には計算前の元の値をそのまま使ってキャラクターの縦の位置を固定しています

参考:【Unity】Input Systemでキャラクターを移動させる

完成したもの

play_image_2.GIF

端末の傾きでキャラクターを操作する簡単なゲームが完成しました!
AIで生成した謎キャラクターのネコ(?)もいい味を出しています。

背景とりんごのアイテムについては以下サイトの素材を使用しました!

まとめ

この記事では、端末上で手軽に動作確認が行える「Unity Remote 5」のセットアップ方法と、UnityでAndroid端末の加速度センサーを利用する方法について紹介しました。

センサーの座標系を理解し、実際に値を取得してキャラクターを動かすところまで、Unity Remote 5を使うことでリアルタイムに確認しながら開発を進められました。

実装自体は思ったよりシンプルでしたが、軸を傾けて数値の変化を確認しながら、どの値を使えば意図した動きになるか試行錯誤する過程が面白かったです。
皆さんも是非試してみてください!

ここまで読んでいただきありがとうございました!
明日の レコチョク Advent Calendar 2025 は19日目「NTAG215の保護設定を実践する:Lock / AUTH0 / ACCESS / PWD の設定ガイド」です。お楽しみに!

この記事はレコチョクのエンジニアブログの記事を転載したものとなります。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?