Unity研究所<Unityによるゲーム開発、映像開発>

Unity初心者おやじが綴るゲームで小遣い稼ぎできるようになるまでのブログ

Unity 小ネタ スマホで録音してWavファイルで保存

今回は、現在Google Play Storeで公開中のスマホアプリ「Sound Effect Player」に追加した、録音機能の実装方法について覚書として残しておく

 

play.google.com

 

youtu.be

 

〇概要

このアプリでの録音機能について一応簡単に触れておく

このアプリにはタップして音を鳴らすためのボタン(音楽機材のサンプラー的にPadと呼んでいる)が複数あり、それぞれのPadに音声ファイルを登録して鳴らすような仕様となっている

 

その中で、自分でスマホで録音してWavファイルとしてスマホ内に保存して、これをPadに登録して鳴らすことも可能にしている

 

ということで・・・・・(あれ、前置きいらんかったかも)

 

スマホでの録音

➁Wavファイルとして保存

 

までを書き残しておく

 

流れとしては、

・Microphoneクラスを使用

・使えるデバイスの検索

・Start関数で録音開始 AudioClipとして記憶

・End関数で録音終了 

・AudioClipをWav形式のファイルとして保続 

 

 

スマホでの録音

コード全体////////////////////////////////////////////////////////////////////////////////// 

using UnityEngine;

AudioClip SamplingClip;

 

 //まずは使用可能なデバイスを検索

 if (Microphone.devices.Length == 0) 
 {
  return;
 }

 //いくつか列挙される場合もあるが、主に使われる(?)一番目のデバイス名を取得

 string mic = Microphone.devices[0]; 

 

  //録音中かどうかにより、処理を分岐

 //アプリの操作の流れ的には、録音ファイルを登録するPadをタップして録音開始する 

 if (!isRecording)
 {

  //録音中でない場合は録音開始

  SamplingClip = Microphone.Start(mic, false, 10, 44100);

 

  if (SamplingClip) {
   isRecording = true;
   CurrentFileLabel.text = "録音中"; //状態の表示を更新
  }

 }

//録音中にPadが押された場合
 else { 

   //録音終了
   Microphone.End(mic);

   if (SamplingClip == null)
   {
    CurrentFileLabel.text = "録音失敗";
   }
   else {

    //AudioClipがnullでない場合はWav形式でファイルを保存

    SaveWavFile();
    isRecording = false;

   }
 }/////////////////////////////////////////////////////////////////////////////////////////

〇Microphoneクラス 使用関数

//デバイスの検索

public static string devices ; 

 

//録音開始

public static AudioClip Microphone.Start (string deviceName, bool loop, int lengthSec, int frequency);


deviceName  デバイス
loop

 ループ録音を行なうかどうか、行なう場合は lengthSec に到達したときにクリップの最初に戻って録音を継続する
lengthSec  録音するオーディオクリップの長さ
frequency  録音するオーディオクリップの周波数

 

//録音終了

End (string deviceName);

 

 

➁Wavファイルとして保存

流れとしては

・ファイル名を入力するダイアログを表示

・ファイル名が入力されてOKボタンが押されたら、ファイルを保存

 

//ファイル名を入力するダイアログを表示

public void SaveWavFile()
{
 FileBrowser.SetDefaultFilter(".wav");
 FileBrowser.ShowSaveDialog(OnSaveSuccess, OnSaveCancel, false, false, null,
"Save", "Save");

}

 

 ファイルダイアログについては、フリーのアセットを使用させてもらっているので、下記を参照 

harukichi.hatenadiary.jp


 //ファイル名が入力されてOKボタンが押された場合の処理

void OnSaveSuccess(string paths)
{

 //ファイルダイアログで入力したファイル名と、アプリの保存されているパスを

 合成して保存先のパスを生成

 string destpath = 

 Application.persistentDataPath+"/"+FileBrowserHelpers.GetFilename(paths[0]);

 

 //保存先とAudioClipを渡してWavファイル保存処理へ

 if (!SavWav.Save(destpath, SamplingClip))
  CurrentFileLabel.text = "音声ファイルの保存失敗";

 

 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
}

 

なお、AudioClipをWavファイル形式で保存するコードは、「darktable」さんの「SavWav.cs」を使用させてもらったのと、中身はよくわからないので・・・(-_-メ)

