ヽ|∵|ゝ(Fantom) の 開発blog? ホーム »Unityプラグイン
このページの記事一覧

【Unity】【C#】動的にオーディオファイルの読み込みと再生をする  


 プラグイン ver.1.16 の簡易音楽プレイヤーを作る際にちょっと調べたんだけど、VideoPlayer と違って、基本的に WWW を使うのが常套みたいだね。プラグインのデモスクリプトとしては「EasyMusicPlayer.cs」と「ExternalStorageTest2.cs」の2種類で書かれているが、基本は同じなので再利用しやすい部分を抜粋して書いておくことにした。実際に使う際にはもう少し手を加えた方が便利かも知れない。



(※) Unity 5.6.3p1 - 2018.1.5f1 / Windows10(x64) で確認



■オーディオファイルの読み込みと再生のコード

●オーディオファイルの読み込みと再生
using System.Collections;
using System.IO;
using UnityEngine;

public class AudioLoadTest : MonoBehaviour //※クラス名は任意
{
public AudioSource audioSource; //インスペクタで AudioSource をセット
public string path = "/storage/emulated/0/Music/sample.mp3"; //※ファイルは任意

//外部からの呼び出し用メソッド
public void LoadAudio(string path)
{
if (Path.GetExtension(path) == ".m4a") //※"m4a"は再生できないっぽい
{
Debug.Log("Not supported audio format.");
return;
}

StartCoroutine(LoadToAudioClipAndPlay(path));
}

//ファイルの読み込み(ダウンロード)と再生
IEnumerator LoadToAudioClipAndPlay(string path)
{
if (audioSource == null || string.IsNullOrEmpty(path))
yield break;

if (!File.Exists(path)) {
//ここにファイルが見つからない処理
Debug.Log("File not found.");
yield break;
}

using(WWW www = new WWW("file://" + path)) //※あくまでローカルファイルとする
{
while (!www.isDone)
yield return null;

AudioClip audioClip = www.GetAudioClip(false, true);
if (audioClip.loadState != AudioDataLoadState.Loaded)
{
//ここにロード失敗処理
Debug.Log("Failed to load AudioClip.");
yield break;
}

//ここにロード成功処理
audioSource.clip = audioClip;
audioSource.Play();
Debug.Log("Load success : " + path);
}
}

// Use this for initialization
private void Start () {
//起動時に読み込むときなど
LoadAudio(path); //※メインからの呼び出し例
}
}

 ここではインスペクタに path を入力し読み込むようになっているが、外部呼び出し用のメソッド「LoadAudio()」の引数にパスを渡すようになっているので、通常は「Start()」内の呼び出しは削除した方が良いだろう(ただのメインからの呼び出し例のため)。

 オーディオファイルの読み込みには WWW を使っているが、あくまでローカルストレージを想定しているので、頭に "file://" を付けているのに注意して欲しい。インターネットからダウンロードしたい場合は "file://" を取り除いて URL形式("http://~")を直接与えれば良いと思う。しかしその場合、タイムアウトを付けたり、キャッシュ付きなどを使う必要があるかも知れない(パケ代もかかるので)。

 WWW を使っている分にはオーディオ形式は気にしなくても良いが、再生するには "mp3" や "ogg", "wav" などが良いようだ。"m4a" は読み込み(ダウンロード)はできるが、再生はできなかった(Unity2018.1.5f1時点)。

 スマホで使うにはアクセス権などが必要になることもあるが、とりあえずはこれだけで読み込みと再生はできる。以降では更にプラグインを利用して、自由にファイルを選択して読み込む方法もやってみよう。



■スマホ(Android)のストレージから読み込んで再生する

 ここではプラグインを使ってストレージを開き、再生する方法を書いておこう。といってもスクリプト自体は上記の例そのままで良いので、後はプレファブをシーンに置き、コールバックをセットするだけだ。プラグインのインストールからはじめる場合は、以前の記事を参考にして欲しい。


1.先に作った「AudioLoadTest.cs」スクリプトを適当な GameObjectにアタッチし、「AudioSource」を追加し、インスペクタでセットドラッグ&ドロップでセットしよう。「Play On Awake」はオフに、「Loop」はオンにしておくと良い(※曲を繰り返し再生する場合)。



2.シーンにプレファブ「StorageOpenAudioController」(~/FantomLib/Prefabs/System/ 以下。検索で探すと楽)を置き、インスペクタで「Mime Types」に読み込むオーディオ形式の MIME type を入れておく。ここでは mp3/m4a = "audio/mpeg", ogg = "audio/ogg","application/ogg" を入れているが、任意で良い(※デフォルト=空の状態ではすべてのオーディオ形式となる)。




 なお、ogg の MIME type が2種類書かれているが、プロバイダ(ストレージ)の種類によって、同じ拡張子でも MIME type が違ってたりするので注意が必要だ。例えばローカルストレージでは "application/ogg" となり、GoogleDrive などでは "audio/ogg" で認識される。今回の再生の場合、ローカルストレージの "application/ogg" だけでも良い(複数指定して置けば、どのプロバイダ[ストレージ]でも見えるようになる)。直接開けるか否かはアプリの対応状況によるため、実際に使う際にはあらかじめ絞り込んでおくのも良いだろう。

※ここで言う「プロバイダ」とはアプリが持つ情報提供プログラムのことである。Android アプリはそれぞれアプリごとにプロバイダを持つことができ、それによりユーザーに与える情報を制限することができる。この例の場合、ローカルストレージや GoogleDrive(これは1つのアプリである)、OneDrive(これもアプリ)ごとということになるので、「ストレージ」ごとになることと同義になる。


3.シーンにロード用のボタンを置き、コールバック「OnClick」に「StorageOpenAudioController.Show」を登録する。これでボタンを押すことにより、ストレージが開く。






4.プレファブ「StorageOpenAudioController」に戻り、「OnResult」に先に作ったスクリプト「AudioLoadTest.LoadAudio」を登録する(※手順2の画像のようになる)。これでストレージから選択したオーディオファイルのパスがスクリプトに渡され、読み込みが成功すれば再生される(※"m4a" は再生できないようなので(Unity2018.1.5f1 時点)、LoadAudio() で拡張子チェックをしてるが、実際に使うには拡張子で絞るようにしても良い。「EasyMusicPlayer.cs」(~/FantomLib/Scripts/Example/ 以下)にはその例も書かれているので必要なら参照)。なお、GoogleDrive などクラウドストレージからは直接再生(情報取得)できないので注意。その場合は一旦ローカルストレージにコピー(ダウンロード)すれば再生できるようになる。これで読み込みと再生だけなら完成だ。


