AudioSourceの再生が終わったかどうかを取得する方法(が見つからない...)

表題の件ですが、結局いまのところ解決していません。

AudioSourceクラスにはisPlayingというプロパティがあります。一番最初に思いつくのは、これがfalseになったら再生が終わったと判断するという手です。

しかし、これには落とし穴があって、Pause()を呼ぶとisPlayingがfalseになるのでPauseしているのと、再生が終わっているのとを区別できません。


次にtimeというプロパティを見るという手があります。こちらが0になっていたら再生が終わったと判断するという手です。

しかし、AudioSourceをPlay()した直後はtimeが0なので、これも誤作動してしまいます。

最後に、上記を併用するという手があります。

public static bool IsFinished( this AudioSource audio )
{
    return audio.time == 0.0f && !audio.isPlaying;
}

このような判定です。

しかし、これもうまくいかないことがあります。Play()した直後にPause()すると、timeは0だしisPlayingはfalseなので再生終了したと判定されてしまうのです。

結局、今のところ良い方法は思いついておりません。再生終了したタイミングでcallbackを呼ぶような仕組みを作りたかったのですが...

何か良い案があればご教授お願い致します。

追記
Pauseせず再生状態のままピッチを0.0fにすればいけるとコメントで頂きました。ありがとうございます。

C#のlock構文

FruitsNinjaのCloneのソースコードを見ていてc#にlock構文があることを知りました。

https://www.assetstore.unity3d.com/jp/#!/content/65879


マルチスレッドのプログラムでは、ちゃんと排他制御をしないと問題がおきます。

その代表格がsingletonクラスで、自分もC++でゲーム作ってたときは、それ周りのバグで悩まされました。

上記のAssetでは、singletonの生成時にロックを掛けるようになっています。

簡略化して書くと、

private static object _lock = new object();

public static T Instance
{
    get
    {
        lock (_lock)
        {
            if (_instance == null)
            {
                _instance = (T)FindObjectOfType(typeof(T));

                if (_instance == null)
                {
                    GameObject singleton = new GameObject();
                    _instance = singleton.AddComponent<T>();
                    singleton.name = "(singleton) " + typeof(T).ToString();

                    DontDestroyOnLoad(singleton);
                }
            }

            return _instance;
        }
    }
}

というような感じになっています。

これをちゃんとやっておかないと、タイミングによってはシングルトンなのにオブジェクトが複数できちゃいます。

けど、そもそもUnityのユーザースクリプトってシングルスレッドで動いていると聞いたので、そんなに神経質にlockしなくても良いんじゃ...って思ったり。そのあたりどうなんでしょう???

全てのシーンに存在し、一つしか存在してはいけないマネージャー的存在の実装

kan-kikuchi.hatenablog.com

この記事を読んで、最近読んだFruitsNinjaをCloneしたアセットのことを思い出したので記事にします。

https://www.assetstore.unity3d.com/jp/#!/content/65879

ところで、このアセット、凄いです!画像変えるだけで、vegetable ninjaでもmeat ninjaでも何でも作れます!
こんなん無料で出すなんて太っ腹すぎる!しかもコードに書かれたコメントがめちゃくちゃ丁寧!
オススメです!

本題に戻ります。
上記の記事で問題として挙げられていることを列挙すると

  1. 全てのシーンに存在して欲しいが、いちいち全てのシーンに配置するのは面倒だし、シーンが変わる度にマネージャーが新しくなるので、シーンを跨いでの処理ができなくなる。
  2. かといってDontDestroyOnLoadを使ってマネージャーが消えないようにすると、シーンを移動した時にマネージャーが重複してしまう。
  3. かといって最初のシーンだけに設置すると、他のシーン単体でテストが出来ない。

ということです。なので、

  1. 全てのシーンに存在し、
  2. 重複せず
  3. シーン単体でのテストができる

ことが重要になります。

FruitsNinjaCloneのスクリプトにあるSingletonは、かなり上記の条件を満たしています。

コードを一部簡略化して載せると、

public class Singleton<T> : MonoBehaviour where T : MonoBehaviour
{
    private static T _instance;

    public static T Instance
    {
        get
        {
            if (_instance == null)
            {
                _instance = (T)FindObjectOfType(typeof(T));

                if (_instance == null)
                {
                    GameObject singleton = new GameObject();
                    _instance = singleton.AddComponent<T>();
                    singleton.name = "(singleton) " + typeof(T).ToString();

                    DontDestroyOnLoad(singleton);
                }
            }

            return _instance;
        }
    }
}

というような形になっています。

キモは、instanceが無かったらGameObjectを生成して、AddComponentしているところです。

これで、Instanceにアクセスが発生した瞬間にオブジェクトが生成されます。