Unity3D: script to save an AudioClip as a .wav file. · GitHub

 

 

Androidのファイルの保存について

 現状Google Play StoreにアップロードできるアプリのAPIレベルは29以上になってしまい、以前のように自由にファイルブラウザでアクセスするというようなことはできなくなってしまったので、この点非常に面倒になってしまった

 

 セキュリティの問題とか・・・・

 

 なので、スマホにファイルを保存するには、許可されたフォルダにしかできない

 

 ということで、「 Application.persistentDataPath」というアプリ自体が保存されるパスを取得してきてその中に保存するという形でwavファイルを保存している

 

 このやり方が正解かも正直よくわからないが・・・・<m(__)m>

 

今回は以上

 

 

Sound Effect Player プライバシーポリシー

【Sound Effect Player】プライバシーポリシー

 

Y’Mfc(以下「当方」という)は、当方の提供する【Sound Effect Player】の利用者(以下「ユーザー」という)に関する個人情報を含んだ情報(以下「ユーザー情報」という)の取扱いについて、以下のとおりプライバシーポリシー(以下「本ポリシー」という)を定めます。

 

1.情報を取得するアプリ提供者

Y’Mfc

 

2.取得するユーザー情報と目的

本アプリケーションで取得するユーザー情報と目的は以下のとおりです。

取得するユーザー情報

利用目的

 

端末に関する情報

・録音音声データ

・アプリ内での音声出力用データ

 
 

位置情報

なし

・ユーザーに最適化された広告の提供

・位置情報に基づく広告の提供

・パフォーマンス分析

・アプリケーションの改善

・ユーザーへのサポート

 

 
 

広告に関する情報

・表示場所

・クリックの有無

・閲覧回数

・広告の製品またはサービスの利用状況

 

 

3.取得方法

当方は、情報収集モジュールを内蔵した本アプリケーションにより、ユーザー情報を自動取得します。

 

4.通知・公表または同意取得の方法・利用者関与の方法

(1)通知・公表

当方は、本ポリシーに関する通知・公表は本アプリケーションまたは当方のホームページに掲載する方法で行います。

 

(2)同意取得の方法

同意の取得は、本アプリケーションの初回起動時に取得する方法で行います。

 

(3)利用者関与の方法

ユーザー情報の取得は、本アプリケーションをアンインストールすることで中止することができます。

 

5.お問い合わせ

当方のプライバシーポリシーに関する、ご意見、ご質問、苦情の申出その他ユーザー情報の取扱いに関するお問い合わせは、以下の窓口にご連絡ください。

 

ys.mfc.sp@gmail.com

 

6.改定

当方は、当方の裁量に基づいて、本ポリシーを変更します。但し、取得するユーザー情報、利用目的、第三者提供に変更が発生した場合、本アプリケーションまたは当社のホームページで通知するとともに、本ポリシー変更後、本アプリケーションの初回起動時に改めてユーザーから同意を取得します。

 

7.Y’s MFCプライバシーポリシー

本ポリシーに定めのない事項については、Y’s MFCプライバシーポリシーが適用されます。

 

 

8.制定日・改定日

制定:2020年11月14日

 

Unity小ネタ アプリの実行時にファイルダイアログで選択した動画を再生する

前回はファイルダイアログでファイルを選択するところまで解説したが、今回は選択した動画を再生するところを解説する

 

f:id:Harukichi:20200915232947g:plain

 

〇概要

①ファイルダイアログでファイルを選択すると、選択したファイルのパスが返ってくる➁Video Playerコンポーネントの再生クリップのパスに取得したパスを設定

③Video Playerを再生

 

〇Video Playerの使用方法

 Hierarchyのプラスボタンを押してコンポーネントを追加

f:id:Harukichi:20201004183554p:plain

 

 インスペクターで設定

f:id:Harukichi:20201004183610p:plain

・Sourceは、パスを指定するのでURLを選択

・URLはスクリプトから指定するので空のままに

・Play On Awakeのチェックは外して、起動時に自動で再生されないようにする

・Cameraは動画を表示したいカメラを指定

 

スクリプトでの制御

下記の中のvpはVideo Player

public void OnFileSelectButtonDown() //ファイル選択ボタンを押した場合の処理
{

  string FilePath= OpenFile(); //ファイルを開く処理でパスを取得

  if(vp.isPlaying) //Video Playerが再生中の場合は一応止める
    vp.Stop();
  

 

  vp.url = "file://"+FilePath[0]; //urlを指定

  vp.Play();//再生

}

 