※実機でログを確認するにはシーンに「DebugConsole」(~/FantomLib/Prefabs/System/ 以下)を置き、「AudioLoadTest.cs」内の「Debug.Log()」→「XDebug.Log()」にしておく。ビルドするには「デモのビルド」と基本的に同じ(シーンだけ変える)なので必要なら参照。


 あとは「プレイ/停止」など操作できるとなお良いね。このあたりのサンプルはデモシーン「ExternalStorageTest」の「ExternalStorageTest2.cs」に、またはシーン「MusicPlayerExample」の「EasyMusicPlayer.cs」(~/FantomLib/Scripts/Example/ 以下)に書かれているので、コピペしても良いと思う。「EasyMusicPlayer.cs」には連続再生やシャッフル、次の曲/前の曲、プレイリストに追加/削除など、一般的な操作の例を入れてあるので、必要なら参照して欲しい(最低限の機能で良いなら、そのまま使っても良い→「UnityChanInOtakuCity」はそのまま使ってる)。



※他、様々な機能を使ったデモが同梱。Unity×Androidアプリ開発に!

※サンプルで使っているループ曲を含んだライブラリも配信中。全31曲!



(関連記事)
【Unity】AssetStore版 FantomPlugin のセットアップ
【Unity】Androidのトーストやダイアログ、通知、音声認識、ハード音量操作など基本的な機能を使えるプラグインを作ってみた
【Unity】【C#】VideoPlayer で動画の終了判定をする


このコンテンツの一部には『ユニティちゃんライセンス』で許諾されたアセットが使用されています。
Portions of this work are licensed under Unity-Chan License


スポンサーサイト

category: Unity

thread: ゲーム開発

janre: コンピュータ

tag: Unityライブラリ  Unityプラグイン  C# 
tb: 0   cm: --

【Unity】スマホで簡易360度(パノラマ, 全天球)ビューワを作る  


 タイトルは "スマホ"(※Android)となっているが、実際には他のプラットフォームでも関係ないので、作り方を覚えおけば色々応用が効くだろう。特に全天球への画像(動画)貼り付けは VR に使えばそのまま背景にできるので、Cardboard VRGearVROculus Go などにも簡単に流用できる(というより、元々「VRコンテンツ開発ガイド 2017」を以前読んでいたので、それをスマホに応用した)。ミクシータ(RICHO THETA) など360度カメラを持っている人は、保存した画像をそのまま使えるので試してみると良い(持ってなくても Google Play のアプリのサンプルでスマホに画像を保存すれば確認できる)。ARに応用してる例もあるね。


 なお、今回の記事はプラグインのギャラリー読み込みデモ(GalleryPickTest)のセットアップも兼ねている。サンプルシーンを使えば1から構築する必要はないので、すぐに試してみたい人はプラグインをダウンロードして欲しい。AssetStore版(ver.1.15以降[無料])GoogleDrive版の2つがあるが、基本的にはどちらも同じものだ。好きな方で構わない。

>>GoogleDrive版 プラグイン&サンプルをダウンロード
(Google Drive を利用。画面右上にあるダウンロードアイコンを押す)

>>AssetStore版をダウンロード


 プラグイン自体のセットアップは以前の記事を参照して欲しい(>>GoogleDrive版 | >>AssetStore版)。デモが入っているパスは GoogleDrive 版では「Assets/_Test/」に、AssetStore版は「Assets/FantomPlugin/Demo/」となっているので適宜置き換えて欲しい。ファイル名は基本的に同じだ。


(※) Unity 2018.1.0f2 / Windows10(x64) / Galaxy S7 Edge (Android 7.0) で確認



■全天球素材のダウンロードと設定(360度ビューワ)

 360度のビューワを作る際には法線が内側を向いている球状メッシュを使う必要がある(Unityのデフォルトの球状メッシュは外側向き)。要するに球の内側から覗いたとき映像が見える必要があるので、通常は3Dモデリングツールなどで素材を作らなくてはならない。しかし幸いにも素材を提供してくれている方がいるので、有り難く使わせて頂こう(素材を提供してくれる人は神ですね(笑))。以下のページにある「Sphere100.fbx」(※ページ内で検索するとすぐ見つかる)をダウンロードして欲しい。

UnityとOculusで360度パノラマ全天周動画を見る方法【無料編】 で「Sphere100.fbx」をダウンロード(※直接ダウンロードが簡単)。


 ダウンロードが完了したら、プラグインのサンプルシーンを使って実際にセットアップしてみよう。プラグインを利用している箇所はスマホから画像や動画のパスを取得しているだけなので、あらかじめプロジェクトに素材を含んでいる分にはプラグイン機能を使う必要はない。画像や動画を動的に貼り付ける部分は Unity の機能なので、コピペして色々なアプリに応用すれば良いだろう(「GalleryPickTest2.cs」にまとめてある)。それでは以下の方法で、サクッと簡単に360度のビューワを作ってみよう(笑)。


1.ダウンロードした「Sphere100.fbx」を Unity のプロジェクトにドラッグ&ドロップしよう(任意のフォルダで良い)。またインポートした「Sphere100」をクリックして、インスペクタで「Model>Scale Factor」を「1000」にしておく(大きさは任意でも良い)。





2.次にギャラリーから画像を取得するデモシーン「GalleryPickTest」(GoogleDrive版は「Assets/_Test/Scenes/」, AssetStore版は「Assets/FantomPlugin/Demo/Scenes/」内にある。検索を使うと簡単)を開こう。このデモはスマホの標準ギャラリーアプリを開き、画像や動画のパスを取得して Unity に取り込むものだが、オプション(形状)の「360 degrees」にはダミーのテキスト「Please replace with 'Sphere100', and set 'TextureMat' as material.」が表示されるのみで何も表示されない(プレイして「360 degrees」を押してみるとテキストが表示される)。このダミーテキストを全天球メッシュに置き換えることで、簡易360度ビューワにすることができる。



3.ヒエラルキーから「Stage」を開こう。この中にある「Sphere100 (360degrees Dummy)」(画像用)と「Sphere100Video (360degrees Dummy)」(動画用)が全天球ダミーなわけだが、この階層にインポートした「Sphere100」をドラッグ&ドロップしてオブジェクトを配置しよう。「Sphere100 Video」となってる方は「Sphere100」を複製(Ctrl-D)して名前を変えただけのものである。