問題点としては、Instanceへのアクセスが無ければオブジェクトが生成されずEditor上にもオブジェクトが現れないことですが、たいてい、どっかでアクセスがあるし、明示的にInstanceへのアクセスをしてやれば無理やり作ることもできるし、まあまあ良い感じなんじゃないかと思います。



1分間たまご - 激ムズ!

1分間たまご - 激ムズ!

開発元:Ken Watanabe
無料

posted with アプリーチ

個人ゲーム開発者が送ってみた無料でレビューしてくれる海外サイト30個

まず最初に"無料で"と書きましたが、無料の場合はレビューをしてもらえるかどうかの保証はありません。

そもそも無料のレビューは受け付けていないところもあります。

基本的には以下の記事を参考にしています。
www.find-job.net

上記の記事の中にはサイトが閉じちゃっているところとか、既に更新されてないところとか、ゲームを扱っていないところとか、ハードコアゲームばかりなところとかあるので、それらを除いた30サイトに実際にレビュー依頼を送ってみました。

さらに掲載依頼先URLが新しくなっているところを修正し、一言コメントをつけたのが以下になります。

なんで、○○が無いんやー!っていうツッコミ大歓迎です。

iPhone専門

AppPicker

148Apps

iPhone Blog

  • トップページ :http://blogdoiphone.com/
  • 掲載依頼先  :review[at]blogdoiphone.com.
  • ゲームは少なめっぽい

Iphone Application List

Android専門

Android AppStorm

Android Apps Review

Android community

Android App Log

Droid gamers

Ask your android

  • トップページ :http://www.askyourandroid.com/
  • 掲載依頼先  :webmaster[at]askyourandroid.com
  • 載っているアプリ的になんとなく敷居低そう。

Android run down

Android zoom

Android spin

Android-apps

Get Android Stuff

Android Guys

iPhoneAndroidどっちも

AppScout

  • トップページ :http://appscout.pcmag.com/
  • 掲載依頼先  :pcmagdigital[at]emailcustomerservice.com
  • 割りと小さめのゲームも載っていたので出してみた。

Appolicious

iFanzine

  • トップページ :http://ifanzine.com/
  • 掲載依頼先  :ifanzine[at]gmail.com
  • ゲーム多め。Contact欄がフレンドリーだったので出しやすい。

Apps 400

Apps To Use

Touch Archive

Apps 4 Review

Nine Over Ten

  • トップページ :http://www.nineoverten.com/
  • 掲載依頼先  :jason.lee[at]nineoverten.com
  • 無料。だからこそ、好き勝手書くよというスタンスらしい。

Touch Arcade

  • トップページ :http://toucharcade.com/
  • 掲載依頼先  :tips@toucharcade.com
  • ゲーム多め。載っているレビューは大手ばかりの印象。

VideoGamer.com

Slide To Play

QuickJump Gaming Network

pocket Gamer

  • トップページ :http://www.pocketgamer.co.uk/
  • 掲載依頼先  :reviews[at]pocketgamer.co.uk
  • ゲーム専門だし、送ってみた。

Gamezebo


P.S
というわけで下記のゲームに関するレビュー依頼を30件送ってみたわけですが...


Divide

Divide

開発元:Ken Watanabe
無料

posted with アプリーチ

1件も返信が来なかった。

もっと3Dバリバリのゲームじゃないと取り上げてもらいにくいのかも。

Unity Remote 5を使ってみた

先日、実機確認のためのビルド時間に悩んでいるという話をしたら、Unity Remoteというのを教えてもらったので、使ってみました。

Unity Remoteとは、ゲームの実行はUnity Editor上で行われるのですが入力はUSBで繋いだデバイス側から行えるというものです。

また、デバイス側にはレンダリング結果が圧縮して送られるので、長時間のビルドを待たずに実機での操作感を試すことができます。

入力としては、

が受け取れます。

使い方は、超簡単です。

どれぐらい簡単かって言うと、Unity Remoteってものがあるよって聞いてから、Unity Remoteについて調べるのも含めて3分後には利用ができていました。

詳しくは、以下のサイトにありますが、ここでも簡単に触れておきます。
docs.unity3d.com
Unity Remote 4と書いていますが、Unity Remote 5も同様です。


まずは下記のリンク先からUnity Remoteのアプリをデバイスにインストールします。

インストールしたらアプリを実行し、USBケーブルでPCと接続します。

次に、Unity Editor側で Editor設定( Edit > Project Settings > Editor )を開き、Unity Remote というところから使用するデバイスを選択します。
f:id:wkpn:20160816100238p:plain


あとは実行するだけです。

Unity Remote 4との違いは明確にはわかっていないのですが、iTunesのUnity Remote 5の紹介ページから察するに、3D Touchとか、Apple TVとかに対応したっぽいです。

