強火で進め

このブログではプログラム関連の記事を中心に書いてます。こちらで( http://blog.livedoor.jp/tsuyobi-outdoor/ ) アウトドア関連の記事も書いてます。

Android 環境で AssetBundle 化した Video Clip を再生する時の注意点

サポートは Unity 2018.1 から

まず、 Android 環境での AssetBundle 化した Video Clip の再生は Unity 2018.1 からのサポートに成ります。それ以前の Unity では使えません。

2018.1のリリースノートに「Video: Added support for reading videos from AssetBundles on Android.」という記述が有ります。

What's new in Unity 2018.1 - Unity
https://unity3d.com/jp/unity/whats-new/unity-2018.1.0

ファイルの場所とフォーマット

次に 公式ドキュメントの VideoPlayer のページを見ると Android の部分に以下の記述が有ります。

Playback from asset bundles is only supported for uncompressed bundles, read directly from disk.

ざっくり翻訳すると「AssetBundle から再生するにはディスクから直接読み込める非圧縮の AssetBundle だけサポートしてるよ」と書かれています。

つまり、 AssetBundle を作る時の BuildPipeline.BuildAssetBundles() のオプションで BuildAssetBundleOptions.UncompressedAssetBundle を使わないとダメという事です。

圧縮したものを読み込もうとするとこの様なエラー文が出力されます。

AndroidVideoMedia::OpenExtractor could not translate archive:/CAB-xxxxxxxxxxxxxxxxx/CAB-yyyyyyyyyyyyy.resource to local file. Make sure file exists, is on disk (not in memory) and not compressed.
AndroidVideoMedia: Error opening extractor: -10004

また、以下の様にダウンロードしたものをそのまま再生すると失敗します。

        using (UnityWebRequest uwr = UnityWebRequestAssetBundle.GetAssetBundle(url))
		{
			yield return uwr.SendWebRequest();

			if (uwr.isNetworkError || uwr.isHttpError)
			{
				Debug.Log(uwr.error);
			}
			else
			{
				bundle = DownloadHandlerAssetBundle.GetContent(uwr);
				var vc = bundle.LoadAsset<VideoClip>("assets/movie.mp4");
				videoPlayer.clip = vc;
				videoPlayer.Prepare();
			}
		}

Application.persistentDataPath のフォルダなどに一度保存したものを再生する場合は問題無く再生されます。

[コード例(一部)]

        string assetFilePath = Application.persistentDataPath + "/movie";
        using (UnityWebRequest www = UnityWebRequest.Get(url))
        {
            Debug.LogFormat("Start DL: {0}", url);
            yield return www.SendWebRequest();

            if (www.isNetworkError || www.isHttpError)
            {
                Debug.Log(www.error);
            }
            else
            {
                File.WriteAllBytes(assetFilePath, www.downloadHandler.data);
                Debug.Log("AssetFile Path: " + assetFilePath);
                bundle = AssetBundle.LoadFromFile(assetFilePath);
                Debug.Log(bundle);
                Debug.Log("-------AssetNames");
                foreach (var n in bundle.GetAllAssetNames())
                {
                    Debug.Log(n);
                }
                var vc = bundle.LoadAsset<VideoClip>("assets/movie.mp4");
                Debug.Log(vc);

                videoPlayer.clip = vc;
                videoPlayer.Prepare();
            }
        }

Graphics API

2019.2.0 以前の Unity では Vulkan には非対応です。その様な環境では OpenGL ES のみの環境で実行される様にアプリの設定を行っておく必要が有ります。

Unity Issue Tracker - [Android][Vulkan][VideoPlayer] VideoPlayer causes a crash with Vulkan API
https://issuetracker.unity3d.com/issues/android-vulkan-videoplayer-video-doesnt-play-or-causes-a-crash-on-newer-version-of-unity-with-vulkan-api

Unity 2019.2.0 に「Android: The Unity video player can now be used with the Vulkan renderer.」という記述が有り、このバージョンから Vulkan 環境での再生に対応している事が確認できます。

What's new in Unity 2019.2.0 - Unity
https://unity3d.com/jp/unity/whats-new/2019.2.0

プロジェクトビューでアセットをダブルクリックした時に VS Code で開く問題の解消法

Unity 2019.2 で VS Code で Prefab、Scene、画像など全てのアセットがプロジェクトビューでダブルクリックした時に VS Code  で開かれるという症状に遭遇しました。
 
こちらのツイートの方法で改善しました。

 

手順

メニューから Window > Pakage Manager と選択。

 

インストール済みパッケージ一覧から「Visual Studio Code Editor」を選択。

 

検索欄から検索するのが速いです。

f:id:nakamura001:20190827223825p:plain

 

ドロップダウンをクリックし、バージョン 1.1.0 を選択。[Update to 1.1.0] ボタンをクリック。

f:id:nakamura001:20190827223854p:plain

 

 

 

Unity の Analytics 機能が行っているユーザ情報の送信を全て止める方法

※この記事ではあくまで Unity の Analytics 機能についての解説を行っています。実際の運用では別の機能で送信していないか、自分のプログラムで別途送信していないか、サードパーティ製のライブラリなどについても送信していないかチェックする必要が有る事にご注意下さい。

 

はじめに

現在の Apple のストアのガイドラインGoogle の開発者ポリシーなどを確認すると子供向けアプリではユーザ情報の取得について一般的なアプリに比べて一段と気をつける必要が有る事が分かります。

App Store Reviewガイドライン - Apple Developer
https://developer.apple.com/jp/app-store/review/guidelines/#kids-category

ファミリー - Developer Policy Center
https://play.google.com/about/families/#!?zippy_activeEl=families-policy#families-policy

自分のアプリでユーザ情報を取得する必要が無い場合には全ての送信を止めるのが一番手っ取り早いです。今回はその方法を解説します。

なお、 Analytics では無いですがクラッシュや例外レポートを送信する Unity Cloud Diagnostics もユーザの情報を送信してると言えるのでこちらについてもしっかりと確認して必要に応じて無効にして下さい(※デフォルトで有効です)。

Unity IAP については実行時に Analytics 機能を無効化するとダッシュボードで収益の追跡は出来なくなりますが IAP の機能自体は正しく動作する様です。

Unity IAP without Analytics for kids games? - Unity Forum

https://forum.unity.com/threads/unity-iap-without-analytics-for-kids-games.689143/

ちなみに Unity では COPPA へ準拠した実装が簡単に実現出来ます。

f:id:nakamura001:20190823223132p:plain

送信を止める方法

以下のコードをプロジェクトに含める事で送信を止める事ができます。

public class DisableAnalytics : MonoBehaviour
{
    [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]
    public static void OnRuntimeMethodLoad()
    {
        UnityEngine.Analytics.Analytics.enabled = false;
        UnityEngine.Analytics.Analytics.deviceStatsEnabled = false;
        UnityEngine.Analytics.Analytics.limitUserTracking = true;
#if UNITY_2018_3_OR_NEWER
        UnityEngine.Analytics.Analytics.initializeOnStartup = false;
#endif
    }
}

※このコードは RuntimeInitializeOnLoadMethod() で呼んでいるのでシーンに配置されていなくても、プロジェクトに含まれているだけで動作します。

 

RuntimeInitializeOnLoadMethod() について詳しく知りたい方はこちらの記事などを参照下さい。

tsubakit1.hateblo.jp

なお、昔の Unity では deviceStatsEnabled (エディタ上の Disable HW Statistics に対応。フラグは逆ですが(^_^;)) は有料ユーザしか無効に出来ませんでしたが Unity 2018.3 からは無料ユーザも無効に出来るようになりました。

 

Unity 2018.3 よりも前のバージョンを使用している無料ユーザの方はバージョンアップか有料ユーザへの変更を検討下さい。

 

送信が止まっている事を確認する方法

確認についてはパケットキャプチャをするのが一番確実です。パケットの中に unity3d.com に向けて送信されているものが無くなっていれば送信が止まっています。

iOS/Android でのパケットキャプチャ方法の一例をあげておきます。

 

iOS/Android 共通

qiita.com

iOS

(英語)Apple公式の記事。

developer.apple.com

日本語の解説記事。

qiita.com

Android

 Google Play には沢山のパケットキャプチャアプリが有りますが今回のチェックには SSL(https) に対応しているアプリが必要です。例えば以下のアプリなどが対応しています。

play.google.com

実際に使用するには気をつける部分が有るのでちゃんとマニュアル(英語)の GetStartedをしっかりと読んでから使いましょう。

こちらはオープンソースのアプリでソースコードこちらから取得できます。

Unity の Cloud Build が 5.5 以前のものがサポート外に

最近、 Unity の Cloud Build のページにこの様なメッセージが表示されいてました。

 

f:id:nakamura001:20190618165927p:plain

As of June 17 2019, Cloud Build no longer supports building projects on versions of Unity earlier than 5.6. If you were using an earlier version of Unity, you will need to update your build targets. 

このメッセージは「2019/07/17 以降は Unity の Cloud Build でビルドには 5.6 以降の Unity を使用して下さい」というものです。つまり、 5.5 以前のものがサポート外となり、使えなくなるという事です。

 

現在の「Unity Version」の項目を確認してみた所、 5.5 系が選択出来なくなっていました。f:id:nakamura001:20190618170051p:plain

 

また、 5.5 以前のバージョンを使っていた自分のビルド設定に対し、「無効にしました」というメールが届いていました。

(現在プレビュー版の)Unity Physics を試してみる

Unity Physics は 100% DOTSで実装された新しい Unity の物理エンジンです。

f:id:nakamura001:20190418200344p:plain

GDCでの講演動画からの引用。

 

使い方

環境準備

対応しているのは Unity 2019.1 からなのでまだインストールしていない場合はインストールして下さい。

 

Unity エディタを起動し、メニューから Windows > Package Manager と選択。

 

Unity Physics はまだプレビュー版なので Advanced の所をクリック後、 Show preview package をクリックしてプレビュー版のパッケージも表示される様にします。

f:id:nakamura001:20190418201616p:plain

検索欄に Physics と入力して絞り込み、 install ボタンを押してインストールします。

f:id:nakamura001:20190418201839p:plain

 試してみる

床に球を落とす簡単なサンプルを作ってみます。

 

まずは床を作ります。 Cube を作成し、 Scale を (20, 1, 20) に設定して下さい。

Unity Physics に差し替える為に Box Collider コンポーネントを削除し、Physics Shape コンポーネント、 Convert To Entity コンポーネントを追加します。

 

次に球を作ります。 Shpere を作成し、床の上に移動させます。

Sphere Collider コンポーネントを削除し、Physics Shape コンポーネント、 Convert To Entity コンポーネントを追加します。

 

Physics Shape コンポーネントの Shape Type を Sphere に変更します。

f:id:nakamura001:20190418203016p:plain

球は床とは異なり、重力の影響を受けるので Rigidbody に当たるものを追加します。

Unity Physics では Physics Body がそれに当たりますので Physics Body コンポーネントを追加して下さい。

 

この状態で実行してみると実行した瞬間、床と球が描画上も Hierarchy からも消えてしまう事が確認できます。

 

これはDOTS(というか ECS)では(ざっくりと言うと)今までの Unity の世界とは別の世界で動いてるからです。

 

ECS 世界でのレンダリングを今までの世界に持ってくる場合には Hybrid Renderer というパッケージが必要です。 Package Manager を開き、 Hybrid Renderer をインストールして下さい。

 

インストール後にもう一度実行すると正しくレンダリングされたオブジェクトが物理法則に則って落下するのが確認できるかと思います。

 

もっと色々と試してみたい場合には GitHubこちらのリポジトリをクローンし、 UnityPhysicsExamples というフォルダのプロジェクトを実行してみて下さい。

Unityアプリの起動時の解像度選択のダイアログ表示がデフォルトで無効に

f:id:nakamura001:20190418171045p:plain

Unity 2019.1 から WindowsMac アプリの起動時に表示される解像度選択のダイアログ(↑こんなやつ)の表示がデフォルトで無効になりました。プロジェクトを新規作成した時には無効( Disabled )に成っています。

 

どうしても表示させたい場合には Player Settings のページで Player タブの中に有る

f:id:nakamura001:20190418170857p:plain

Display Resolution Dialog の項目を Enabled に変更して下さい。

f:id:nakamura001:20190418170900p:plain

※変更すると「非推奨になりました。将来のバージョンで削除されます」の注意書きが表示されますが現在のバージョンでは動作します。

f:id:nakamura001:20190418171019p:plain