おもちゃラボ

Unityで遊びを作ってます

【Unity2021対応】Androidビルドでエラーが出る場合の対処法

UnityでAndroidビルドした場合、さまざまなエラーに出くわすことになると思います。ここでは、Androidビルド時に出る各エラーについてその対処法をまとめています。

Unable to list target platformsのエラー

Unity側でAndroidSDKのパスは正しく設定されているのに次のようなエラーが出ることがあります。

Unable to list target platforms. Please make sure the android sdk path is correct. See the Console for more details. See the Console for details.

f:id:nn_hokuson:20180503102242p:plain:w400

これは、UnityがAndroid Studioのバージョンに対応できていない場合に出るエラーです。次の手順でAndroidの中のtoolsフォルダを更新するとビルドできるようになりました。

toolsフォルダを確認する

上のようなエラーが出た場合は、/Users/ユーザ名/Library/Android/sdkフォルダの中にあるのtoolsフォルダの中身を確認してみて下さい。

toolsフォルダにはFinderのメニューバーから「移動」→「フォルダへ移動」を選択し、「フォルダの場所を入力」の欄に上記のパスを入力して下さい。

f:id:nn_hokuson:20170905200204p:plain:w320

toolsフォルダの中身が左図のような状態にだとエラーが出るようです。右図のような場合にはエラーは出ません。
f:id:nn_hokuson:20170905201148j:plain:w480

toolsフォルダを更新する

下記のURLより少し古いtoolsフォルダをダウンロードし、現在のtoolsフォルダと置換してみて下さい(心配な方はバックアップを取っておいて下さい)

http://dl.google.com/android/repository/tools_r22.0.5-macosx.zip

再度AndroidでビルドすればUnityEditor.BuildPlayerWindow+BuildMethodExceptionのエラーは出ずに、正しくビルドできるようになるはずです。エラーが出てうまくいかない!という方は一度試してみて下さい!

それでもエラーが出る場合

Android SDK自体が古い可能性があります。Android Studioを普通にインストールしただけではAndroid SDKが更新されないことがあるようです。

その場合は「/Users/ユーザ名/Library/Android」フォルダ以下を全て消去した上で、Android Studioを起動すると、自動的にAndroid SDKの更新が始まります。

上記の手順で最新のAndroid SDKを入れた上で、再度toolsフォルダのみ更新してみて下さい。

Gradle build failedが出る

Unityのプロジェクトがあるパスに日本語が含まれていた場合、Gradle build failedのエラーが出ることがあります。プロジェクト名や、上位のフォルダ名などに日本語が含まれていないことを確認してください。

Gradle build failedが出る(Unity2019から)

Unity2019からはBuild Settingsの項目から「Build System」が削除されました。
したがって、Unity2019からは上記の方法では問題を修正できません。

Build Settingsに「Export Project」という項目があるため
これにチェックを入れてプロジェクトをAndroid Studio用にExportして下さい。

f:id:nn_hokuson:20191018212425p:plain:w300

ExportしたプロジェクトをAndroid Studioで読み込むと
Gradleをアップグレードしますか?という画面が出てくるので
OKを押して、Gradleをアップグレードします。

その後、Unityを再起動し、BUild Settingsの「Export Project」のチェックを外してから
普通にビルドすると、正しくビルドできます。

Gradle build failedが出る(Unity2018まで)

Unity2017.3.1以降を使っている場合、次のようなエラーが出ることがあります。

f:id:nn_hokuson:20180503133229p:plain:w350

CommandInvokationFailure: Gradle build failed.
/Library/Java/JavaVirtualMachines/jdk1.8.0_141.jdk/Contents/Home/bin/java -classpath "/Applications/Unity/PlaybackEngines/AndroidPlayer/Tools/gradle/lib/gradle-launcher-4.0.1.jar" org.gradle.launcher.GradleMain "-Dorg.gradle.jvmargs=-Xmx2048m" "assembleRelease"

Unity2017.3からはBuild SystemとしてGradleが標準になったのですが、これが原因でビルドに失敗することがあるようです。

ビルドシステムをもとに戻すためにはメニューバーからFile→Build Settingsを選択し、Build Systemの項目をInternalに設定して下さい。

f:id:nn_hokuson:20180503133358p:plain:w400

ビルド中にSelect Android SDK root Folderが出る

Select Android SDK root Folderが出た場合は、Macであれば「/Users/ユーザ名/Library/Android/sdk」、WIndowsであれば「C:\Users\ユーザ名\AppData\ Local\Android\sdk\」を選択してOKボタンを押して下さい。

Android SDK is outdatedというエラーが出る

インストールされているAndroid SDKのバージョンが、Unityで指定したSDKバージョンよりも低い場合に出るエラーです。とりあえず動かしたい場合は「Use Highest Installed」を選択すれば大丈夫です。

f:id:nn_hokuson:20180503102917p:plain:w450

実機転送する時にエラーが出る

Android携帯をPCに接続しているにも関わらず、「No Android Device Found!」や「Couldn't find Android device」など、Androidデバイスが見つかりません系のエラーが出ることがあります。