4.各オブジェクトの Position が (0, 0, 0) となっているのを確認したら、次に Scale を変更しておこう。大きさは任意で良いが、ポイントは X軸を負の値にしておくことだ。これは正の値で試して見ればわかると思うが、カメラは球の内側から覗く感じになるので、正の値だと画像が左右反転して見える。なので、負の値にしておけば人の目には正しい方向に見えるというわけだ。またついでにオブジェクトに影を付ける処理は必要無いので、すべてオフにしておくのも良い(このデモでは影の無いマテリアルを使うので必須ではないが[※後述↓手順5])。

●画像用全天球「Sphere100」


●動画用全天球「Sphere100 Video」

※マテリアルのセットは下記(↓手順5)


5.あとは全天球に画像を映し出すためにマテリアルをセットしよう。GoogleDrive版では「Assets/_Test/Metarials/」に、AssetStore版は「Assets/FantomPlugin/Demo/Metarials/」に画像用の「TextureMat」、動画用の「VideoRenderTextureMat」があると思うので(プラグイン ver1.15以降)、それらをそれぞれ「Sphere100」「Sphere100 Video」の「Materials」にセットして欲しい。上記(↑手順4)のインスペクタのような感じになる。


 ちなみにこの「TextureMat」と「VideoRenderTextureMat」は特別なものではなく、「TextureMat」はプロジェクトビューで右クリックして「Create>Material」で新規マテリアルを作成し、インスペクタで「Shader」を「Unlit>Transparent」にしただけのもので、「VideoRenderTextureMat」の方は、先に「Create>Render Texture」を作っておき、同じように新規マテリアル(Create>Material)で「Shader」を「Unlit>Texture」にして、テクスチャに作っておいた「Render Texture」をセットしただけのものだ。ほぼデフォルトのままなので、必要あれば調整などは適当にやって欲しい(※ただし、このデモでは GalleryPickTest2.fitRenderTexture = true のとき、Render Texture を動画サイズに合わせて動的に生成するので、実際には使ってない。fitRenderTexture = false にするとセットした「VideoRenderTexture」を使うようになる[※解像度が固定サイズで良いときなどに使うと、負荷が少し軽くなる])。


6.最後にデモスクリプトの「GalleryPickTest2」をヒエラルキーで選択して、「Sphere」と「Video Sphere」にそれぞれ「Sphere100」「Sphere100 Video」のオブジェクトをセットしよう(初期状態では「Dummy」がセットされている)。これで準備は完了だ。






 エディター上でプレイして「360 degrees」をクリックしたら、背景が真っ白になったら成功だ(画像が読み込まれてないので白いだけ)。ビルドして実機で確認する方法はこちらの記事を参照して欲しい。

デモのビルド




 通常の画像を読み込んでも良いが、天井と底面の方を見ると収束してるので、せっかくなので全天球画像を読み込んでみよう。なんとあの日本列島360の全天球静止画がBOOTHにて無料で配布されている(まさに神!)。これをダウンロードしてスマホのストレージにコピーしよう。ギャラリーから読み込むと超美麗な360度画像を楽しむことができる(利用方法は規約に従ってね)。




 また以下のミクシータのアプリをインストして、保存したサンプルの画像を読み込んでみるのも良い。VR空間で見ると、まるでその場所にいるようで更に面白い。GearVR はそのままホーム>ギャラリーで観れるが、Cardboard なら色々ビューワアプリが出てるので観てみると良いだろう。ちなみに Unity 使える人なら、Cardboard VRGearVR も作るのはそう難しくはない(むしろVR内操作 UI 作る方が難しいね(笑))。しかし、全天球メッシュにあらかじめ画像を貼り付けておけば簡単に360度にできるので、挑戦してみるのも良いだろう。

RICOH THETA Type HATSUNE MIKU (Google Play) ※カメラが無くても、サンプル画像が入っているので、保存すれば360度画像を試せる。
VU Gallery VR 360 Photo Viewer (Google Play) ※Cardboard の360度ビューワアプリ
【Unity】GearVR アプリをビルドする







(関連記事)
【Unity】AssetStore版 FantomPlugin のセットアップ
【Unity】Androidのトーストやダイアログ、通知、音声認識、ハード音量操作など基本的な機能を使えるプラグインを作ってみた
【Unity】GearVR アプリをビルドする
【Unity】ARCore を使って現実世界にプロ生ちゃんを召喚してみる



初音ミク」はクリプトン・フューチャー・メディア株式会社の著作物です。
© Crypton Future Media, INC. www.piapro.net (PCL)

このコンテンツの一部には『ユニティちゃんライセンス』で許諾されたアセットが使用されています。
Portions of this work are licensed under Unity-Chan License

category: Unity

thread: ゲーム開発

janre: コンピュータ

tag: Unityライブラリ  Unityプラグイン  VR 
tb: 0   cm: --

【Unity】Unity2018 でビルドエラー「CommandInvokationFailure: Gradle build failed.」が出る  


 Unity2018 はどうも内部的なシステムの開発要件が上がったのか、インストして既存のプロジェクトをビルドしてみようとしたら、いくつかエラーが出たので備忘録。ちなみに 2017.4.2f2 までは何のエラーも出なかった状態からなので、開発環境によってはサードパーティの SDK など(Java SDK, Android SDK/NDK, Android Studio 等)のアップデートも必要になるかも知れない。結構大変なので、開発中であったり、Unity2018 の必要がないのなら、アップデートは先送りした方が良いかもね。またプラグインも使ってみようと思ったらビルド中にエラーが出たので、その辺りの対処方法も書いておこう。



(※) Unity 2018.1.0f2 / Windows10(x64) / Galaxy S7 Edge (Android 7.0) で確認



■新規プロジェクトでいきなりエラー「ArgumentException: Value does not fall within the expected range.」が出る

 インストして起ち上げたら、いきなり出たのがこれ(笑)。ググったらすぐに対処法が出てきたので正確にはメッセージは覚えてないが、要するにインストールされている Visual Studio 2017 のマイナーバージョンが合ってなかったらしい(?)。なので、最新版にアップデートすればエラーは出なくなる

Visual Studio Tools for Unity (最新版をインストール)
Error with Unity and Visual Studio Bridge (VS project not updating when new scripts added)