Added support for MFi gamepads connected to the remote device (requires Unity 5.4)
Added new touch properties such as 3D Touch and Apple Pencil support (requires Unity 5.4)
Added support for Apple TV devices (requires Unity 5.4)


!使用感
数フレームぐらい遅延が発生するので、本当の操作感は分かりませんが、ざっくりとした感覚をみるには良いですね。

画質の差は、だいたい以下のよう感じです。

f:id:wkpn:20160816100417j:plain
Resolutionの項目でNormalを選んだ時の圧縮されたゲーム画面

f:id:wkpn:20160816101026j:plain
Resolutionの項目でDownsizeを選んだ時の圧縮されたゲーム画面

f:id:wkpn:20160816100428j:plain
本当のゲーム画面

NormalもDownsizeの違いはそんなになかったのですが、Downsizeの方が負荷が軽いようでした。スペックが低いPCではDownsizeを選んだほうが良さそうです。

また、どちらも左上のデバッグ用の文字は潰れています。しかしEditor上ではしっかり見えるので、そんなに問題はありません。

これで実機での動作確認の完全な代替になるわけではありませんが、開発効率がグッと向上しました。


そんな、Unity Remoteも使って開発したゲームはこちら↓


1分間たまご - 激ムズ!

1分間たまご - 激ムズ!

開発元:Ken Watanabe
無料

posted with アプリーチ

UnityのAsset「Android Native Plugin」でエラー(AdMobとの相性が悪いようでした)

UnityのAsset「Android Native Plugin」でビルドエラー(最新版だけ?)

UnityでGoogleのGame Service系を簡単に使えるようにすることで有名なアセット「Android Native Plugin」を導入したのですが、ビルドしようとすると下記のようなエラーが出ていました。

CommandInvokationFailure: Failed to re-package resources.
/Users/wakepon/Library/Android/sdk/build-tools/23.0.2/aapt package --auto-add-overlay -v -f -m -J gen -M AndroidManifest.xml -S "res" -I "/Users/wakepon/Library/Android/sdk/platforms/android-24/android.jar" -F bin/resources.ap_ --extra-packages com.chartboost.sdk.unity:com.google.unity:com.example.an_billing:com.example.an_googleplay:com.example.an_social:com.example.androidnative:android.support.v7.appcompat:com.google.android.gms.ads.impl:com.google.android.gms.ads.impl:com.google.android.gms.ads:com.google.android.gms.ads:com.google.android.gms.analytics:com.google.android.gms.analytics:com.google.android.gms.appinvite:com.google.android.gms.auth.api:com.google.android.gms.auth:com.google.android.gms.base:com.google.android.gms.base:com.google.android.gms:com.google.android.gms:com.google.android.gms.clearcut:com.google.android.gms.drive:com.google.android.gms.games:com.google.android.gms:com.google.android.gms.gcm:com.google.android.gms.iid:com.google.android.gms.plus:com.google.android.gms.tasks:android.support.v4:android.support.v4:com.unity3d.ads.android -S "/Users/wakepon/projects/2357/Temp/StagingArea/android-libraries/AN_Res/res" -S "/Users/wakepon/projects/2357/Temp/StagingArea/android-libraries/an_billing/res" -S "/Users/wakepon/projects/2357/Temp/StagingArea/android-libraries/an_googleplay/res" -S "/Users/wakepon/projects/2357/Temp/StagingArea/android-libraries/an_social/res" -S "/Users/wakepon/projects/2357/Temp/StagingArea/android-libraries/androidnative/res" -S "/Users/wakepon/projects/2357/Temp/StagingArea/android-libraries/appcompat-v7-23.1.1/res" -S "/Users/wakepon/projects/2357/Temp/StagingArea/android-libraries/play-services-ads/res" -S "/Users/wakepon/projects/2357/Temp/StagingArea/android-libraries/play-services-ads-9.4.0/res" -S "/Users/wakepon/projects/2357/Temp/StagingArea/android-libraries/play-services-ads-lite/res" -S "/Users/wakepon/projects/2357/Temp/StagingArea/android-libraries/play-services-ads-lite-9.4.0/res" -S "/Users/wakepon/projects/2357/Temp/StagingArea/android-libraries/play-services-analytics/res" -S "/Users/wakepon/projects/2357/Temp/StagingArea/android-libraries/play-services-analytics-impl/res" -S "/Users/wakepon/projects/2357/Temp/StagingArea/android-libraries/play-services-appinvite/res" -S "/Users/wakepon/projects/2357/Temp/StagingArea/android-libraries/play-services-auth/res" -S "/Users/wakepon/projects/2357/Temp/StagingArea/android-libraries/play-services-auth-base/res" -S "/Users/wakepon/projects/2357/Temp/StagingArea/android-libraries/play-services-base/res" -S "/Users/wakepon/projects/2357/Temp/StagingArea/android-libraries/play-services-base-9.4.0/res" -S "/Users/wakepon/projects/2357/Temp/StagingArea/android-libraries/play-services-basement/res" -S "/Users/wakepon/projects/2357/Temp/StagingArea/android-libraries/play-services-basement-9.4.0/res" -S "/Users/wakepon/projects/2357/Temp/StagingArea/android-libraries/play-services-clearcut-9.4.0/res" -S "/Users/wakepon/projects/2357/Temp/StagingArea/android-libraries/play-services-drive/res" -S "/Users/wakepon/projects/2357/Temp/StagingArea/android-libraries/play-services-games/res" -S "/Users/wakepon/projects/2357/Temp/StagingArea/android-libraries/play-services-gass-9.4.0/res" -S "/Users/wakepon/projects/2357/Temp/StagingArea/android-libraries/play-services-gcm/res" -S "/Users/wakepon/projects/2357/Temp/StagingArea/android-libraries/play-services-iid/res" -S "/Users/wakepon/projects/2357/Temp/StagingArea/android-libraries/play-services-plus/res" -S "/Users/wakepon/projects/2357/Temp/StagingArea/android-libraries/play-services-tasks-9.4.0/res" -S "/Users/wakepon/projects/2357/Temp/StagingArea/android-libraries/support-v4-23.1.1/res" -S "/Users/wakepon/projects/2357/Temp/StagingArea/android-libraries/support-v4-23.4.0/res" -S "/Users/wakepon/projects/2357/Temp/StagingArea/android-libraries/unityads-release/res"