Make sure USB debugging has been enabled
Check your device, in most cases there should be a small icon in the status bar telling you if the USB connection is up.
If you are sure that device is attached then it might be USB driver problem, for details please check Android SDK Setup section in Unity manual.

f:id:nn_hokuson:20170314194612p:plain
f:id:nn_hokuson:20170314194618p:plain

Android開発者向けオプションをオンにする

開発者向けオプションをオンにするためには、「設定」 →「端末情報」を開き、「ビルド番号」 を 7 回タップして下さい。
「デベロッパになりました」という文章が出てきたら、設定画面に戻り端末情報の上に開発者向けオプションが表示されていることを確認してください。

開発者向けオプションをタップして

  • 開発者向けオプションがONになっていること
  • USBデバッグにチェックが入っていること

を確認して下さい。

f:id:nn_hokuson:20170314200239p:plain

ドライバを最新にする

お使いのAndroidデバイスの最新ドライバをインストールしてPCを再起動して下さい。

USB接続モードを確認する

Androidアプリをインストールするためには、メディア転送モード(MTP)ではなくファイル転送モード(MSC)である必要があります。
転送モードの変更は「設定」→「Xperia 接続設定(名前は機種により変わります)」→「USB接続設定」→「USB接続モード」で選択できます。

AndroidでPCからのアクセスを許可する

次のようなエラーがアプリ転送時に出る場合は、Androidのロック画面を解除してPCからのアクセスを許可して下さい。
f:id:nn_hokuson:20180503133021p:plain:w350

Unable to retrieve device properties. Please make sure the Android SDK is installed and is properly configured in the Editor.

USBデバッグが許可できない

アプリを転送する時に、端末側でBecause an app is obscuring a permission request と表示されて、USBデバッグが許可できないことがあります。

これは、画面上にオーバーレイして表示するアプリ(例えばスクリーンキャプチャなど)が起動していることが原因です。

該当のアプリを終了するか、設定→アプリ→画面左上の詳細設定ボタン(歯車など)→特別なアクセス→ほかのアプリに重ねて表示(フローティング表示するアプリ)をオフにして下さい。

その他の対策

これでも認識されない場合は、次の項目を試して下さい。

  • プロジェクトフォルダのパスに日本語が含まれていないか確かめる
  • USBポートを別のポートに差し替える
  • USBケーブルには通信用と充電用があるので、通信用ケーブルを使用する
  • PCを再起動する

【Arduino】WAVまたはMP3ファイルを再生する

PCなどと接続せず、Arduino単体で音を鳴らしたい場合、WAVやMP3の音源ファイルをSDカードにもつか、またはArduinoのフラッシュにおさめておく必要があります。

f:id:nn_hokuson:20170901092737j:plain

ここでは、小さな効果音などの比較的小さな音声ファイルを使うことを想定して、SDカードを使わずArduino単体で完結する音の鳴らし方を紹介します。

音声ファイルをテキストデータに変換する

「WAVまたはMP3ファイルを再生する方法」と書いておきながら、いきなりフォーマットを変換しちゃいます(笑)最近流行りのMP3ファイル鳴らす鳴らす詐欺と言われても仕方がない・・・

フォーマット変換にはAudacityとコマンドラインを使います。Audacityは高機能なフリーの波形編集ソフトです。こちらからダウンロードしてください。

audacity.softonic.jp

このAudacity、非常に高機能なんですが、今回はほぼファイルフォーマットの変換のみに使います。ピッチャー登場、ただしピッチングマシーン使用、みたいな。

使用したいWAVファイルまたはMP3ファイルをAudacityで開いたら、メニューバーから「トラック」→「ステレオからモノラルへ」を選択し1chのオーディオファイルに変換します。

f:id:nn_hokuson:20170901075236j:plain

現在、サンプリング周波数が44100Hzになっていると思います。これではファイルサイズが大きすぎるので、サンプリング周波数を8000Hzに変更してください。

f:id:nn_hokuson:20170901075325j:plain:w400

最後にフォーマットを指定してファイルを書き出します。メニューバーから「ファイル」→「オーディオの書き出し」を選択し、ファイルタイプなどを次のように設定してください。

項目 設定値
ファイルタイプ その他の非圧縮ファイル
ヘッダ RAW(header-less)
エンコーディング Unsigned 8-bit PCM

設定後の画面は次のようになりました。

f:id:nn_hokuson:20170901075429p:plain:w300

音声ファイルをテキストに変換する

Audacityで書き出したRAW形式の音声ファイルを、テキストデータに変換します。音声ファイルはバイナリ形式のため、xxdコマンドで出力します。

 xxd -i sample.raw

xxdコマンドは「-i」オプションを付けることでC言語の配列形式でデータを出力してくれます。超便利ですね〜!

出力結果は次のようになりました。

const unsigned char sample_raw[] = {
  0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x80,
  0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80,
  0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f,
  0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x80, 0x7f, 0x80,

・・・・・・

  0x7f, 0x80, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
  0x80, 0x80, 0x7f
};
unsigned int sample_raw_len = 1200;

Arduinoに音声でデータを書き込む