■「CommandInvokationFailure: Gradle build failed.」以降のエラーメッセージに「failed to find Build Tools revision 28.0.0」のようなバージョン番号が出ている。


 これはどうやらインストしてある Android Studio(ないし SDK)にある Build Tools のバージョンが合ってない(?) みたいなのだが、私の場合「28.0.0rc2」が入っていたのにダメだった(SDK Manager で "28.0.0" を探したが、なぜか "~rc1", "~rc2" しか無い(笑))。仕方がないので試しに "28.0.0rc2" を削除して「27.0.3」を残したらエラーが出なくなった(Android Studio で「Tools>SDK Manager」を開き、「SDK Tools」タブでダイアログの下の方にある「Show Package Details」にチェックを入れると細かいバージョンを追加・削除できる)。ただこれはかなりいい加減な応急処置なので(笑)、バージョンが上がって安定版が出たら設定し直したほうが良いかも知れない。





■「CommandInvokationFailure: Gradle build failed.」以降のエラーメッセージに「Cannot read packageName from~(パス)\AndroidManifest.xml」と出る。

※このエラーは Unity2017.1.7f1 で fix されたようです。
Unity 2018.1.7f1 リリースノート
[ANDROID] $APPLICATIONID TAG IN A MANIFEST CAUSES GRADLE BUILD TO FAIL


 これはプラグインを使ってみようと思ったら出た。普通にビルドする分には関係ないかも知れない。「AndroidManifest.xml」をオーバーライドしている場合、Unity2018 の仕様(バグ?)なのか、「Build Settings...」で「Build System」を「Gradle」にしていると、でパッケージ名が追加されないようだ(Unity2017.4.2f2 までは自動で追加される)。なので独自に「AndroidManifest.xml」を設定している場合、「manifest」タグに「package」属性を手動で追加しておく必要がある。「package」にはプロジェクトのパッケージ名「Edit>Project Settings>Player>Other Settings>Identification>Package Name」と同じものを書いておく。または「Build System」を「Internal」にするとエラーは出なくなる(ビルドできるようになる)。

● "AndroidManifest.xml" に追加する部分(※"package" はプロジェクトのパッケージ名にする)
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.company.productName">
・・・(略)・・・
</manifest>

●PlayerSettings

※パッケージ名(com.company.productNam)は必ずアプリ固有の名前(ID)として設定する必要アリ。

または「Build System」を「Internal」にするとエラーは出ない


 当プラグインでもエラーが出たときは、上記の方法でビルドできるようになる(※スマホ [Android7.0] でも動作確認済み)。




(関連記事)
【Unity】AssetStore版 FantomPlugin のセットアップ
【Unity】【C#】モバイルビルド中の警告:Game scripts or other custom code contains OnMouse_ event handlers.~ を消す
【Unity】アイコン画像のフォーマット警告:Compressed texture XXX is used as icon. This might compromise visual quality of~ を消す
【Unity】5.6 の Canvas の警告:Shader channels Normal and Tangent are most often used with lighting~ を消す
【Unity】InitializeUnityExtensions: Must have a valid path for the plugin [XX] (XX:番号) というエラーの修正方法


category: Unity

thread: ゲーム開発

janre: コンピュータ

tag: Unityトラブルシューティング  Unityライブラリ  Unityプラグイン 
tb: 0   cm: --

【Unity】標準以外のセンサー(歩数計や心拍数など)を使う(Android)  


 せっかくなので、Android で Unity の標準センサー(Input.acceleration, compass, gyro)以外のセンサーを使う方法を書いておこう。またついでに Android のセンサーの値の仕様も覚えておくと、新しいセンサーが搭載されたときにも役に立つかも知れない。あと、センサーの利用にはその端末がそのセンサーを搭載しているか、パーミッションが与えられているかなどという注意点もあるので覚えておこう。ここでは歩数計や心拍数センサーを例に挙げてるが、他のセンサーでも基本的には変わらない。



 センサーのデモシーンは「SensorTest」(AssetStore版は「Assets/FantomPlugin/Demo/Scenes/」以下、GoogleDrive版は「Assets/_Test/Scenes/」以下)にまとまっているので、コピペして使うのも良いだろう。プラグイン自体が無い場合は以下から GoogleDrive版をダウンロードしても良い。

>>プラグイン&サンプルをダウンロード
(Google Drive を利用。画面右上にあるダウンロードアイコンを押す)


 プラグインのセットアップから始める場合には以前の記事を参考にして欲しい。AssetStore版を利用してる場合はこちらの記事を、GoogleDrive版を利用している場合はこちらの記事を参照して欲しい。どちらもコード自体は同じなので同じように使えると思う。パスなどの違いは適宜置き換えて考えて欲しい。


(※) Unity 5.6.3p1 - 2017.3.0f3 / Windows10(x64) / Galaxy S7 Edge (Android 7.0) で確認



■歩数センサー(Step Counter Sensor)を使う

 歩数センサーは歩く度にカウントアップされるセンサーだ。いわゆる歩数計である。大まかにはあらかじめ用意してあるプレファブを利用する方法とスクリプトを書く方法があるが、両方解説しておこう。基本的にはプレファブとその「~Controller」スクリプトを使う方が簡単だろう。自分で細かく制御したいときには直接スクリプトを書く感じにすれば良いと思う。

 ちなみに歩数センサーはある程度の速度で歩かないと検知しないようだ。ゆっくり歩いたり、あまり揺れないように動いたりすると反応しない。端末に搭載されているハードによっても違うらしいので、センサーを扱う場合はある程度値にレンジ幅を持たせた方が良いだろう(例えば照度センサーとか近接センサーなどは結構違うらしいので、きっちりした値で判別などすると、端末によって違う挙動になってしまう)。



●プレファブ「StepCounterSensorController」の利用

 AssetStore版は「Assets/FantomPlugin/FantomLib/Prefabs/Sensors/」以下、GoogleDrive版は「Assets/FantomLib/Prefabs/Sensors/」以下にプレファブ「StepCounterSensorController」があるのでヒエラルキーに置こう。

 以下はデモシーン「SensorTest」に使っているプレファブのキャプチャだが(掲載時点:ver.1.9)、簡単にパラメータの説明を書いておこう。


