「Android」タグのついた投稿

今回はかなり走り書きのメモ的なやつなので、そのうち出来たら追記します。

タイトル通り、アンドロイド(Oculus GO)でビルドしようとした時にエラーが出るようになりまして、見てみたら

「A problem occurred configuring root project ‘gradleOut’」

と出てきたので、Gradleでエラー・・・で???ってなりました。

これについて検索している時にちょこちょこ違う解決策が出てきたので、自分の環境で上手く行ったやつをメモ書きとして残しておきます。

(さらに…)

ゲームを作るに当たって音ゲーやAudiosurfみたいに自分の持っている音楽を再生出来る機能を付けたい時があります。今回はアンドロイド上でそれを行う方法を紹介します。

 

ファイルを読み込む方法としましては、ファイルへのパスを指定し、WWWクラスを使って読み込みます。

 

さっそく読み込み機能を実装してみます。まず、WWWクラスのインスタンスを作ります。

    const string _FILE_HEADER = "file://";

    private IEnumerator LoadSound(string path)
    {
        // ファイルが無かったら終わる
        if (!System.IO.File.Exists(path))
        {
            Debug.Log("File does NOT exist!! file path = " + path);
            yield break;
        }

        // 指定したファイルをロードする
        WWW request = new WWW(_FILE_HEADER + path);

 

メソッドに渡しているパスはファイルへのフルパス(フォルダの位置や拡張子込み)です。まずそれを使ってファイルが存在しているかの確認を行っています。ある場合はそれをWWWクラスへ渡してインスタンスを生成しています。

 

次に読み込み待ちを挟みます

 

        // ロードが終わるまで待つ
        while (!request.isDone)
        {
            yield return new WaitForEndOfFrame();
        }

 

説明はしてませんでしたが、このメソッドはコアルーチンにしています。そうした理由としてはここでやっている様な読み込待ちを入れやすくする為です。

 

次に読み込みが終わったWWWからAudioClipを取り出します。

 

        // 読み込んだファイルからAudioClipを取り出す
        AudioClip audioTrack = request.GetAudioClip(false, true);

 

取り出した後は、念の為にAudioClipが読み込み中かの確認を行い、読み込み中の場合は待つようにします。また、読み込みに失敗したら処理を終了します。

 

        while (audioTrack.loadState == AudioDataLoadState.Loading)
        {
            // ロードが終わるまで待つ
            yield return new WaitForEndOfFrame();
        }

        if (audioTrack.loadState != AudioDataLoadState.Loaded)
        {
            // 読み込み失敗
            Debug.Log("Failed to Load!");
            yield break;
        }

 

読み込みは成功しているはずなので、ここで再生用にAudioSourceのコンポーネントを追加します。追加したらそのコンポーネントに上記で読み込んだAudioClipを設定します。

        // AudioSourceを生成し、gameobjectに追加する
        AudioSource source = gameObject.AddComponent<AudioSource>();
        
        // 生成したsourceに読み込んだAudioClicpを設定する
        source.clip = audioTrack;

 

これで準備が整いましたので、後はそのまま再生します。

        // 読み込んだファイルを再生する
        source.Play();

        yield return 0;
    }

 

これで終了です。あとはこのメソッドをStartCoroutine()で呼び出してください。

使用例の音楽プレイヤーモドキです:

以上になります。今回紹介した方法はWindowsとかでも多分流用出来ると思いますが、今の所アンドロイドでのみ動作確認を取っています(メンドクサイ)。
え、そもそもパスを獲得するのが面倒?そんな時の為のアセットストアですよ!世の中お金で解決出来るんですよきっと(適当)。

 

最後の今回紹介したメソッドを貼っておきます:

    private IEnumerator LoadSound(string path)
    {
        // ファイルが無かったら終わる
        if (!System.IO.File.Exists(path))
        {
            Debug.Log("File does NOT exist!! file path = " + path);
            yield break;
        }

        // 指定したファイルをロードする
        WWW request = new WWW(_FILE_HEADER + path);

        // ロードが終わるまで待つ
        while (!request.isDone)
        {
            yield return new WaitForEndOfFrame();
        }

        // 読み込んだファイルからAudioClipを取り出す
        AudioClip audioTrack = request.GetAudioClip(false, true);
        while (audioTrack.loadState == AudioDataLoadState.Loading)
        {
            // ロードが終わるまで待つ
            yield return new WaitForEndOfFrame();
        }

        if (audioTrack.loadState != AudioDataLoadState.Loaded)
        {
            // 読み込み失敗
            Debug.Log("Failed to Load!");
            yield break;
        }

        // AudioSourceを生成し、gameobjectに追加する
        AudioSource source = gameObject.AddComponent<AudioSource>();
        
        // 生成したsourceに読み込んだAudioClicpを設定する
        source.clip = audioTrack;

        // 読み込んだファイルを再生する
        source.Play();

        yield return 0;
    }

 