最後に、いま作成した音声データをArduinoに書き込み、再生するプログラムを作ります。Arduinoのプロジェクトを作成し、次のプログラムを入力してください。

const unsigned char sample_raw[] PROGMEM = {
  0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x80,
・・・・・・
  0x7f, 0x80, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
  0x80, 0x80, 0x7f
};
unsigned int sample_raw_len = 1200;

void setup() 
{
  pinMode(3, OUTPUT);
  TCCR2A = _BV(COM2B1) | _BV(WGM21) | _BV(WGM20);
  TCCR2B = _BV(CS20);
  
  play();
}

void play() {
  for (int i = 0; i < sample_raw_len; i++) {
    OCR2B = pgm_read_byte_near(&sample_raw[i]);
    delayMicroseconds(125);
  }
} 

void loop() {
}

ここでは、音声データの配列をコピペしてグローバル変数として宣言しています。配列を宣言するときに、配列の先頭に「PROGMEM」とつけるのを忘れないようにしてください。

この「PROGMEM」はデータをSRAMではなくフラッシュメモリに置くための指定子です。

音声データは比較的データサイズが大きいため、SRAMには入り切らないことが考えられます。そこで容量的に余裕のあるフラッシュメモリに音声データを置くようにします。

Arduinoでは、フラッシュメモリであれば32KB程度あるので、効果音程度なら5個くらい置くことが出来ます。

d.hatena.ne.jp

setup関数内では出力ピン及びPWMの設定を行い、play関数では音声データを1つづつ読み出し出力しています。8000Hzでサンプリングしているので、サンプリング間隔は1秒/8000=125usになります。そこで、1データぶん再生する毎に、delayMicroseconds関数を使って125usの間スリープしています。

ハードウエアを作る

今回、ハードウエアの構成は非常に簡単で(そりゃ、部品がスピーカしかないからな)、スピーカをArduinoの3番ピンとGNDに接続するだけです。

f:id:nn_hokuson:20170901091713p:plain

接続できたら、Arduinoにプログラムを転送してください。転送後リセットボタンを押して、音がなれば成功です!

f:id:nn_hokuson:20170901092728j:plain

まとめ&参考

この記事ではArduinoを使ってWAVファイルまたはMP3ファイルを再生する方法を紹介しました。長い楽曲ファイルには使えない方法ですが、効果音など短いサウンドはArduinoだけで完結する方法なので、結構便利ですよ!

qiita.com

【Blender】ボーンヒートウエイトのエラーが出たときに試す5つの解決策

Blenderでキャラクタにリグを入れる場合、最後にボーンとキャラクタのメッシュを選んで「Ctrl+P」→「自動のウエイトで」を選択しますね。

nn-hokuson.hatenablog.com

Rigfyを使っていても、この手順は同じです。

nn-hokuson.hatenablog.com

このとき、キャラクタのメッシュが複雑だと「ボーンヒートウェイト:一つ以上のボーンで解決に失敗しました」というエラーが出ることが度々あります。英語版の場合は「Bone heat weighting: failed to find solution for one or more bones」とエラーが出ます。

f:id:nn_hokuson:20170830194353p:plain:w400

度々のエラーが頻繁にエラーに変わり、だんだん鬱陶しくなってきたので、解決策をちゃんと調べてみました。

重複頂点を削除

編集モードでキャラクタの頂点をすべて選択して、「Wキー/重複頂点を削除」を選択します。これで、メッシュ中で重複している頂点を削除できます。

f:id:nn_hokuson:20170830194409p:plain:w220

ボーンの拡縮を適用

オブジェクトモードでボーンを選択してから、画面下のメニュー「オブジェクト」→「適用」→「回転と拡縮」を選択してください。これを適用することでボーンの回転とスケールがリセットされます。(ただ、なぜこれでボーンヒートウエイトのエラーが直るのかはわかならい・・・・笑)

f:id:nn_hokuson:20170830194428p:plain:w400

メッシュのスムージング

編集モードでキャラクタの頂点をすべて選択して、画面下のメニューから「メッシュ」→「頂点」→「頂点スムーズ」を選択してください。うまくいくことが多いですが、スムージングするため、モデルの形が崩れてしまうのが玉に瑕です・・・

f:id:nn_hokuson:20170830194444p:plain:w400

法線の再計算

編集モードでキャラクタの頂点をすべて選択して、「Ctrl+N」を押してすべての面の法線方向を再計算してください。一度で法線の方向が揃わない場合は、何度か「Ctrl-N」を繰り返してみて下さい。

ちなみに、「Nキー」で表示されるプロパティパネルの「法線」の項目にチェックを入れることで、法線が表示されます。

f:id:nn_hokuson:20170830195441j:plain:w600

細分化曲面モディファイアを適用する

キャラクタのモデルを選択して右側のウインドウから「追加」→「細分化曲面モディファイア」を選択してください。この細分化曲面モディファイアも、ボーンヒートウエイトのエラーには有効なことが多いです。

f:id:nn_hokuson:20170830194537p:plain:w250

ただ、細分化するだけあって、頂点数がかなり増えてしまいます。そこで、増えた頂点は「ポリゴン数削減モディファイア」を使って減らしておきましょう。