Sensor Delayセンサーの検出速度定数。具体的な速度は以下のようになっているが、実際には「可能であればより速く」受信される。センサーによっては常に一定のものもある。基本的にセンサー取得は高負荷なので、速度に問題ないなら遅い方が良い(※「Normal」推奨)。
・Fastest:0ms
・Game:20ms (50fps)
・UI:66.6ms (15fps)
・Normal:200ms (5fps)
Start Listening On EnableUnity のライフサイクル OnEnable() で自動的に開始される。このオプションに関わらず OnDisable(), OnDestroy(), OnApplicationQuit() では停止される。
On Sensor Changedオリジナルのセンサーの値のコールバック。Android から送られてくる値そのままである。歩数センサーの場合、OS がリブートされてからのカウント数が返される(センサーを稼働している全アプリ共通となる)。詳細は後述を参照
On Errorエラー時のコールバック。起動時(Start())に歩数センサーがサポートされてなかったら、エラーメッセージ「Not Supported: (センサーの種類)」が返される
On Step Counter Sensor Changed適宜変換されたセンサーの値のコールバック。歩数センサーの場合、スクリプトが実行されてからの歩数となる。int 型に変換されている。

 プレファブを利用する場合はヒエラルキーに置いてインスペクターで設定するだけだ。大ざっぱには「Start Listening On Enable」をオンにするか否かとコールバックを登録するくらいだろう。コールバックの値は「On Sensor Changed」「On Step Counter Sensor Changed」のどちらを使っても構わないが、アプリで実行してからの歩数を取得するなら「On Step Counter Sensor Changed」の方が簡単だろう。センサー系のプレファブには必ず2つの値を返すコールバックがあるが、元の値が「On Sensor Changed」、便宜上簡単に扱える値に変換(型なども)したものがもう1つのコールバックと考えて良い。



●スクリプト(StepCounterSensorController)での利用

 クラス「StepCounterSensorController」を利用する場合は、おおよそ以下のように使うと考えて良い。簡略したものを書いておくので、適宜修正して手を加えて欲しい。

using FantomLib;

//※実際には FindObjectOfType は負荷の高い関数なので、インスペクタで予め登録できるようにしておくなど工夫した方が良いかも。
StepCounterSensorController stepConter = FindObjectOfType<StepCounterSensorController>();
if (stepConter != null && stepConter.IsSupportedSensor) { //サポートのチェック
stepConter.StartListening(); //取得開始
}

if (stepConter != null && stepConter.IsSupportedSensor) { //サポートのチェック
stepConter.ResetCount(); //0にする(OnStepCounterSensorChanged にのみ反映)
}

if (stepConter != null && stepConter.IsSupportedSensor) { //サポートのチェック
stepConter.StopListening(); //取得停止
}

 なお、「~Controller」は一連の機能をまとめただけのものなので、AndroidPlugin を直接使う場合には以下のようになる。それぞれのコードは何らかのメソッドなどに書いてあると考えて欲しい。

using FantomLib;

//取得開始処理
#if !UNITY_EDITOR && UNITY_ANDROID
if (AndroidPlugin.IsSupportedSensor(SensorType.StepCounter)) { //サポートのチェック
AndroidPlugin.SetSensorListener(SensorType.StepCounter, SensorDelay.Normal, gameObject.name, "ReceiveValues");
}
#endif

//取得停止処理
#if !UNITY_EDITOR && UNITY_ANDROID
if (AndroidPlugin.IsSupportedSensor(SensorType.StepCounter)) { //サポートのチェック
AndroidPlugin.RemoveSensorListener(SensorType.StepCounter);
}
#endif

//値の取得(コールバックハンドラ)
void ReceiveValues(string json)
{
if (string.IsNullOrEmpty(json))
return;

SensorInfo info = JsonUtility.FromJson<SensorInfo>(json); //JSONから変換
if (info.type == (int)SensorType.StepCounter) {
//info.values(OS がリブートしてからの歩数:float 型)
//を用いて何らかの処理など
}
}

//センサーの解放
#if !UNITY_EDITOR && UNITY_ANDROID
AndroidPlugin.ReleaseSensors();
#endif

 センサーの値は Android から Unity へ JSON の形式で送られる。そのフォーマットはセンサーの種類(int 型)とその値(float 型の配列)となっている。JSON 変換してるために余計負荷は高くなるので、Unity で標準的に使えるセンサー(Input.acceleration, compass, gyro)があったらそちらを使った方が良いだろう。ただし同じセンサーでも値は違ったりするので(型、ベクトルと四元数、符号など)注意して欲しい。詳細は後述の「センサーの値の仕様」や公式のデベロッパーマニュアルを参照して欲しい。

 なお、プラグインでのセンサーリスニング(SetSensorListener)のコールバック登録は1つのみとなる。複数登録できないので注意して欲しい(常に上書きになるため、最後のものが有効になる)。複数のメソッドをコールバックハンドラにしたい場合は、インスペクタのコールバック(UnityEvent)に複数のメソッドを登録すれば良い。



■心拍数センサー(Heart Rate Sensor)を使う

 心拍数(HeartRate)センサーは端末の裏に指を当てることによって(Galaxy S7 Edge の場合、裏面のカメラの横にあるセンサーに指を近づけると赤く光るので、そこにしばらく指を置く)心拍数(単位:bpm)を計測するセンサーである。他にも「HeartBeat」センサーというものもあるが、こちらは心拍数のピークを検出するものらしい(Galaxy S7 Edge には搭載されてないので未確認。一番高い心拍数を検出?)。

 心拍数センサーを使う場合は、端末に搭載しているか否かもだが、それとは別に「バイタルサインの取得」パーミッションも必要になる。パーミッションが必要なものはアプリ起動時に以下のような確認メッセージが出るものがあるので注意しよう。また Google Play などに公開したときにも権限として表示される。アプリと関係ない権限を付けるとインストールを拒否られる確率も高くなるらしいので、最低限にすることを心がけた方が良いだろう。パーミッションの設定Google Play でのフィルタリングなどは以前の記事に書いておいたので参照して欲しい。

パーミッションの設定
センサー利用時のフィルタリング(Google Play)




●プレファブ「HeartRateController」の利用

 基本的には歩数センサーのプレファブとあまり変わらないので、設定パラメータはそちらを参照して欲しい。違いは「On Heart Rate Sensor Changed」コールバックくらいで、それだけ解説を載せておこう。なお、こちらもデモシーン「SensorTest」に置いてあるプレファブをキャプチャしたものである(掲載時点:ver.1.9)。


On Heart Rate Sensor Changed適宜変換されたセンサーの値のコールバック。心拍センサーの場合、1分間の心拍数[bpm] になる(float 型)。「On Sensor Changed」の values[0] と同じもの。



●スクリプト(HeartRateController)での利用

 考え方は「StepCounterSensor」の場合とほとんど変わらない。「HeartRateController」を利用する場合は、サポートに加えてパーミッションもチェックも加えているだけだ(※実際には心拍数センサーの場合、パーミッションが与えられてないとサポートも不可になる)。簡略したものを書いておくので、適宜手を加えて利用して欲しい。

using FantomLib;

