強火で進め

このブログではプログラム関連の記事を中心に書いてます。

Unity を使って iPhone 向けの AR コンテンツを簡単に作る方法(USDZファイルを出力する方法)

まずは 試してみる

iPhone での AR は Apple のこちらのサイトで体験できます。
developer.apple.com

iPhone 向けの AR コンテンツを作成

iPhone で簡単に AR コンテンツを作成するには USD(Universal Scene Description) 形式のファイルを準備をするのが一番簡単です。 USD は CGアニメ映画で有名な Pixar が作成したファイルフォーマットです。
USD ファイルは「 USD ファイルと関連するテクスチャファイルなど」という複数ファイルの構成となり、煩雑です。そこで iPhone の AR では USD ファイルでは無く、「 USD ファイルと関連するテクスチャファイルなど」を1つの非圧縮zipにまとめた「 USDZ 」というファイル形式を使用します。

Unity は既に公式で USD フォーマットに対応しています。Unity公式ブログのこちらの記事に Untiy で USD を使える様にするパッケージの事について書かれていますがパッケージの追加は現在では手順が変わっている為、手順を解説しておきます。

USD を使える様にするパッケージを追加

USD のパッケージについては Unityのドキュメントのこちらのページに記載が有ります。

このページを見るとパッケージ名が com.unity.formats.usd だという事が確認できます。
f:id:nakamura001:20210930052504p:plain

これからこのパッケージ名を使ってパッケージを追加します。

Package Manager を開き、「+」アイコンをクリック > 「Add Package from git URL」と選択
f:id:nakamura001:20210930035652p:plain

com.unity.formats.usd と入力し、「Add」ボタンをクリック。
f:id:nakamura001:20210930035704p:plain

この画面の「install」ボタンをクリックすると USD パッケージを追加できます。
f:id:nakamura001:20210930040307p:plain

パッケージの追加以外の部分についてはこちらの記事の内容がそのまま使えます。シーンの色空間を「Linear」に変更するところから「Skin Weights」を「Unlimited」に設定する所までの作業を行って下さい。

USD ファイルで保存する環境を構築

Unity 上に配置したオブジェクトを USD 形式のファイルとして出力する為に Unity Recorder パッケージを追加します。

Package Manager を開き、表示を「Unity Registry」に変更。
f:id:nakamura001:20210930042628p:plain

「Recorder」で検索すると「Unity Recorder」が見つかるのでこちらを追加します。
f:id:nakamura001:20210930042630p:plain

USDZ ファイルに保存

環境の準備が終わったのでいよいよ USDZ ファイルに保存する方法の解説です。

まず、Unity のシーン上に USDZ ファイルに保存したい 3D モデルを配置しておきます。

メニューから Window > General > Recorder > Recorder Window と選択すると以下のウィンドウが表示されます。
f:id:nakamura001:20210930043723p:plain

「+ Add Recorder」をクリック > 「USD Clip」と選択すると以下の様になります。
f:id:nakamura001:20210930044710p:plain

Capture の Source に USDZ ファイルに保存したい GameObject を設定します。
f:id:nakamura001:20210930044720p:plain


「Export Format」を「USDZ」に変更します。
f:id:nakamura001:20210930051348p:plain

「START RECORDING」ボタンを押すと「STOP RECORDING」と表示が切り替わり、ゲームが実行されます。ゲームの起動が終わったら「STOP RECORDING」ボタンを押します。
f:id:nakamura001:20210930051419p:plain

これで USDZ ファイルが作成されました。このアイコンをクリックすると保存されたフォルダが開きます。
f:id:nakamura001:20210930051644p:plain

iPhone で AR 表示を確認

作成した USDZ ファイルは「メールで送る」「Dropboxに保存して開く」など何らかの方法を使って iPhone 上で開くだけで AR 表示ができます。

なお、 Unity 上でアニメーションを付けておくとアニメーションも AR 上で再生されます。

クオリティの高い和食の3D素材が無料で公開されていたので Unity にインポートしてみた

Twitter にてこの様なツイートがされている事を知りました。

プレビュー画像のクオリティも高いので実際に Unity に持ってきた時にはどれくらいのクオリティで表示されるのか試してみました。