タイトル通りですが、8月末に行われたノベじゃむと言うイベントで制作した「ヒミツのおまじない」と言うゲームをGoogle Playにて配信開始しました!

scr0

リンク:

https://play.google.com/store/apps/details?id=com.Studio6Pm.Omajinai

 

内容としてはコテコテのノベルゲームで、話も学園、男女幼馴染、「(校長)占い」という様なベタな感じになってます(最後は違う?)。

 

ゲームジャムでからの変更点は殆ど無く、基本的にはバグ修正、個人的に宴を弄って遊んで実装したオマケ機能、1枚イラスト追加になっています。

シナリオは誤字修正ぐらいになっているので、初対面でも有能な人たち(自分以外)が集まれば30時間以内でこのレベルの物も作れる時が有るんだ!みたいな感じになっていますので、良かったら遊んでみてください。

何か意見や感想等ありましたら、コメントください。

Unityでは、AndroidとiPhone用の入力処理用の機能がありますが、触った箇所にあるゲームオブジェクトに処理を加える機能は自分で実装する必要があります。

 

今回は、Androidの実機でゲームオブジェクトをタッチした時、オブジェクトのOnMouseDown()メソッドを呼ぶ処理をメモります。OnMouseDown()を呼ぶのは、PCと同じ処理を使えるようにするためです。

 

では、さっそく実装に入ります。まず、スクリプトファイルを作成し、入力確認用のメソッドを実装します。ちなみに今回は、タッチだけを処理します。

 

public class TouchChecker : MonoBehaviour
{	
	protected virtual void CheckTouch()
	{
		if ( Input.touchCount <= 0 )
		{
			return;	
		}

 

最初のif分は、Androidを使用していない時や、入力が無い時の為のエラーチェックです。タッチの入力が一つも無い時は、入力確認の処理を飛ばします。

 

次に、タッチの入力があるかを確認します。

 

		Touch touch = Input.GetTouch(0);
		if ( touch.phase == TouchPhase.Began ) 
		{
 

 

今回は、タッチは一つだけ、それに画面に触ったフレームだけを確認に使用します。

 

次に、実際にオブジェクトを触ったかの確認する処理を実装します。今回、ゲームオブジェクトにタッチしているかを確認するのには、触った画面の位置からレイ(光線)を飛ばし、その光線に当たったオブジェクトのOnMouseDown()メソッドを呼び出します。

 

では、実際に実装します。まず、画面の触った位置を獲得し、その位置情報を使ってカメラから飛ばす光線を作ります。

 

                        Vector2 point = touch.position;
			RaycastHit hit = new RaycastHit();
			Ray ray = Camera.main.ScreenPointToRay( point );
			
			if ( Camera.main == null )
			{
				ray = Camera.current.ScreenPointToRay( point );
			}

 

最後のif文は、もしMainCameraが設定されていなかったり、存在しなかった時に、代わりに現在使用しているカメラを使う処理です(何かこれだけでも動く気もしますが、念の為です)。

 

次に実際に光線を飛ばします。光線は、UnityのPhysicsにある機能を使用し、それで当たったオブジェクトを獲得した後、そのオブジェクトのOnMouseDown()を呼んでいます。

 

			if ( Physics.Raycast( ray, out hit ) ) 
			{
				hit.transform.gameObject.SendMessage( "OnMouseDown" );
			}
   		}
	}

 

最後に、今実装したメソッドをUpdate()メソッド内で毎フレーム呼びます。

 

void Update () 
{
        CheckTouch();
}

 

後はこのスクリプトを適当なゲームオブジェクトに追加し、触った時に何らかの処理を実行したいゲームオブジェクトには、OnMouseDown()内で処理を追加してください。

 

今回はココまでです。
そういえば何時の間にか1万ヒット超えてました。ワーイ!
誰が見るかも解らないブログにココまでアクセスが来るとは・・・(と言ってもまだまだしょぼい数ですが)