上記の中のファイルを開く処理

public string OpenFile()
{
  string FilePath;

  var extensions = new //ダイアログに表示するファイルのフィルタを設定
  {
    new ExtensionFilter( "Movie Files", "mp4", "mov", "avi" ),

  };


  FilePath = StandaloneFileBrowser.OpenFilePanel("Select Movie File", "", extensions, true);

  return FilePath;

}

  

 

以上、こんな感じで動画が再生できる ・・・はず

 

 

Unity 小ネタ スマホアプリでスマホ内のファイルを開くダイアログを実装

 

 こんな感じのアプリを作成し、現在Google Playの審査中!!

 

この際に実装したスマホの中のファイルを検索できるファイルダイアログの実装方法について解説する

 

今回使用したAsset 無料

とりあえずこちらをプロジェクトにインポート

assetstore.unity.com

 

実装の流れとしては

・インポートしたスクリプトスクリプトから呼び出して使用

・ファイルのフィルタはダイアログを開く前に指定

・ダイアログを閉じるときに正しくファイルが選択されていたら、ファイルのパスを取得する

 

こんな感じ

便利なAssetを無料で公開してくださっている方に猛烈感謝!!

 

では、具体的な実装例を・・・といってもAssetのサンプルコードを少しだけアレンジしただけ(-_-メ)

 

まずは、インポートしたスクリプトを使うよ~っという宣言

using System.IO; //これも必要だった
using SimpleFileBrowser;

 

インポートすると、FileBrowserというオブジェクト?が使えるようになる

 

 

次に開くファイルのフィルタを指定

今回はPadに登録音声ファイルを登録し、Padをタップすると効果音がなるというアプリなので、音声ファイルのみが表示されるように指定

void Start()
{
   FileBrowser.SetFilters(true, new FileBrowser.Filter("Sound Files", ".wav", ".mp3"));
   FileBrowser.SetDefaultFilter(".wav");
}

 

 

さらに、ファイルダイアログを呼び出す関数をつくり、その中でダイアログを表示する関数を呼び出し

void OpenFileDialog()
{

 FileBrowser.ShowLoadDialog(onSuccess, onCancel, false, false, null, "Load", "Select");

}

 引数

 1つ目 ダイアログを閉じるときにOkボタン的なものを押した場合に呼ばれる関数

 2つ目 キャンセルまたはファイルが選択されなかった場合に呼ばれる関数

 3つ目 フォルダ選択モードにするかどうか

 4つ目 複数ファイル選択可能にするか

 5つ目 開いた時のデフォルトのパスの指定

 6つ目 ダイアログのタイトル

 7つ目 OKボタンに表示するテキスト 今回はSelectにしている

 

 

次にファイルの選択に成功した場合に呼ばれる関数

void onSuccess(string[] paths) {           

  StartCoroutine(LoadToAudioClipAndPlay(paths[0], CurrentPadNum));
 }

 

成功した場合は、ファイルのパスの配列の中にファイルパスのテキストが入ってくるので、これをもとにファイルを開く関数を実行

 

今回はこの先のファイルを開く処理については解説しないが、ファイルを開くまでに時間がかかる場合があるので、コルーチンにしている

 

なお、失敗の方は処理の必要がないので空
void onCancel() {


}

 

 今回のところはここまで

Unity小ネタ アプリの実行時にファイルダイアログを使う

仕事での必要に駆られて動画再生アプリを作ろうと考えた(-_-メ)

 

〇必要な機能

 ・動画ファイルを開く

 ・動画ファイルの再生、停止、コマ送り

 ・二つ同時に開いて同時再生してながら内容を比較できるようにする

 

理由としては、会社がテレワーク環境を整えるためにVDIのシステムを導入した

 

が、既存の動画再生アプリのパフォーマンスが上がらない

 

そもそもコマ送りできるアプリが使えなかったり・・・などなど

 

いろいろアプリ探してもなかなか要求を満たすものがなく

 

じゃあ作るか!!

 

理由はこんな感じ

 

ということで、ざっと一番近道の実装方法を考えてみると・・・

 

Visual Stadio、MFCとかはさっぱりご無沙汰で

思い出すだけで数年かかりそう

 