今回使ったものはこちら

データとしては6貫とガリのデータが一緒になっていたので他のデータは削除して「マグロ」だけ使う事にしました。
データには Blender 形式のファイルも同梱されていたので Blender で編集しました。

Blender での作業

マウスドラッグによる領域選択で マグロ以外を選択した状態で Delete キーを押して他のオブジェクトを削除します。
f:id:nakamura001:20210930022825p:plain

次にマグロの位置が中央でないと使い勝手が悪いので修正します。

マグロをクリックして選択した状態で N キーを押すと「トランスフォーム」のプロパティが表示されるのでその中にある「位置」の X、Y、Z の欄に全て 0 を入力します。
f:id:nakamura001:20210930023600p:plain

Blender 上では Y、Z は既に 0 m となっているのでそれらについては入力する必要が無いように思えますが X だけに 0 を入力して Unity に持ってきた場合、以下の様に Y、Z が限りなく 0 に近いけど 0 で無い値となっている事が確認できます。
f:id:nakamura001:20210930022849p:plain

Unity で表示

「3D」のテンプレートで新規作成したプロジェクトに持ってくるとこんな感じ表示されました。
f:id:nakamura001:20210930024736p:plain

「High Definition RP」のテンプレートで新規作成したプロジェクトに持って来た場合はこちら。
f:id:nakamura001:20210930025615p:plain

Ray Tracing や DLSS に対応したレゴのUnity製ゲーム「LEGO Builder’s Journey」

www.youtube.com

Unity では Ray Tracing は既に使えますが DLSS(Deep Learning Super Sampling)については Unity 2021.2 から使える様になる予定です。現在、アルファ版が公開中でこちらで試す事が出来ます。
unity3d.com

HDRP のバージョン12のパッケージをインストールする必要が有ります。
docs.unity3d.com

automaton-media.com
www.4gamer.net

関連情報

LEGO Builder’s Journey」の公式サイト
www.lightbrick.com

NVIDIA GTC 2021 で行われた LEGO Builder’s Journey に関連する講演。
www.nvidia.com

Steamの販売ページ。
store.steampowered.com

Unity の DLSS 対応について中の人が話している動画。
www.youtube.com

NVIDIA DLSS: 今月は、『Rust』、『DOOM Eternal』、『LEGO Builder’s Journey』などが対応予定 - GeForce ニュース - NVIDIA
https://www.nvidia.com/ja-jp/geforce/news/june-2021-rtx-dlss-game-update/

Addressables パッケージの 1.8.3/1.8.4 で Sprite Atlas のロード時にエラー

f:id:nakamura001:20200528213220p:plain
この様な Sprite Atlas を作成し、 Box3 の Sprite を読み込むプログラムを書いた所、以下の様なエラーが発生しました。

Exception encountered in operation UnityEngine.ResourceManagement.ResourceManager+CompletedOperation`1[UnityEngine.Sprite], result='', status='Failed': Exception of type 'UnityEngine.AddressableAssets.InvalidKeyException' was thrown., Key=BoxAtlas[Box3], Type=UnityEngine.Sprite
UnityEngine.ResourceManagement.AsyncOperations.AsyncOperationBase`1:<.ctor>b__33_0(AsyncOperationHandle)
DelegateList`1:Invoke(AsyncOperationHandle) (at Library/PackageCache/com.unity.addressables@1.8.4/Runtime/ResourceManager/Util/DelegateList.cs:69)
UnityEngine.AddressableAssets.Initialization.<>c__DisplayClass14_0:<LoadContentCatalogInternal>b__0(AsyncOperationHandle`1)

調べてみるとこちらが見つかりました。バグ報告は既に行われている様です。

Loading sprites via AssetReferenceAtlasedSprite broken after upgrade to 1.8.3 - Unity Forum
https://forum.unity.com/threads/loading-sprites-via-assetreferenceatlasedsprite-broken-after-upgrade-to-1-8-3.873283/

一つ前のバージョン 1.7.5を使った場合にはエラー無く、実行されました。

HDR動画周りの規格についてのまとめ

HDR映像データの伝送についての規格