//※実際には FindObjectOfType は負荷の高い関数なので、インスペクタで予め登録できるようにしておくなど工夫した方が良いかも。
HeartRateController heartRate = FindObjectOfType<HeartRateController>();
if (heartRate != null && heartRate.IsSupportedSensor && heartRate.IsPermissionGranted) { //サポートとパーミッションのチェック
heartRate.StartListening(); //取得開始
}

if (heartRate != null && heartRate.IsSupportedSensor && heartRate.IsPermissionGranted) { //サポートとパーミッションのチェック
heartRate.StopListening(); //取得停止
}

 なお、「~Controller」は一連の機能をまとめただけのものなので、AndroidPlugin を直接使う場合には以下のようになる。それぞれのコードは何らかのメソッドなどに書いてあると考えて欲しい。

using FantomLib;

//取得開始処理
#if !UNITY_EDITOR && UNITY_ANDROID
if (AndroidPlugin.IsSupportedSensor(SensorType.HeartRate)
&& AndroidPlugin.CheckPermission("android.permission.BODY_SENSORS")) { //サポートとパーミッションのチェック
AndroidPlugin.SetSensorListener(SensorType.HeartRate, SensorDelay.Normal, gameObject.name, "ReceiveValues");
}
#endif

//取得停止処理
#if !UNITY_EDITOR && UNITY_ANDROID
if (AndroidPlugin.IsSupportedSensor(SensorType.HeartRate)
&& AndroidPlugin.CheckPermission("android.permission.BODY_SENSORS")) { //サポートとパーミッションのチェック
AndroidPlugin.RemoveSensorListener(SensorType.HeartRate);
}
#endif

//値の取得(コールバックハンドラ)
void ReceiveValues(string json)
{
if (string.IsNullOrEmpty(json))
return;

SensorInfo info = JsonUtility.FromJson<SensorInfo>(json); //JSONから変換
if (info.type == (int)SensorType.HeartRate) {
//info.values を用いて何らかの処理など
}
}

//センサーの解放
#if !UNITY_EDITOR && UNITY_ANDROID
AndroidPlugin.ReleaseSensors();
#endif

 他のセンサーでも返ってくる値が違うだけで、やり方は同じようなものなので、色々使ってみると良いだろう。

 以降にはセンサーを利用する際の共通な仕様を書いておくので、一読しておけば自分でスクリプトを組んだり、改造するときなどにも理解しやすいと思う。



■センサーの値の仕様など

 詳細は公式のデベロッパーマニュアルを見て欲しいが、このプラグインでは基本的にセンサーの種類定数(ID:int 型)と取得したセンサーの値の配列(float[] 型)の2つになる。センサーの値に関してはその配列の長さはまちまちで、1つのものもあれば 15個あるものもある。値もトリガー系(だいたい名前が「~Detect」となっている)のものはトリガされたら「1.0」が送られるのみで、待機している間は何も送ってこないものもある。また、端末に搭載されているハードによっても値は異なるので、センサーを扱う場合はある程度値にレンジ幅を持たせた方が良いだろう(例えば照度センサーとか近接センサーなどは結構違うらしいので、きっちりした値で判別などすると、端末によって違う挙動になってしまう → 例えば照度センサーの場合「LIGHT_~」(Constant Value を使う)のように目安が定義されている)。自分で実装するときには注意しよう。

 他にプレファブにもそれぞれのセンサー専用 Controller 以外にも「AndroidSensorController」「AndroidSensorIntController」というものが用意されている(~/FantomLib/Prefabs/Sensors/ 以下)。これらのプレファブも含めて「On Sensor Changed」コールバックの引数はセンサーの値をそのまま返すと考えて良い。「AndroidSensorIntController」の方はセンサーの種類定数が int 型になっているだけで内容は同じだ。SensorType にはデベロッパーマニュアルの値(Constant Value)をそのまま使っているが、例えばウェアラブルデバイスやタブレットなどで特殊なセンサーを搭載している場合には int値で指定すれば取得できることがある(通常のスマホでもデベロッパーマニュアルに載ってない ID のセンサーがいくつか搭載されている。ただしこれらは他のデバイスでは利用できないと考えた方が良い)。

(デベロッパーマニュアル)
各センサーの定数値
各センサーの取得値(values 配列に入る値)

 それ以外にも「AndroidManifest.xml でのパーミッションの設定」や「Google Play に公開する際に、センサー利用のフィルタリング」も合わせて考えておいた方が良いだろう。そのあたりは以前の記事を参照して欲しい。

パーミッションの設定
センサー利用時のフィルタリング(Google Play)


※この記事のUnityアセットはプラグインとして配布されています。



(関連記事)
【Unity】AssetStore版 FantomPlugin のセットアップ
【Unity】Androidのトーストやダイアログ、通知、音声認識、ハード音量操作など基本的な機能を使えるプラグインを作ってみた


category: Unity

thread: ゲーム開発

janre: コンピュータ

tag: Unityライブラリ  Unityプラグイン 
tb: 0   cm: --

【Unity】AssetStore版 FantomPlugin のセットアップ  


 お陰様でアセットストアのバージョンも1.8となり、初期の頃からするとかなりの数の機能を追加してしまったので、改めてセットアップや各機能の仕様、プレファブなどの使い方などを含めて少しずつ記事にしていこうと思う。また、以前書いた記事はどちらかというとプラグイン内部の Java コードを中心に解説しているので、これからは Unity での C# コードの例を中心に解説していこう。


 なお「アセットストア版」と「Google Drive 版」の違いは、元々私が個人的に公開していたのが「Google Drive 版」であり、「アセットストア版」は Unity Asset Store の提出要件に従って内容を置き換えたものになっている。例えばストア版はその要項に「解説は英語であること」「他者の素材は使わないこと(フリー素材等)」「"Plugins"など特殊なフォルダも提出フォルダにまとめて入れること」等があり、その辺りに修正が入れてある(素材も自作した)。しかし、基本的にコードの内容は変わらない



 また常に最新版は Google Drive に置いてあり、ストア版は英訳したり、素材を入れ替えたりした上で、提出→審査通過後にリリースされるので、だいたい2~5日ほど遅れる。だが、実質的には変わらないものと考えて良い(同梱されている素材は一般的に利用されているものであり、添付してあるドキュメントに従っていれば、他に利用しても構わない)。日本語のコメントが欲しい場合は「Google Drive版」を利用しても良いだろう。

>>プラグイン&サンプルをダウンロード
(Google Drive版 [Japanese only]。画面右上にあるダウンロードアイコンを押す)