stderr[
/Users/wakepon/projects/2357/Temp/StagingArea/android-libraries/appcompat-v7-23.1.1/res/layout/abc_alert_dialog_button_bar_material.xml:18: note: removing attribute http://schemas.android.com/apk/res/android:layoutDirection from <android.support.v7.widget.ButtonBarLayout>
/Users/wakepon/projects/2357/Temp/StagingArea/android-libraries/appcompat-v7-23.1.1/res/layout/abc_alert_dialog_button_bar_material.xml: note: using v17 attributes; synthesizing resource com.waken.Divide:layout/abc_alert_dialog_button_bar_material for configuration v17.
/Users/wakepon/projects/2357/Temp/StagingArea/android-libraries/appcompat-v7-23.1.1/res/layout/abc_alert_dialog_material.xml:48: note: removing attribute http://schemas.android.com/apk/res/android:textAlignment from <android.support.v7.widget.DialogTitle>
/Users/wakepon/projects/2357/Temp/StagingArea/android-libraries/appcompat-v7-23.1.1/res/layout/abc_alert_dialog_material.xml: note: using v17 attributes; synthesizing resource com.waken.Divide:layout/abc_alert_dialog_material for configuration v17.
/Users/wakepon/projects/2357/Temp/StagingArea/android-libraries/appcompat-v7-23.1.1/res/layout/abc_dialog_title_material.xml:29: note: removing attribute http://schemas.android.com/apk/res/android:textAlignment from <TextView>
...


色々と調べた結果、Assets/Plugin/Android以下と、Assets/Plugin/Android/lib以下の両方にplay-service系のaarができてしまっていることが問題のようでした。

Assets/Plugin/Android 以下にあるappcompat-v7-23.1.1.aarや、play-services-ads-9.4.0.aarといったaarファイル郡を削除したら、無事にビルドできるようになりました。

ただ、これらのファイルを削除するのも一筋縄では行かず、ProjectSettings/GoogleDependencyAdMobUnity.xmlを削除しないと、aarは何度でも復活してしまいました。

また、GoogleDependencyAdMobUnity.xml自体を削除してもビルド後に復活してしまい、これは未だに謎です。

現在、このエラーに関して「Android Native Plugin」のサポートチームに問い合わせ中。

P.S

GoogleDependencyAdMobUnity.xmlは、AdMobが生成しているようでした。

Assets/PlayServicesResolver/Editor/AdMobDependencies.cs というファイルが、上記xmlを吐くようだったので、全部コメントアウトしたら煩わされることがなくなりました。

コメントアウトしても、Plugin/Android/libs以下にAndroid Native Plugin が追加したaarファイル郡があるので問題なく動きます。

ただ、Unityの人に聞いたところ、ロムに含まれるaarファイルはAndroid直下だけというのが現在の仕様(サブフォルダ以下のaarも含まれている現状はバグ)とのことだったので、今後のUnityのバージョンでは危ういかも。

Unityのシェーダーを書くときに確認しそうなページメモ

  • ビルトインのシェーダー変数

docs.unity3d.com

docs.unity3d.com

  • Shaderのプロパティについて

docs.unity3d.com

  • "UnityCG.cginc"内の便利関数

docs.unity3d.com

docs.unity3d.com

  • Cgのレファレンス

http.developer.nvidia.com