Visual Basicならすぐに思い出せそうだが、そもそも組める環境なのか?!

 

 

なんやかんや使っているのはUnityしかない

 

ということで、ざっくりな実装方法案

 〇動画ファイルを開く

  ⇒ファイルダイアログを呼び出して、ファイルを選択

   Unityの実行環境で困難できたっけ?

 

 

 〇動画ファイルの再生、停止、コマ送り

       ⇒こいつはVideo Player コンポーネントを使えば何とかなりそう

 

 〇二つ同時に開いて同時再生してながら内容を比較できるようにする

  ⇒Video Playerを二つに並べて同時に再生すれば、何とかなるんじゃね?

 

 

前置きが長くなったが今回はUnityのビルド後の実行時にファイルダイアログを使う方法を見つけたので解説

 

◆イメージ 

 下記はUnity Editor上で実行しているが、ビルド後の環境でも同じように動作

f:id:Harukichi:20200915232947g:plain

 

 

というか、以前にも実装したことがあった

 

System Windows Formsをプラグインとして使用する方法

 

でも過去のソースをたどるのも面倒なので

 

検索して出てきた下記を使うことにする

 

 

github.com

 

上記のページからPackageをダウンロード

f:id:Harukichi:20200915232930p:plain

 

Packageファイルをプロジェクトにインポート

 

スクリプト

①まずは、using SFBにて、今回インポートしたスクリプトを使えるようにする

 

②次にいきなりダイアログを開くための関数を作成

 基本はインポートしたスクリプトのサンプルを参考に調整

 

public string OpenFile() //最終的にはファイルパスを取得できるように
{
  string
FilePath;

  var extensions = new[] //動画ファイルを開きたいのでフィルタをそれ用に設定
  {
   new ExtensionFilter( "Movie Files", "mp4", "mov", "avi" ),

  };

 

  //今回インポートしたスクリプト内のダイアログを使用する関数を実行

  //引数にダイアログのタイトル、ファイルのフィルタ、複数ファイルを選択する

   ためにtrue


  FilePath = StandaloneFileBrowser.OpenFilePanel("Select Movie File", "", extensions, true);

  return FilePath;

}

 

一応、以上でダイアログを開くところまでは完成

 

なお、プロジェクトの設定として、下記の項目をMonoにしておかないと、ビルド時にプラグインが見つからないと赤文字の英語で怒られる(イメージ)

f:id:Harukichi:20200915234057p:plain

 

案外ここまでは簡単にでけた

 

System Windows Formsだけでもできた感ありだが・・・

 

次回は、動画ファイル再生までを解説したい

 

以上

 

Unity 小ネタ Hinge JointのMotorを使った羽根の開閉

f:id:Harukichi:20200802000327g:plain

今回は、上記の動画の羽根の部分の制御方法について解説する

 

〇用意するもの

 ・羽根のモデルデータ

 

〇仕組み

ざっくり説明するとHinge JointのMotorをオンにして開放し、オフにしてSpringの力で元に戻るようにしているだけ

設定の仕方としては下記の通り

1 UnityのHinge Jointを羽根のモデルに追加

2下図のように回転する軸にHinge JointのAnchorを調整

3 Use Springをオンにして、Springの強さを設定

4 MotorのTarget Verocity、Forceを設定

 回転速度と回転する強さという感じ?

5 Limitsにて回転する範囲を設定

 Inspectorでの設定は以上

6 スクリプトでMotorのUse Motorの値をtrueにすると開放、falseにして閉鎖

f:id:Harukichi:20200802001504p:plain

スクリプト

void WingOnOff(bool flag)
{

 if (flag) {

  LeftWing.GetComponent<HingeJoint>().useMotor = true;

  RightWing.GetComponent<HingeJoint>().useMotor = true;
 }
 else {
  LeftWing.GetComponent<HingeJoint>().useMotor = false;

 RightWing.GetComponent<HingeJoint>().useMotor = false;
 }

}

 

〇備考

 最初はHinge Jointを使わずに、スクリプトで回転させていたが、物理を無視した瞬間移動になってしまうみたいで、上から落ちてくる玉がぶつかってもすり抜けてしまった

 Hinge Jointを使用したら、物理的な動作を行ってくれるようで、羽根に玉が当たると玉の流れが変わるようになり、羽根の閉まる強さで玉がはじかれるような動きも実現することができた

 

今回は以上