(※) Unity 5.6.3p1 - 2018.1.8f1 / Windows10(x64) / Galaxy S7 Edge (Android 7.0) で確認



■プラグインのセットアップ

1.まずは Asset Store からパッケージをダウンロードしてプロジェクトにインポートしよう。私の環境だけかも知れないが、なぜかローカルに既にダウンロードされているキャッシュのせいで最新版にならないことがあるので、そういう場合はエクスプローラなどでローカルのHDDのパス「C:\Users\(ユーザ名)\AppData\Roaming\Unity\Asset Store-5.x」(バージョンによってフォルダ名は異なるかも)フォルダ以下にある「Fantom\ScriptingGUI\Android Native Dialogs and Functions Plugin.unitypackage」を削除すれば、強制的に最新版をダウンロードできるようになる(通常は更新されるハズなのだが…)。

Android Native Dialogs and Functions Plugin



2.インポートが終わったら、フォルダの構成を少し変更する必要がある。「FantomPlugin」フォルダを開くと配下に「Plugins」フォルダがあるが、これをドラッグ&ドロップで「Assets」の直下に移動しよう。この「Plugins」フォルダは特殊なフォルダであり、プラグインの実体(fantomPlugin.aar)やマニフェストファイル(AndroidManifest.xml)などが入っている。「FantomPlugin」フォルダにあるドキュメント「fantomPlugin_ReadMe_jp.txt」("_en" は英語版)にも書いて置いたので、上手く動作しなかったときなどは確認して欲しい。

●インポート直後の状態


●「Plugins」フォルダを「Assets」直下に配置しなおした状態


※アセットストア版は規定上1つのフォルダにまとめなくてはいけないため移動する必要があるが、「Google Drive 版」の場合ははじめから「Assets」直下にあるので移動の必要はない。



■デモのビルド

 動作確認のためにもここでデモをビルドしてみよう。プラグインを利用したアプリをビルドするにはいくつかの注意点がある。それは「"AndroidManifest.xml"の使用」と「要求 API Level」「必要なパーミッション」「画面回転の設定」などである。一度理解してしまえば、他のものでもだいたい同じなので、1つ1つやってみよう。



●「AndroidManifest.xml」を用意する

 プラグインの全ての機能を利用するには Unity デフォルトで使われるアクティビティ「UnityPlayerActivity」をオーバーライドした「FullPluginOnUnityPlayerActivity」(※このプラグイン用のアクティビティ)を使う必要がある。デモのマニフェストファイル「AndroidManifest_demo.xml」にはあらかじめ全ての機能が利用できるように設定されているので、これを [Ctrl + D] などで複製して「AndroidManifest.xml」にリネームして欲しい。デモの場合は「必要なパーミッション」「画面回転の設定」は設定されているのでこれで完了である。
(※) 独自のマニフェストを使ってビルドする場合「Unable to find unity activity in manifest. You need to make sure orientation attribute is set to fullSensor manually.」という警告が出るが、「デフォルトのUnityアクティビティが見つからない」「画面回転を自分で設定してね」という内容なので無視して良い。





●「要求 API Level」の設定

1.ファイルメニューから「File>Build Settings...」を開こう。ダイアログが出たら、「Platform」から「Android」を選択し、「Switch Platform」ボタンを押してプラットフォームを Android に切り替えよう。ボタンがグレーアウトしたら切り替え完了なので、そのまま「Player Settings...」ボタンを押して「PlayerSettings」を開いて欲しい。



2.「PlayerSettings」では「Other Settings」を開いて「Identification」の「Minimum API Level」を最低「Android 4.2 (Jelly Bean' (API Level 17)」に設定する必要がある。実際にはプラグインの機能によって要求される API Level があるので、それに合わせて変更して欲しい。ここでは簡略のため一番低い API Level にしている。デバイスの OS が必要 API Level を満たしてないときは機能は無視されるので注意しよう。



3.ついでに「Other Settings>Identification」では「Package Name」も設定しておこう。これはアプリの ID となるものなので、ユニークなものにする。名前の付け方などは公式のデベロッパーマニュアルを参照して欲しい(※「com.Company.ProductName」のままだとエラーが出てビルドできない)。

アプリケーション ID の設定



●シーンを追加してビルドする

 ここまでできたら、「Build Settings」のダイアログに戻り、「Scenes In Build」にビルドするシーンを追加しよう。ここではとりあえず「Assets/FantomPlugin/Demo/Scenes」(Google Drive版は「Assets/_Test/Scenes/」)直下にあるシーンを全てドラッグ&ドロップで追加してしまおう。「Build」(または「Build And Run」)ボタンでビルドして実機で色々な機能を試してみよう(権限許可がいくつか出るが、全て許可して下さい)。




(※) Unity2018.1.0~1.6 でビルド中にエラー「CommandInvokationFailure: Gradle build failed.~Cannot read packageName~」が出たときは以下の記事を参照して下さい(Unity2018.1.7 以降は Fix されてます)。
【Unity】Unity2018 でビルドエラー「CommandInvokationFailure: Gradle build failed.」が出る



■Android ビルドをもう少し詳しく

 ついでに、ここではもう少しつっこんだ Android ビルドの内容も解説しておこう。Android のアプリ(拡張子:.apk)にはマニフェストファイル(AndroidManifest.xml)と、そこに記述された起動アクティビティUnityPlayerActivity)が必要である(※あくまで Unity の場合。サービスのみのアプリなどは別の方法を用いる)。これらは通常のビルドの場合、Unity がデフォルトで用意してくれるので、自分で用意する必要はない。実際のファイルは Unity をインストールしたパスにあるのでエクスプローラなどで覗いてみるのも良いだろう。

(AndroidManifest.xml)
C:\Program Files\Unity\Editor\Data\PlaybackEngines\AndroidPlayer\Apk
(UnityPlayerActivity)
C:\Program Files\Unity\Editor\Data\PlaybackEngines\AndroidPlayer\Source\com\unity3d\player に「UnityPlayerActivity.java
(※パスはユーザーによる)

 プラグインはこれらを拡張したものとなる(※他の方法もあるが、ここでは割愛。必要なら公式マニュアルを参照)。前述した「AndroidManifest.xml」の解説に加えて、いくつかの設定方法も書いておこう。

(デベロッパーマニュアル)
App Manifest Overview
AndroidManifest.xml

(※) 独自のマニフェストを使ってビルドする場合「Unable to find unity activity in manifest. You need to make sure orientation attribute is set to fullSensor manually.」という警告が出るが、「デフォルトのUnityアクティビティが見つからない」「画面回転を自分で設定してね」という内容なので無視して良い。