HDR10

Ultra HD Blu-ray 向けの規格。全米民生技術協会( Consumer Technology Association )によって策定。RGBの諧調がそれまでの SDR( Standard Dynamic Range )では 8bit だったのが HDR10 では 10bit になっている。

Dynamic Range の規定以外にも以下ものが規定されています。

  • 色域:Rec. 2020
  • ガンマカーブ:PQ(Perceptual Quantizer)

PQ はWeb配信、映画コンテンツ向けの規格。人間の視覚特性に合わせたガンマカーブ。詳細については以下を参照。

Perceptual Quantizer
https://en.wikipedia.org/wiki/High-dynamic-range_video#Perceptual_Quantizer

HDR方式の比較
https://www.soumu.go.jp/main_content/000375840.pdf

Dolby Vision

Dolby Laboratories が提唱している規格。RGBの諧調は最大 12bit まで使用可能な規格。

HLG(Hybrid Log-Gamma)

テレビ放送番組向け。NHKBBCが提唱している規格。RGBの諧調は 10bit 、色域はRec. 2020。 SDR ディスプレイとの互換性が有る。

Hybrid Log-Gamma - Wikipedia
https://en.wikipedia.org/wiki/Hybrid_Log-Gamma

HDR10+

HDR10+ Allianceによる HDR10 の拡張規格。 HDR10 の規格にダイナミックメタデータの仕様を追加したもの。RGBの諧調は最大 12bit まで使用可能な規格。

2018年に急速な拡大が見込まれるHDRの最新拡張規格「HDR10+」とは? - 価格.comマガジン
https://kakakumag.com/av-kaden/?id=11718

ディスプレイ規格

DisplayHDR

PCモニターに必要な要件を定めたもの。ディスプレイの品質保証の規格。この規格はHDR10への対応を必須としている。

グレードとして以下のものが有る。数字が大きいほど品質が高い。

  • DisplayHDR 400
  • DisplayHDR 600
  • DisplayHDR 1000

高画質モニターの目印! 「DisplayHDR」対応のLG液晶モニター、何がどうすごいか徹底検証 (1/3) - PHILE WEB
https://www.phileweb.com/review/article/201906/07/3440.html

WindowsHDR モニターを使う手順

Windows 10 の HDR と詳細な色の設定 - Windows Help
https://support.microsoft.com/ja-jp/help/4040263/windows-10-hdr-advanced-color-settings

HDR環境の Windows で画面キャプチャをする方法

ショートカット「Windowsキー+Altキー+PrintScreenキー」でキャプチャを行うと JPEG XR と PNG ファイルで保存されます。この時、 JPEG XR ファイルには HDR の情報を保った状態でキャプチャが行われています。

JPEG XR ファイルのビューアには以下のアプリなどが有ります。
www.microsoft.com

HDR環境の Mac で画面キャプチャをする方法

※現在、調査中

HDMI ケーブルについての注意点

ディスプレイが HDR を表示可能な性能を持っていても使用している HDMI ケーブルのバージョンによっては正しく表示されない事もあります。商品に付属していたものを使う場合は大丈夫かと思いますが、別途購入する時には気を付けましょう。

f:id:nakamura001:20200217155841p:plain
(「価格.com」からの引用)

価格.com - HDMIケーブルの選び方
https://kakaku.com/kaden/hdmi-cable/guide_2211/

関連情報

High-dynamic-range video - Wikipedia
https://en.wikipedia.org/wiki/High-dynamic-range_video

Rec. 2020 - Wikipedia
https://en.wikipedia.org/wiki/Rec._2020

What's HDR | HDR | 映像制作機材 | 法人のお客様 | ソニー
https://www.sony.jp/products/Professional/c_c/hdr/index01.html

よくわかる、HDR徹底解説! ガンマカーブの違い | EIZO株式会社
https://www.eizo.co.jp/eizolibrary/color_management/hdr/index2.html

4Kテレビ選びの重要ワードHDR=「HDR10」「Dolby Vision」「HLG」って何? - 価格.comマガジン
https://kakakumag.com/av-kaden/?id=10519

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

Vulkan の環境で再生出来るのは 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