(※) Unity2018.1.0~1.6 でビルド中にエラー「CommandInvokationFailure: Gradle build failed.~」が出たときは以下の記事を参照して下さい(Unity2018.1.7 以降は Fix されてます)。
【Unity】Unity2018 でビルドエラー「CommandInvokationFailure: Gradle build failed.」が出る



●パーミッションの設定

 機能によってはパーミッション(権限)が必要になるものがある。デモをビルドして起動したとき、初回に出る「録音を許可」「ストレージアクセスの許可」「バイタルサインの取得許可」のように出てくるあれだ(ダイアログが出ない権限もある)。Unity をデフォルトで使っている分には自動的に付加してくれるが、プラグインなどでオーバーライドする場合は自分で設定して置かなければならないことも多いので、覚えておくと良いだろう。なお、権限が許可されてない機能を使おうとした場合、エラーが出たり無視されたりするので、基本的には使えるかどうかをはじめに1度で良いので確認した方が良い(※このプラグインの場合、だいたい「IsSupported~」というメソッドやプロパティが用意してある。「~Controller」を使う際は、起動時に自動的にチェックされる)。

 権限の設定に関しては「AndroidManifest.xml」に以下のように書く。例えば「録音許可」のパーミッションの場合、以下のようになる。

<uses-permission android:name="android.permission.RECORD_AUDIO" />

 これら権限は通常「<manifest>~</manifest>」タグの間に書く。普通はデモのときに利用した「AndroidManifest_demo.xml」のように先頭に書いた方が良いだろう。また、Google Play などでアプリをダウンロードする際にも要求される権限として表示されるので、必要のない権限は書かない方が良い。あまりに要求権限が多いとインストールを拒否られる確率も高くなるので最低限にすることを心がけよう。

 なお、このプラグインで各機能に対して必要な権限はインポートした「Plugins/Android/」フォルダに「Permission_ReadMe.txt」にまとめてある。「AndroidManifest_demo.xml」には全ての権限は入っているので、そこから必要なものだけコピペするのも良いだろう。

(デベロッパーマニュアル)
パーミッション



●センサー利用時のフィルタリング(Google Play)

 センサー利用においては権限要求とは別に、デバイスがそのセンサーを搭載しているか否かという問題もある。このプラグインの場合、搭載されてないセンサーは単純に無視されるが(これも「IsSupported~」メソッドでチェックし、「~Controller」で利用できない場合無視している)、Google Play においてはフィルタリングをして、そもそも使えない端末ではダウンロードさせないようにしておくと親切だろう。

 例えば「心拍センサー」を搭載してない機種をフィルタリングしたい場合、以下のように書く。

<uses-feature android:name="android.hardware.sensor.heart_rate" android:required="true" />

 これもパーミッション同様「<manifest>~</manifest>」タグの間に書く。センサーの文字列に関しては、デベロッパーマニュアルで各センサーの名前定義(Constant Value)を使えば良い。

(デベロッパーマニュアル)
Using Google Play filters to target specific sensor configurations
各センサーの名前定義(※Constant Value の文字列を使う)



●画面回転の設定

 画面回転(デバイスの縦置き、横置き)に関しては「AndroidManifest.xml」と Unity の PlayerSettings の両方を合わせておく必要がある。合ってない場合、意図した画面にならないことがあるので注意しよう。

 「AndroidManifest.xml」側での設定の場合、<activity>」タグの「android:screenOrientation」属性がその設定となる。デベロッパーマニュアルには非常に多くの値があるが、Unity で利用する場合はおおむね「縦置き」(=portrait)か「横置き」(=landscape)であり、デバイスの上下、左右の向きによって回転するか否かの「sensor」を組み合わせると考えて良いだろう。例えば横置きでデバイス方向が決まっている場合「landscape」で、横置きでデバイスの方向により回転させる場合「sensorLandscape」のようになる。VRでは横置き固定、2D横スクロールゲームでは横置きで回転可といった具合だ。縦横どちらでも回転できる場合は「sensor」だけで良い。以下に「横置きでデバイスの向きにより回転」の例を挙げておこう。

<activity(…略…)
android:screenOrientation="sensorLandscape"
(…略…)/>
</activity>

 インポートした「Plugins/Android/」フォルダには「AndroidManifest-FullPlugin_Landscape.xml」「AndroidManifest-FullPlugin_Portrait.xml」「AndroidManifest-FullPlugin_Sensor.xml」が入っているが、これらはそれぞれ「sensorLandscape」「sensorPortrait」「sensor」が設定してある。

 Unity 側の設定の場合、メニューから「Edit>Project Settings>Player」で「PlayerSettiings」に画面回転の設定がある。「Resolution and Presentation」を開くと「Allow Orientations for Auto Rotation」があるので、ここで利用できる縦置き、横置きと回転方向を設定しよう。例えば上のマニフェストファイルの例と合わせて「横置きでデバイスの向きにより回転」の場合、以下のようになる。


 Android 端末の場合、iPhone と違って規定が少ないため、メーカーによってデザインやボタン配置が異なる。なので、ユーザーのためできる限り回転は対応しておいてあげたい(縦または横のどちらかにするのは構わないが)。ヘッドホンのプラグの位置や音量・電源ボタン、利き手が右利き・左利きでも持ちやすさは変わるからね。もちろんVRのようにあらかじめ方向が決まっているものはその限りではない。



 その他の注意点などはインポートした「FantomPlugin」フォルダの「fantomPlugin_ReadMe_jp.txt」("_en"は英語版)に書かれているので、必要があれば確認して欲しい。最近はアセットストアに出したため、海外の方からも質問メールを受けるようになった。ドキュメントにはアドレスも書いておいたので、直接質問してくれても構わない。ツイッターでも何度か質問受けてるね。たまに研究に没頭して何日か放置してることもあるが(笑)、気づいたら大抵返事はしてるので気長に待っていて欲しい。どちらでもご自由に。


●ツイッター連携の質問箱にも登録した

>>モナ箱タイムライン



(関連記事)
【Unity】Androidのトーストやダイアログ、通知、音声認識、ハード音量操作など基本的な機能を使えるプラグインを作ってみた
【Unity】Unity Asset Store にアセットを提出(申請)する

category: Unity

thread: ゲーム開発

janre: コンピュータ

tag: Unityライブラリ  Unityプラグイン 
tb: 0   cm: --


プロフィール

Social

検索フォーム

全記事一覧

カテゴリ

ユーザータグ

最新記事

リンク

PR

▲ Pagetop