Qiita一覧

投稿日:9月 07, 2020   最終更新日:1月 29, 2021

Twitch のウェブサイトを YouTube のシアターモード風に改造する Qiita

Twitch のウェブサイトを YouTube のシアターモード風に改造する

Twitch.tv の配信画面を YouTube のシアターモード(動画をウインドウ幅いっぱいに表示→その下に2カラムで概要とチャット欄)にしたくて無理やり弄った記録。久々の JavaScript + CSS。 ↓ 結果はこんな感じ ↓ もくじ はじめに Twitch の画面構成 代替手段 モバイル版をPCで表示 Multistre.am を使う ブックマークレット おわりに はじめに 巣篭もり生活で見たいアメドラも尽きて Twitch に辿り着きました。 作業中はセカンドモニターの端に表示して垂れ流し、表示しているモニターは 1440 x 2560 の縦配置なのでウインドウ幅はかなり狭い状態。 しかし、Twitch のPC版のウェブサイトはウインドウが横長または全画面表示にしていることを前提にしているようで、ウインドウ幅が狭いとちょっと見づらい。 Twitch の画面構成 Twitch の PC ブラウザ版のウェブサイトはレスポンシブ対応で、ウインドウ幅が小さくなるにつれサイドバー → チャット欄と順に非表示になる仕様。 シアターモードなんてのもありますが、YouTube とは違いチャット欄は動画右側に表示されたまま、概要欄とサイドバーが非表示になるタイプ。ちょっと想像と違う。 ◆ シアターモードの比較 ← Twitch | YouTube → 代替手段 ながら見ならチャット欄はいらないだろって感じですが、表示されてなきゃないで寂しいので何とか表示したい。そこで。 モバイル版をPCで表示 PCブラウザでも www.twitch.tv ではなく m.twitch.tv にアクセスすればモバイル版を表示出来て、上から下への縦長レイアウトで動画の下にチャット欄を表示できる。んですが、モバイル向けなので PC で使うには不便な点が結構あります。 PC向きではない部分: モバイル版は左のサイドバーが無いのでザッピングにひと手間 初期状態がミュートで、新しいストリームを表示するたびに動画をクリックしなきゃダメ ニコ動風コメント表示やその他のエクステンションがオフになる チャット欄がモバイル向けの簡易版で、 たまにランダムで視聴者に配られるギフトの対象外になる(たぶん) チャンネルポイントが貯まらない(たぶん) 予想・賭け機能(Channel Points Predictions)に参加できない ◆ Twitch モバイル版 Multistre.am を使う 次にチャット欄がフル機能の状態で縦レイアウトにする方法として試したのが Multistre.am だったんですが、「Twitch.tv で見たほうがベストな体験が出来ますよ」的なスクリーンが表示されてストリームが止まってしまったり、過去の配信を選択して流すことが不可能だったり。。。で断念。 ブックマークレット そんなこんなで、とりあえずモバイル版で落ち着いていたんですが、表示をモバイル版に切り替える時に使っていたブックマークレット javascript: location.href = location.href.replace('https://www.', 'https://m.'); コレを、サイトのレイアウト弄る内容に変えれば・・・ ? と。 それがコチラ。 javascript: { let sidebarEl = document.getElementById('sideNav'); let sidebarWidthPx = sidebarEl.offsetWidth+'px'; let offsetTopStyle = 'calc( (100vw - '+sidebarWidthPx+') * 0.5625 )'; let transitionParam = ' 0.5s ease'; let playerEl = document.getElementsByClassName('persistent-player tw-elevation-0')[0]; playerEl.style.setProperty('width', '100%', 'important'); playerEl.style.setProperty('transition', 'width'+transitionParam, 'important'); let chatEl = document.getElementsByClassName('channel-root__right-column channel-root__right-column--expanded')[0]; chatEl.style.setProperty('bottom', '0px', 'important'); chatEl.style.setProperty('height', 'calc(100% - '+offsetTopStyle+')', 'important'); chatEl.style.setProperty('transition', 'bottom'+transitionParam+', height'+transitionParam, 'important'); let infoEl = document.getElementsByClassName('channel-root__info channel-root__info--with-chat')[0]; infoEl.style.setProperty('margin-top', offsetTopStyle, 'important'); infoEl.style.setProperty('transform', '', 'important'); infoEl.style.setProperty('transition', 'margin-top'+transitionParam+', transform'+transitionParam, 'important'); let buttonEl = document.getElementsByClassName('right-column__toggle-visibility toggle-visibility__right-column toggle-visibility__right-column--expanded tw-absolute tw-flex tw-flex-grow-0 tw-flex-shrink-0 tw-visible tw-z-above')[0]; buttonEl.style.setProperty('top', 'calc(1rem + '+offsetTopStyle+')', 'important'); buttonEl.style.setProperty('transition', 'top'+transitionParam, 'important'); } 無事、YouTube 風のシアターモードに改造することが出来ました。 スタイルシートで transition を設定しておけばアニメーションまでつけてくれて、良い時代になりましたねー。 おわりに ブックマークレット、既に死語の気もしますが便利ですよね。 JS / CSS を触ってた頃は「JavaScript じゃなくて Javascript だ!」勢が存在していた気もしますが、今は逆になってて不思議な気分です。彼らに何があったんでしょうか。 ともあれ最近 WebGL 面白そうだなーと思ってるので周辺技術を思い出すにはいい機会でした。 -- 以上です。お疲れ様でした。

読む
Unityの多言語対応(UnityEditor.L10n&UnityEditor.Localization) Qiita

Unityの多言語対応(UnityEditor.L10n&UnityEditor.Localization)

個人的には #if UNITY_EDITOR_LOCALE_JA みたいなプリプロセッサで対応できると良いなーと思っていたんですが…。 もくじ はじめに 多言語対応の方法 メニューが多言語化できない問題 プリプロセッサーでの対応(が理想) おわりに はじめに パッケージの多言語化に向けて下準備をしている中、UnityChanSpringBone が多言語化しましたってメールが来てたので調べてみました。 Add localization and make default language to English · unity3d-jp/UnityChanSpringBone@7cc16f3 多言語対応の方法 多言語化の方法ですが、UnityEditor.Localization で検索すると、既に纏めてくださってる方がいます。 Unityエディタ拡張で多言語対応する方法 コチラでこれまでの経緯含めて全部わかります。 UTJ の UnityChanSpringBone の更新も ↑ 記載の方法なので、公式の推奨するやり方だと思って問題なさそうです。 -- UnityEditor.Localization.Editor.Localization.Tr()、頭痛が痛い状態のクラスですが、案の定 Unity 2020 では UnityEditor.L10n.Tr() に変更されています。 Unity - Scripting API: Localization ↓ ↓ ↓ Unity - Scripting API: L10n UnityEditor.Localization がサポートされているのは Unity 2019 だけなので要注意ですね。 メニューが多言語化できない問題 VRM Tool Kit というパッケージでも多言語化の準備を進めているのですが、UnityEditor.L10n / UnityEditor.Localization ではメニュー項目の多言語化が出来ない、という問題があります。 Unity エディターへのメニュー項目の追加はアトリビュートを通して行うので、文字列は const である必要があります。 が、public static readonly string foo = L10n.Tr("bar") だとここで躓いてしまいます。 ※ なにか凡ミス or 勘違いしてる?? プリプロセッサーでの対応(が理想) L10n は UnityEngine 以下ではないことからエディターしか念頭に置いていないと思われ、その割には Assembly Definition が必須で手間がかかる、という代物。 大規模なパッケージなら Poedit のようなエディターで編集できるのは良いことですが、小規模なプロジェクトのエディター関連だけを多言語化、という需要の為にはオーバーキル。 もっと簡単に対応できるように、プリプロセッサーのシンボルも追加して欲しいところです。 日本語 → #if UNITY_EDITOR_LOCALE_JA 英語 → #if !UNITY_EDITOR_LOCALIZED(下位互換性が確保できるハズ) VRM Tool Kit では UIResource.en-US.cs というファイルに英語のインターフェイス関連の文字列をまとめているんですが、シンボルがあれば UIResource.[language-country].cs の中身をプリプロセッサーで包んでやるだけで対応できるし、メニューの多言語化も可能。Assembly Definition も要らないのでお手軽です。 ※ あとは全体を #if ~ #endif で包むだけ public static class UIResource { #if UNITY_EDITOR_WIN const string MenuIndent = "& "; const string MenuAmpersand = "&&"; #else const string MenuIndent = " "; const string MenuAmpersand = "&"; #endif public static class CharacterMenu { public const string Label = "Character"; public const string MenuPath = VRMToolKitRootMenu + "/" + Label + "/"; public const string CharacterToTPose = MenuPath + "Character to T-Pose"; public const string RevertToDefaultPose = MenuPath + "Revert to Default Pose"; public const string CharacterToTPoseExceptForArm = MenuPath + MenuIndent + "Except for Arm " + MenuAmpersand + " Finger Root"; public const string RevertAllTransformsToDefault = MenuPath + "Revert All Transforms to Default"; } } 特定の機能のためにプロジェクト全体に及ぶ設定にシンボルを追加して対応、はイヤなので、是非公式に対応して欲しいですね。 おわりに プリプロセッサーを使って多言語対応する方法、実は知られてないだけであるんじゃないかと思ってますが、どうなんでしょう。一番簡単だしそうなるだろうと思って UIResource に全部纏めたんですが。。。 L10n を使うと Unity 2020 以前と以後のパッケージを複数用意しなきゃいけないし、多言語化っていってもエディターだけだし、Poedit は Unity エディターの多言語化みたいな大規模な作業には向いてるだろうけども、そこまでの規模じゃない場合はちょっと大変ですよね。 -- 以上です。お疲れ様でした。

読む
VRM Tool Kit 取扱説明書 Qiita

VRM Tool Kit 取扱説明書

VRM とそれにまつわる面倒事をどうにかしよう、という Unity 向けのツールです。 VRM がパッと作れるのはモチロンですが、更新のたびに何度もシーンを作り直さなくても良い、というのが最大の特徴です。 こんな方におススメ: 「モデル更新のたびにVRMを作り直すのはイヤ」 「モデル・ボーン調整→揺れ物チェックを行ったり来たりしたい」 「Spring Bone が面倒でつらい」 「モデル上がってきたし仮でいいから演者に合わせてみたいんよ、とりあえずVRMくれ。」 「昨日話題に上がったやつを今日の生放送までにモデルに反映させたいんだけど??」 VRMの作成や調整、更新を継続的、頻繁に行う場合に特に有用なツールです。 【YouTube】VRM Tool Kit チュートリアル VRM Tool Kit の特徴 「VRM Tool Kit」には、大きく分けて2つの機能があります。 【YouTube】1分でわかる「VRM Tool Kit」 👗「揺れ物セットアップ」VRM Spring Bone の一括作成・編集ツール ボーンやコライダーなど多数のオブジェクトを一括で調整するためのツールです。 人型キャラクターに合わせたコライダーの作成 揺れ物ボーンの一括登録 コライダーの一括編集 多数のボーンとコライダーの関連付け ♻️「非破壊ワークフロー」作り捨てではない Unity のシーン作り メッシュやボーン・スキニングなど、何かを更新する度にシーンを作り直さなくても良いようにするためのツールです。 「モデルの追加や既存モデルの更新」「ブレンドシェイプの追加・更新」「スキンウェイトの更新」等が、VRMを書き出せる状態を維持したまま可能。 モデルのブラッシュアップと VRM セットアップ作業を並行して進めることが可能。 ボーンの追加・削除・更新・階層構造の変更が可能。 揺れ物(Spring Bone)のパラメーターだけではなく、モデルの割りやボーン数・位置の調整も含めてのトライ&エラーを行うことが可能。 マニュアル VRM Tool Kit 取扱説明書(目次) ライセンス 個人ライセンスでのソフトウェアの利用は、団体・法人以外の個人的な用途に限り利用可能です。 ソフトウェアの解析や改変・再配布など許可のない利用は禁止されています。 制作・著作 Copyright © Sator Imaging, all rights reserved. VRM and UniVRM are licensed under the MIT License. ダウンロード VRM Tool Kit のダウンロードはこちら。 【Unity】VRM 作成用ツール「VRM Tool Kit」 動作確認 公式の VRM ビューアーや VRM 対応ソフトウェア(PC)で書き出した VRM の動作を確認しています。 VRoid Hub 等のアップロードして利用するタイプのサービスや、スマホアプリでの動作が上手くいった&上手くいかなかった等がありましたら、ココや Twitter(@sator_imaging)にてお知らせいただけますと! 更新履歴 v1.0.0 推奨バージョン:「VRM v0.53.0」+「Unity 2018.4.0f1」 もくじ インストール方法 macOS での VRM プレビュー Unity Package Manager を利用する場合 VRM Tool Kit 使用方法 VRM シーンの作成手順 揺れ物のセットアップ手順 リファレンス Export FBX-Linked VRM Character Spring Bone Check List VRM(UniVRM)について あわせてどうぞ 各種ライセンス情報 アリシア・ソリッド ユニティちゃん インストール方法 まず最初に VRM 作成用の Unity プロジェクトに VRM(UniVRM)のパッケージをインポートします。 VRM(UniVRM)のダウンロードは以下のページより行います。※ バージョンは v0.53.0 を推奨しています。 Release v0.53.0 · vrm-c/UniVRM -- 続いて、ダウンロードした「VRM Tool Kit」に含まれている、VRMToolKit-<バージョン>.unitypackage をプロジェクトにインポートします。 -- 最後に「VRM Tool Kit」に含まれている、非破壊ワークフローを実現する上で必要な VRM 用の更新ファイル(UniVRM-<バージョン>_BlendShapePreviewEditor.unitypackage)をインストールします。 注: 更新ファイルをインストールしていなかったり、UniVRM v0.53.0 以外のバージョンを使用していてブレンドシェイプのプレビューが表示されない場合は、インスペクターの「Prefab」パラメーターに、.fbx ファイルを設定することで表示されるようになります。 ※ UniVRM の更新ファイルをインストールしていない場合の使い方 macOS での VRM プレビュー macOS では VRM をプレビューするためのアプリが公式からは提供されていません。 macOS 上で確認する必要がある場合は、VRM ビューアーをインストールすることが出来ます。 VRM ビューアー for macOS - Sator Imaging - BOOTH Unity Package Manager を利用する場合 VRM 公式サイトから UniVRM.asmdef-<バージョン>.unitypackage を追加でインストールすると、「VRM Tool Kit」を Unity Package Manager のパッケージとして読み込むことが出来るようになります。 ※ パッケージとして利用する場合は、赤線で示した UnivRM の ***.asmdef も合わせて導入します。 上記の追加ファイルをインストールした上で、「VRM Tool Kit」に含まれている VRMToolKit.asmdef.txt というファイルを VRMToolKit.asmdef という名前に変更することで、パッケージとして読み込むことが出来るようになります。 パッケージとして読み込む方法は以下のマニュアルをご覧ください。 Installing a local package - Unity マニュアル VRM Tool Kit 使用方法 VRM シーンの作成手順 VRM シーン作成手順と注意するべき点は以下の通りです。 【YouTube】VRM Tool Kit チュートリアル Unity の Fbx ファイルの読み込み設定で「Rig」が「Humanoid」になっているかを確認します。 「Avatar Definition」の「Configure...」を開いて、Eye・Jaw に必要のないボーンがアサインされていないかを合わせて確認します。 Fbx ファイルをシーンのヒエラルキーに追加します。 アバターが T ポーズになっていない場合は T ポーズにします。 注:揺れ物のボーンもモデリングに合わせたままの状態ではなく、重力に従うように調整します。 セットアップ時のダイアログで「Auto T-Pose」選択するか、VRM > Character > Character to T-Pose を実行することで自動で T ポーズにすることが出来ます。 ※これは VRM 書き出しオプションで Force T-Pose をオンにした時と同じ状態です。 注:ただし、VRM の提供する Force T-Pose を使って T ポーズにすると、腿と足は問題ないが膝のボーンだけがねじれている、など気付き辛いエラーが発生する場合があるので、おかしなところがないか必ず確認するようにします。 自動で T ポーズにした後に VRM > Character > Except for Arm & Finger Root を実行すると、肩から手首、指の根元のボーン以外をプレハブの初期値に戻すことができます。 アバターを選択した状態で、VRM > Export FBX-Linked VRM を実行します。 ※ この段階で非破壊ワークフローのベースが出来ているので、一度 Pose Freeze と Force T-Pose(必要な場合)をオンにして、VRM 書き出しを行って問題がないか確認しておきます。 続いて VRM ブレンドシェイプのパラメーターを設定します。 スプリングボーンツールを使用して揺れ物のセットアップを行います。 VRM Meta にタイトルや作者の情報を設定します。 注: ボーンのセットアップの状態によっては、自動 T ポーズ機能を使うと一部のボーンが曲がることがあるので必ず確認します。 ※ 自動 T ポーズを調整せずにVRMを書き出して、がに股になった状態。 -- VRM の基本設定は以上で終了です。 メニューの VRM > Check List の項目を確認してから、.vrm としてエクスポートします。 注:VRM を書き出すときは、Pose Freeze と Force T-Pose(必要な場合)をオンにします。 揺れ物のセットアップ手順 揺れ物(VRM Spring Bone)ツールの使い方は以下の動画で確認できます。 ※ 各機能の詳細は次のリファレンスの項目をご覧ください。 【YouTube】VRM Tool Kit - 揺れ物セットアップツール スプリングボーンについての確認事項 揺れ物のボーンをどれだけ細かくしているかによりますが、殆どのキャラの場合コリジョンの分割数はデフォルトの 0.05(5cm 毎にコライダーを作成)で十分です。 PC ではなくモバイル向けなら 5cm だと少し処理が重いかもしれません。適宜調整します。 動画を見てわかる通り、そもそもコリジョンをいくら細かくしても揺れ物のボーンが粗いと貫通します。 重要なのはコライダーと揺れ物のバランスです。 VRM Spring Bone のコライダーは正確な衝突判定をしているわけではなく、「中心点から半径以内の距離に位置していたら衝突しているということなので押し出す」という処理を行っているだけなので、神経質にこだわってもあまり結果に結びつかないことが多いです。 揺れ物のボーンの数とコライダーの数がバランスを保っていることの方が重要なので、一度セットアップして動かしてみてから、必要に応じて揺れ物の衝突判定箇所を増やす等を行います。 なので、工程の後戻りができることが重要になります。 衝突判定する場所を増やすだけであれば、スキニングの為のボーンを追加する必要はなく、ボーンとボーンの間にロケーターやヌル(=GameObject)を挟むだけでも問題ありません。 スキニング用のボーンが仕込んであるよりも精度は低いですが、腕を貫通していたものがめり込みはするが貫通はしなくはなった、程度には出来ると思います。 PC VR 向けなど処理の負荷を考えないのであれば、コライダーもボーンも細かく入れてしまうのが早いです。 それでも難しければ、そもそもあまり揺れないようにバネを強くして、水の中にいるような状態にしてめり込みや貫通が起きづらい状態にして逃げます。 注: 処理負荷の関係でコライダーの数は減らしたとしても、足や手など揺れ物から離れている部分のコライダーの削除はなるべく避けたほうが良いです。 髪の毛が揺れて腕に衝突しているのを見ると、多くのユーザーや演者は手でも髪の毛を触れると思って触ろうとして、あれ突き抜けた? となることが多いです。 リファレンス VRM Tool Kit をインストールすると、Unity エディターの VRM メニューに項目が追加されます。 各機能の詳細は以下の通りです。 ※ 各機能は特に指定が無いかぎり、VRM アバターのルートを選択した状態で実行します。 Export FBX-Linked VRM Fbx キャラクターを VRM として出力できるように調整した上で、VRM のエクスポートダイアログを表示します。 ※ 実行時にダイアログウインドウが表示されるので、処理内容を選択します。 Auto T-Pose: 自動で T ポーズにします。 Current Pose as T-Pose: 現在のポーズを T ポーズとして扱います。 ※ 初期化時は「Auto T-Pose」、更新時は「Current Pose as T-Pose」を使うのがおススメです。 Character キャラクターに関する機能です。 Character to T-Pose キャラクターを T-Pose にします。 Revert to Default Pose キャラクターを初期ポーズに戻します。 Except for Arm & Finger Root 「肩」「上腕」「前腕」「手首」「指の根元」を除いたすべてのボーンを初期ポーズに戻します。 Revert All Transforms to Default キャラクターのボーンだけではなく、揺れ物を含む全ての Transform を初期状態に戻します。 Spring Bone 「VRM Tool Kit」の揺れ物(VRM Spring Bone)に関する機能です。 ※ UniVRM に含まれる VRM Spring Bone についての詳細は以下のページで確認できます。   https://vrm.dev/univrm/components/univrm_secondary/ Spring Works Spring Bone メニューをウインドウとして開きます。 Add Spring Manager スプリングマネージャー(VRM Spring Bone)をアバターに追加します。 ※「髪」「スカート」等、各部位ごとにマネージャーを作成するようにします。 Add Spring Collider to Selection 選択したオブジェクトにコライダー(VRM Spring Bone Collider Group)を追加します。 Select Colliders in Hierarchy 選択しているオブジェクトとその階層の中から、コライダーがアタッチされている GameObject を選択します。 Assign Bones & Colliders to Spring Manager 選択しているスプリングマネージャー(VRM Spring Bone)に、ボーンやコライダーを関連付けます。※ Spring Bone 関連コンポーネントがない GameObject がボーンとして扱われます。 Scale Up/Down Selected Colliders' Radii 選択している全ての Spring Bone コライダーの半径を拡大・縮小します。 Generate Human Colliders for Selected Animator 選択したヒューマノイドキャラクターのボーンに対してコライダー(VRM Spring Bone Collider Group)を追加します。 ※ コライダーがアタッチされた Collider__<BoneName> と言う名前の GameObject が各ボーンの子供として追加されます。 Remove Null References from Hierarchy 選択しているオブジェクトとその階層のコンポーネントから、missing になっている Root Bone や Collider を取り除きます。 Check List エクスポート前に確認するべき項目の一覧です。 ※ 各メニューは一覧表示の為だけの物で、選択しても機能しません。 VRM(UniVRM)について VRM と UniVRM についての詳細は、以下のページで確認できます。 UniVRMマニュアル UniVRMのコンポーネント -- 以上です。お疲れ様でした。 あわせてどうぞ #VTuber開発まとめ #Unity開発まとめ #DCCツール&アセット開発まとめ 各種ライセンス情報 この記事内で使用、改変しているデータのライセンス情報は以下の通りです。 アリシア・ソリッド ニコニ立体ちゃん特設サイト - ニコニ立体 ユニティちゃん この記事中で使用されているユニティちゃんは、ユニティちゃんライセンス条項の元に提供されています。 DATA DOWNLOAD-利用規約 « UNITY-CHAN! OFFICIAL WEBSITE

読む
Unity Package Manager の使いどころ Qiita

Unity Package Manager の使いどころ

Google が Unity 向け SDK の配布・バージョン管理に Unity Package Manager(以下UPM)を使うようになっていたりと、ようやく今時の UPM 事情に追いついたので、ここではその辺の情報のまとめを。 UPM 対応パッケージをつくるには? エディター拡張の管理に UPM を使ってみたら? 等の細かいお話についてはこちら。 エディター拡張を Unity Package Manager に対応させる もくじ グーグルの Unity 向け SDK が UPM 対応に Google 製レジストリ追加ツール Scoped Registry について GitHub Packages について GitHub Packages の注意点 その他雑記 グーグルの Unity 向け SDK が UPM 対応に ※ Scoped Registry なら検索も出来るしバージョンも選べる Google for Games Developer Summit March 2020 でちらっと Scoped Registry について触れられていて、今後は UPM の Scoped Registry での運用に移行するようで。 UPM の Scoped Registry は今後発展していきそうな印象。ローカルパッケージや Git をパッケージとして扱う、という機能は残ってるけどもう息してない、、、という感じ。 Scoped Registry が設定された manifest.json をバージョン管理ソフトで共有すれば、あとは UPM の UI から必要なバージョンをダウンロードするだけになる。ハズ。簡単。 2020 年 3 月 Google for Games Developer Summit での発表内容のまとめ Build your game in Unity | Android Developers ↑ の対応バージョンは Unity 2018.4 以降。 Unity - Manual: Scoped package registries マニュアル的には Scoped Registry の対応は 2019.1 から(Versions without this page だからページがないだけか) Google のは認証不要で大っぴらに公開だけど、認証アリのプライベートな Scoped Registry を使う場合は、Unity 2019.3.4f1 以降が対応しているとか。 Google 製レジストリ追加ツール manifest.json を書き換えてくれるインストーラー(.unitypackage)が用意されてる。 UPM ウインドウの「+」ボタンに Add Custom Registry を追加してくれれば、今後はこういうインストーラーも不要になる。 Scoped Registry について パッケージ管理システム(npm: Node Package Manager)のレジストリ。 パッケージの追加、じゃなくてレジストリの追加が出来た方が諸々良い感じなんじゃ? と思って調べたら、Unity 2019.1 から機能が追加されている。 Unity - Manual: Scoped package registries Unity 純正のパッケージ同様、検索やバージョン切り替えにも対応してる レジストリといえば GitHub Packages ってリリースされましたね。 GitHub Packages Documentation - GitHub ヘルプ 認証も行けるらしい。(Unity 2019.3.4f1 以降) Unity Package Manager が認証に対応しました! 自前サーバーで行くなら @Shiranui_Isuzu さんの方法。 UnityのPackageManagerに自分のパッケージを入れるまで - Qiita GitHub Packages について Scoped Registry としては GitHub Packages が使えそう。他には公式マニュアルに記載されている Verdaccio というローカルに立てるサーバーソフトウェアがある。 -- GitHub Packages は基本無料で使える、ストレージ容量や転送量なんかで料金が発生するタイプのサービス。 GitHub Packagesについて - GitHub ヘルプ About billing for GitHub Packages - GitHub ヘルプ GitHub Packages の注意点 GitHub Packages でパブリックに公開した npm パッケージは、消すのが容易ではなさそう。 技術的な問題で削除できないんではなく、パッケージ間の依存関係が崩れるから消さない、という思想的な理由による方針なので、間違えたからーーだと即座に削除対応はしてもらえない、かも? パッケージを削除する - GitHub ヘルプ パブリックパッケージの削除について パッケージに依存しているかもしれないプロジェクトが壊れることを避けるために、パブリックなパッケージ全体、あるいはパブリックなパッケージの特定バージョンを削除する事はできません。 法的な理由、あるいはGDPR標準への準拠のような特別な状況下では、GitHub Supportに対してパブリックパッケージを削除してもらうよう、連絡フォームを使って頼むことができます。 -- GitHub Teams 無料化で、とりあえず作ってある Organization のリポジトリもプライベートにできるようになったので、レジストリにはプライベートレポジトリを使う。 その他雑記 共通基盤的な、プロジェクトを跨いで使う諸々を Unity プロジェクトでどうやって共有するか。 -- クラウドストレージやらリポジトリやらを同期したローカルフォルダーを各人の Unity プロジェクトで参照するように設定する、なんてやるよりは、レジストリを建てて配信した方が良さそうだけど、Assembly Definition が何というか、邪魔なんだろうな。 Scoped Registry は .asmdef 無しでもおっけ、とか出来るともっと流行りそう。 Assembly Definition について ↓ エディター拡張を Unity Package Manager に対応させる -- Scoped Registry を使って、シェーダーを UPM 対応パッケージとして配信するのは良さそう。Assembly Definition 云々の影響がほぼ無さそうだし。 -- Unity を使ってる = Git も使ってる率高めだから、もっと単純に * な .gitignore を持った Extensions フォルダを Assets/ 以下に作るようにして、そのフォルダ内にリポジトリをクローンする方法が一番… かも? Assets/ に余計なファイルは増えるけど、畳んでおけば UI 上は邪魔にはならないし .asmdef もいらない。ファイルの削除・移動を含んだ更新も追っかけられる。 GitHub の Teams も無料化されたので、とりあえずだから、で始まって結果的に個人所有のプライベートレポジトリに物がある、も避けられる状況になってる。 -- 配るときに限った話。コピーが散らばることになるので、各プロジェクトでファイルの変更もするような場合は、自分で全部確認して必要に応じてコミットする必要アリ。 -- エディター拡張はそもそもインストール、という工程自体を無くしたいからホームディレクトリの Unity / EditorExtensions と Unity / <Version> / EditorExtensions フォルダーを Unity は常に読み込む、.dll 化も .asmdef も不要、みたいになってくれると良い。 -- とか考えていくと、プロジェクトに必要なシンボリックリンクが無かったら作ったり最新のリリースを確認しに行ったり同期したり、使うバージョンを変えたら必要に応じて Unity 自体を更新したり、な環境セットアップ系のバッチコマンドを用意した方が良いじゃね、自由度も高いし、というよくある感じの結論に。 -- 以上です。お疲れ様でした。

読む
エディター拡張を Unity Package Manager に対応させる Qiita

エディター拡張を Unity Package Manager に対応させる

Assets/ に実行時に必要のないエディター拡張用のファイルも追加しなければならない、そんな状況も Unity Package Manager に対応することで解決出来るようになりました。嬉しいですね。 ※ ローカルパッケージとして読み込んだ状態 と思って色々と調べていたのですが、今時点では遊びや好奇心の範疇を超えなかったので、真面目に運用しようと思ったら Unity 2020 飛んで Unity 2021 あたりかな、という印象でした。 エディター拡張の管理はシンボリックリンクを使った方法が現実的だと思いますが、Unity Package Manager に興味があれば。 追記 Google の Unity 向け SDK の Unity Package Manager 対応をふと見つけたり、その他 UPM 関連の諸々を読んだ結果。 ↓ ↓ ↓ プロジェクトを跨いで使用する汎用的なツールの更新を日常的に行っていて、どのプロジェクトでも常にそのツールを最新の状態にしておきたい。 その維持管理の手段として Unity Package Manager を使うのはどうか、について。 汎用ツールのコピーが散在しているからとりあえず何かしら手を打ちたい、位であれば、ローカルパッケージにまとめるなんて手間をかけずにシンボリックリンクを作った方が良い。 がっつりやるならローカルパッケージとしてではなく UPM 向けの Scoped Registry を立てるまでやった方が良い。 といった感じに。 ローカルパッケージの読み込みや Git レポジトリをパッケージとして読み込む、なんかの機能は今後ディスコンされそうな気配まである。Scoped Registry 一択。 Unity Package Manager の使いどころ -- ※ Unity Package Manager で推奨(?)されている、Editor フォルダーに対する Runtime・Tests フォルダーという存在は、Assembly Definition 作りが大変になる従来の Scripts 内に Editor フォルダーを置く、という手法より良い感じ。 もくじ はじめに シンボリックリンクとフォルダージャンクションの違い Unity Package Manager 対応の利点 UPM に対応させるかどうか Assembly Definition(Assembly-CSharp.dll)の問題 その他 UPM 対応手順 package.json を作成 Assembly Definition(.asmdef)を追加 その他の UPM パッケージ用ファイル サンプルシーンの扱い パッケージが見つからないとき おわりに はじめに Unity エディターで汎用的に使用するエディター拡張であっても、通常は Assets/ 以下の Editor/ フォルダーにファイルをコピーすることになります。 ゲームに必要なコンポーネントは動作確認済みのバージョンのコピーであって欲しいので問題ないですが、エディター拡張は常に最新の機能を持った物を使いたいですよね。 しかし、エディター拡張関連のファイルもコピーなので、特定のプロジェクトに存在するファイルを更新しても他のプロジェクトには更新が適用されません。 ※ 最新のものを使う以前に、結構便利に使ってたアレ、いつのどのプロジェクトにファイルがあるんだっけ?? ともなりがち。 で、 【UnityEditor】プロジェクトをまたいでエディター拡張したい - Qiita エディター拡張を .dll 化しなきゃいけないのが… や、 Windows 用のシンボリックリンク・フォルダージャンクション作成シェル拡張 今時点では一般的(?)なやり方 を使ってどうにかしていた訳です。 シンボリックリンクとフォルダージャンクションの違い Windows のショートカットは 「.lnk という拡張子を持ったエクスプローラー向けのファイルフォーマット」 という厄介な存在でしたが、少し前から Windows でも Linux と同じようなシンボリックリンクとフォルダージャンクションという機能が使えるようになっています。 この機能を使ってファイルの実体は一か所、そのファイルを参照するプロジェクトは沢山ある、を実現するわけですが、両者には少しだけ違いがあります。 シンボリックリンク シンボリックリンクは SourceTree 等の Git クライアントではフォルダーとして認識されないので、エディター拡張の共有には便利。※インストール時の設定でシンボリック云々を設定していない場合 ただし、ファイルシステムレベルでフォルダーとして認識されるわけではないので、Asset Store Tools でシンボリックリンク以下のファイルをアップしようとするとエラーが出る、等の問題も。 フォルダージャンクション 対してフォルダージャンクションはより低層で機能しているようで、どのソフトウェアからも通常のフォルダーと区別なく認識され、Git クライアントや Asset Store Tools でも運用可能。 ※ シンボリックリンクは Windows の機能、フォルダージャンクションはファイルシステム(NTFS)の機能、だったハズ。なのでジャンクションは FAT 等でフォーマットされたディスクでは使えない。 Unity Package Manager 対応の利点 エディター拡張を Unity Package Manager(以下UPM)に対応させる利点は、 UPM の UI を使って気軽に追加・削除ができる。 関連ファイルを Assets/ にコピーしたり、シンボリックリンクを作ったりしなくても良くなるので、ゲームそのものには不要なファイルが Assets/ 以下から一掃できる。 Packages/ 以下のファイルはコピーではなく参照なので、色々なプロジェクトに複製が散らばっているような事態を防げる。 といった所。 今時点では UPM の UI から独自パッケージの検索・バージョン管理等は出来ず、配布はかろうじて、という状態。検索が出来ないのが残念。 UPM に対応させるかどうか で、今時点で UPM 運用に耐えるのは、以下のような Unity の基本機能にのみ依存した、単純・単機能なエディター拡張ぐらいかと。 【Unity】 キャラクターポーズエディター - Sator Imaging - BOOTH Unity 標準ではない機能から呼び出されず、呼び出すこともしない物すね。 Assembly Definition(Assembly-CSharp.dll)の問題 UPM への対応では Assembly Definition(.asmdef)の使用は不可避なので、Unity 標準機能ではない機能に向けて作成したエディター拡張は UPM への対応が難しい。 UPM については元々 VRM 用のエディター拡張を対応させてみよう、と調べてたんですが、 VRM の .asmdef を追加でダウンロードして導入する。 VRM.Samples がある場合はエラーが出るので、VRM.Samples の .asmdef も導入する。 が、パッケージ受け入れ側のプロジェクトで必要に。 VRM 書き出しの為だけのプロジェクトであれば VRM 関連の .asmdef を導入するだけでおっけだが、VRM を使ったアプリを作るプロジェクトでも .asmdef を導入した場合、結果的にプロジェクトの全ての機能に .asmdef を用意する必要が出てくる。 .asmdef は全か無かというポリシーなので、ちょっと UPM 試してみよう、では厳しい。 ※ 下手に Assembly Definition を作ってない & Tests 関連がなければ、Assets/ のルートに一つ Assembly Definition 作ればいいだけ。(のハズ) -- Assembly Definition(.asmdef)の何が問題になるかについては、以下の記事が非常に参考になります。 エディター拡張をどうこうする程度なら熟読する必要は無いけども、ざっと目を通しておいて損は無いです。 【Unity】Assembly Definition Filesという神機能 Unity Assembly Definition 完全に理解した - Qiita 【Unity】 Assembly Definition Files を使った上でinternalにアクセスする方法 - Qiita .asmdef 対応の副産物 Assembly Definition を使う副産物で System.Reflection に頼らずに Unity のプライベートな機能にアクセスできるようにしたりも可能。 参考: 【Unity, C#】internalな型やメンバにアクセスするには、多分これが一番早いと思います - Qiita 【Unity, C#】続・privateな型やメンバにアクセスするには、多分これが一番早いと思います - Qiita InternalsVisibleTo になっている .dll 名一覧: Unity-Technologies/UnityCsReference ※ Scene Timeline が Reflection でどうにかするエディター拡張だから、この情報は福音だった。(.dll 名が微妙になるけども) その他 その他にも問題(?)があって、 UPM の UI が独自パッケージの更新や再ダウンロード、バージョン切り替えには対応していない。検索も出来ない。 パッケージをダウンロードする機能はあれど、Packages/manifest.json に URL とダウンロード済みか否かのステータス(正確には lock)も一緒に保存されている状態なので、バージョン管理ソフト経由で manifest.json を共有した場合、大丈夫?? 等々。 そもそも、UPM が流行っていない現状で 「(実は)UPM に対応した独自のパッケージが必要なんすよ」 というのはトラブルの匂いしかしないので、ビルドに必要なファイルは従来通り、Assets/ 以下で管理を行い、その存在が自明になっている方が安心ですね。 UPM 対応手順 UPM 対応パッケージの作成方法は非常に簡単。 fuqunaga さんがマニュアル未公開の部分も含め、非常に詳しく紹介してくれています。 Package Managerに自作パッケージを追加する2019年版|fuqunaga|note 【Unity】Package Managerに自作パッケージを追加する|fuqunaga|note -- 最低限の対応であれば、package.json と .asmdef のふたつのファイルをフォルダーに配置してやるだけ。 package.json を作成 まずはパッケージのルートフォルダーに package.json という名前のテキストファイルを作成。 最低限記載する必要がある情報は以下の通り。 { "name": "com.sator-imaging.pose-editor", "displayName": "Pose Editor", "version": "1.0.0", "unity": "2017.1", "description": "Editor extension to pose a character. Copyright (c) Sator Imaging, all rights reserved." } ※ ライセンス情報などを記載するべきファイルは UPM に仕様として存在するが、読んでほしい重要な情報は "description" に記載した方が良さそう。(ライセンス情報を記載したファイルが有ろうと無かろうと、docs.unity3d.com にリンクされ、当然ページは見つからない @ Unity 2018 LTS) ※ パッケージの管理名("name")は全て小文字(マニュアルにもちらっと記載アリ)そのくらい大丈夫だろうという感じだけど、vs code で注意が出ているところは直しておかないと Unity でエラーが出る。 ※ 対応する Unity のバージョン("unity")は年号でないと受け付けないので、2017.1 が最も若いバージョン。 ※ パッケージ自体のバージョン("version")はセマンティックバージョニングでないとエラーで弾かれる。 参考: Unity - Manual: Package manifest セマンティック バージョニング 2.0.0 -- package.json さえあれば、UPM からパッケージとして読み込みが可能になる。 もう一つの必要なファイル、.asmdef はパッケージとして Unity に読み込んだ後に Unity 上で作成していく。 作成したローカルパッケージの読み込み方法は、こちら。 Unity - Manual: Installing a local package Assembly Definition(.asmdef)を追加 .asmdef は Unity エディターの Project ビューから、Create > Assembly Definition で作成する事が可能。 UPM の公式のマニュアルによれば、Runtime と Editor でアセンブリは分けるような事が書いてあるが、特段分けなければいけないという訳ではない。もの凄い大作のエディター拡張でもなければ、ルートに一つ置いておけば良いと思う。 また、エディター拡張を UPM パッケージにする場合に限れば、Platforms を Editor のみに設定するよりは、Define Constraints に UNITY_EDITOR を設定しておく方が良い。 これはエディター拡張といいつつ、マニピュレーターを描画する等の関係で MonoBehaviour を継承したものが含まれることもある為。 ※ Define Constraints は Required Preprocessor Symbols とかの方が分かり易くて良いのでは…? 拘束を定義するとは…。 -- UPM パッケージとしては、ここまでやれば最低限の仕様を満たしたものに。 後は UPM パッケージのフォルダー内に各種ファイルを追加すれば、Unity のプロジェクトビューの Packages 以下に追加したファイルが読み込まれ、使用可能な状態になる。 ※ Assembly Definition でエラーが出た場合の対処方法は、@namazuchin さんの記事が非常に参考になります。 UniVRMのAssembly Definition設定方法 | 有有新聞 その他の UPM パッケージ用ファイル UPM には package.json と .asmdef 以外にも、パッケージに含めるべきファイルが以下のマニュアルに記載されているが、 README.md CHANGELOG.md LICENSE.md Documentation~ ※ 末尾にチルダがあると Unity にインポートされない 等は追加したとしても UPM の UI は期待した通りには動かないので、UPM が独自パッケージの管理に完全に対応するまで、読んでほしい情報は package.json の "description" に羅列しておくのが良さそう。 その他、UPM パッケージについての詳細は以下の公式マニュアルで確認できる。 Unity - Manual: Package layout 抜粋: UPM パッケージのファイル構成 <root> ├── package.json ├── README.md ├── CHANGELOG.md ├── LICENSE.md ├── Editor │ ├── Unity.[YourPackageName].Editor.asmdef │ └── EditorExample.cs ├── Runtime │ ├── Unity.[YourPackageName].asmdef │ └── RuntimeExample.cs ├── Tests │ ├── Editor │ │ ├── Unity.[YourPackageName].Editor.Tests.asmdef │ │ └── EditorExampleTest.cs │ └── Runtime │ ├── Unity.[YourPackageName].Tests.asmdef │ └── RuntimeExampleTest.cs └── Documentation~ └── [YourPackageName].md サンプルシーンの扱い UPM のパッケージにはどんなファイルでも追加する事が出来るが、.unity ファイルは Packages/ 以下から直接開く事が出来ない。 ただ、参照は可能なので、マルチシーンの子供としては追加が可能。アセットストアに UPM 対応として出品するときには、その旨記載しておくと良さそう。 ※ Unity 2019 だと直接 .unity ファイルを開けてしまうが、それはそれで問題がある気も…? -- 追記: @shiena さんにサンプルシーンをパッケージに追加する方法を教えて頂きました。 https://qiita.com/sator_imaging/items/469ecc69425b1927b603#comment-aa3078ffd20c89043547 サンプルシーンについて以下の手順が公式の方法のようです。 ドキュメントと同様に~で終わるフォルダにサンプルシーンやアセット類を入れる package.jsonでサンプルシーンのパスを指定する 例: https://github.com/Unity-Technologies/Graphics/blob/master/com.unity.shadergraph/package.json#L12-L18 こうするとPackage Managerにボタンが表示されてクリックすると指定したフォルダが/Assets/にコピーされます。 URP / HDRP / ShaderGraph / Visual Effect Graph / ProBuilderなどに同様のサンプルボタンがあります。 注意点としてサンプルフォルダはインポートではなくコピーなので隠しフォルダにしておかないとファイルが重複するのでスクリプトエラーになったりアセットのGUIDが更新されてしまいます。 パッケージが見つからないとき package.json を移動するなどして見つからなくなった場合、以下のエラーが出る。 ※ 「Continue」を押せば、とりあえず起動は出来る。 Windows なら UPM の UI から見つからないパッケージを消せばおっけだが、macOS だと UPM の UI が空っぽになるので、手動で Packages/manifest.json を編集する必要がある。 ※ macOS だと UPM が空っぽに。 macOS は結構不遇な扱い受けてるんですね… ライセンス認証しても UI 明るいままだし。 おわりに UPM 対応に必須な Assembly Definition はあまり流行っていないようなので、UPM の前にまずはそこから、という感じ。 今時点で UPM の為に使用できるオープンなレジストリもあるようだけれど、Unity 的にアセットストアの前にそれらに対応するのか? というのもあると思うので、ごく一部の人が UPM でなんかやってる… という状態がしばらくは続きそうな感じすね。 自前でレジストリを建てる方法もあるみたいですが、プロジェクト全体を巻き込むほどの利便性があるのか&メンテナンスのコスト、社外に協力会社がいたら? 等々を考えると… ※ 将来的に公式のレジストリが用意されたとしても、プライベート公開が出来ず全世界公開オンリーだとしたら使いどころも限定的に… 難しいですね。 -- 以上です。お疲れさまでした。

読む
ライトマップをベイクし終わってから OptiX Denoiser を適用する方法 Qiita

ライトマップをベイクし終わってから OptiX Denoiser を適用する方法

Unity 2018 以前のバージョンのライトマッパーはデノイズに対応していないので何とかしよう、というお話。 この手法はライトマップに限らず、レンダリングした画像シーケンスにも使える。 ※ 上:デノイズ後 下:デノイズ前 ライトマッパーにデノイザーが付いてる Unity 2019 以降のバージョンでも、デノイズを実行するにはもう一度ライトマップをベイクする必要があるので、デノイズの処理を分けて実行したい時にも有効(なハズ もくじ OptiX Denoiser のダウンロード Arnold 付属のデノイザー Windows 用バッチスクリプト ダウンロード 使用方法 フィルター設定の注意点 おわりに OptiX Denoiser のダウンロード 以下のリポジトリから OptiX デノイザの CLI ツールがダウンロードできる。 DeclanRussell/NvidiaAIDenoiser 上記のソフトを使用するには、対応する GeForce シリーズのグラボとドライバが(おそらく)必要なので用意しておく。 OptiX デノイザーについての詳細はこちら。 NVIDIA® OptiX™ AI-Accelerated Denoiser Arnold 付属のデノイザー Solid Angle 製 Autodesk 販売の Arnold にも、レンダリング後にデノイズする Noice というツールが付属している。 Noice を使ってノイズを除去するにはカラー以外にも結構な数のレイヤーを要求されるので、Unity のライトマップをデノイズする用途では使えないが GUI も付いていて時間軸の補完もある。覚えていて損はない。 Arnold Denoiser - Arnold for Maya User Guide - Arnold Renderer Windows 用バッチスクリプト OptiX Denoiser の CLI ツールの準備が済んだら、Unity でベイクしたライトマップに対してデノイズを適用する。 フォルダー内の画像に対して一括処理をする Windows 用バッチスクリプトと使用方法は以下の通り。 ※ Unity のライトマップに適用する想定なので、「BeforeDenoise~」というサブフォルダにオリジナルファイルを移して、元のファイルと同名でデノイズ済みの画像を保存する。 ※ Normal(-n) と Albedo(-a) の入力は無し。※ カラー画像だけでもデノイズは適用出来る。 Normal と Albedo の入力がオプションなのは、面の向きが違う → 色の変化はノイズじゃない、って判定するための追加情報だからだと思うので、ライトマップフォルダにあるアルベド・ノーマルっぽい画像を渡せばいいだけのハズ。(必要なら) ダウンロード 以下のテキストを 好きなファイル名.bat という拡張子付きの名前で保存する。 Batch Script for OptiX Denoiser CLI by @DeclanRussell @echo off ::::::: SETTING ::::::: set DENOISER_EXE=C:PathToOptiX Denoiser StandaloneDenoiser_v2.4Denoiser.exe set SRC_BACKUP_FOLDER=BeforeDenoise~ set SRC_BACKUP_PREFIX= ::::::: INPUT ::::::: if NOT EXIST "%~1" ( echo. echo No Directory Found. Drag ^& Drop Directory to Denoise. echo. timeout 10 goto :EOF ) set /p DENOISER_ARGS=Additional denoiser options [-h or any]: if "-h"=="%DENOISER_ARGS%" ( echo. "%DENOISER_EXE%" -h echo. pause goto :EOF ) set /p TARGET_EXT=Enter target file extension [png or any]: echo Target File Extension is set to: %TARGET_EXT% echo. ::::::: MAIN ::::::: call :MAIN "%~dpn1" echo. pause goto :EOF :MAIN pushd "%~dpn1" if not 0==%ERRORLEVEL% ( echo. echo Not a Directory: %~dpnx1 echo. ::timeout 10 goto :EOF ) mkdir "%SRC_BACKUP_FOLDER%" 2>nul for %%I in (*.%TARGET_EXT%) do ( echo. echo Denoising...: %%~nxI if NOT EXIST "%~dpn1%SRC_BACKUP_FOLDER%%SRC_BACKUP_PREFIX%%%~nI.%TARGET_EXT%" ( copy /-Y "%%~nI.%TARGET_EXT%" "%~dpn1%SRC_BACKUP_FOLDER%%SRC_BACKUP_PREFIX%%%~nI.%TARGET_EXT%" ) else ( echo Original File exists... copy skipped. ) "%DENOISER_EXE%" %DENOISER_ARGS% -i "%~dpn1%SRC_BACKUP_FOLDER%%SRC_BACKUP_PREFIX%%%~nI.%TARGET_EXT%" -o "%%~nI.%TARGET_EXT%" ) 使用方法 保存した .bat ファイルにフォルダーをドラッグ&ドロップすると入力待ちのウインドウが表示されるので、追加のフラグと拡張子(例:exr ※ドットは無し)を入力して実行。 ※ オプションに -h を入力すればヘルプが見られる。 フィルター設定の注意点 デノイザを使って満足な結果を得るためには、Unity のライトマッパーのフィルターをオフにしておく必要がある。 Filtering を Auto(Gaussian)に設定してベイクした以下のようなライトマップは、デノイザーで処理してもほぼ変化は期待できない。 必ず Unity のフィルターは「None」に設定してライトマップを焼きこむ必要がある。 ※ カメラで撮影した時のピンボケ部分は丁度こんな印象なので、デノイザも調整しないのだと思われる。 おわりに Denoise は Denoize って入力しがちですね。 以上です。お疲れさまでした。

読む
VRM データをもっと Unity らしく作る Qiita

VRM データをもっと Unity らしく作る

このページ書いてあるワークフローを実現するためのツールは以下のページからダウンロードできます。 【Unity】VRM 作成用ツール「VRM Tool Kit」 VRM を作っていると、なんだかどうにもうまくいかない、妙に手間がかかる、その原因は Fbx へのリンクが切れている点に集約されるのだろうなと思っています。 作り捨てのシーンを作るのではなく、もっと Unity らしく、工程の後戻りが可能・メンテナンス可能な VRM 用のシーン作りをして、気軽に開発と運用が出来るようにしたい訳です。 ※ モデルのブラッシュアップと、ラフモデルをもとにした VRM 作成(とそれ以降の工程)を同時並行で進めておきたい、という場合だってありますよね。 もくじ はじめに VRM用のコンポーネントの収集 Fbx の入れ替えが可能なシーンを作る VRM アセットの更新 ブレンドシェイプの設定 インスペクタースクリプトの更新 VRM ブレンドシェイプのエラー対策 プロジェクトの整理 書き出しテスト おまけ: Unity エディター上での簡易プレビュー おまけ2: macOS / Linux での VRM ファイルのプレビュー VRM Spring Bone の作成 プレハブにコンポーネントを追加する際の注意点 VRM Spring Bone Collider Group の作成 VRM Spring Bone の設定 その他の VRM コンポーネントを設定 各種アセットファイルの共用について 書き出した VRM の構造 Fbx ファイル上書きテスト メッシュ変更 メッシュの増減 スキンウェイト更新 UV 調整 ブレンドシェイプ追加 階層構造の変更 おわりに 各種ライセンス情報 ユニティちゃん いつき / 制服 あわせてどうぞ はじめに アバター向けのファイルフォーマットである VRM を公式サイトのチュートリアルに沿って作ると、Fbx 内のメッシュへの参照が切れた状態の Unity シーンが出来上がります。 UniVRMモデルのワークフロー 作り捨てのワークフローなので、些細な更新であっても再度 VRM を作り直す必要があり、その VRM を作るという作業が思いのほか複雑で、作成する度に思い出す・調べる必要があるかと思います。 -- 例えば単発のイベント用に専用のフェイシャルを追加しよう、となった場合。 作り捨てではない、普段通りのシーン作りをしておけば、Fbx ファイルにブレンドシェイプを追加して更新すれば Unity 上のメッシュも更新されるので、なんの苦労もありません。 メッシュの増減も追跡してくれるので、アクセサリの追加や衣装替えなども Fbx を差し替えるだけで終わります。揺れ物の設定やコリジョンも使いまわせるところは使い回し、変更部分だけを更新して VRM として書き出しをすれば良いわけです。 ※ セットアップ済みの VRM にブレンドシェイプを追加 ここでは、更新のたびに VRM オーサリングを1からやり直すのでは無く、Fbx への参照を維持したまま VRM に書き出すことができる Unity シーンの構築方法の一つをご紹介します。 使用している各ソフトウェアのバージョンは以下の通りです。 Unity 2019.2.9f1 UniVRM v0.53.0 VRM用のコンポーネントの収集 まずは Fbx モデルを Humanoid として読み込み、モデルインポーターの設定の Rig > Avatar Definition > Configure... で Jaw や Eye(目線がブレンドシェイプの場合)に間違ったボーンがアサインされていないかを確認します。 その後、モデルを VRM > Export Humanoid から .vrm ファイルとして書き出し、書き出したファイルを Unity にインポートします。 -- ここまでは公式のワークフローと同じで、目的は VRM Meta コンポーネントや Blend Shape の定義ファイルを作ることです。 ※ A ポーズのユニティちゃん Fbx を VRM として書き出したところ .vrm インポートが終わると、上図のように VRM コンポーネントを含んだプレハブが自動生成されます。 このプレハブに含まれる、VrmAvatar、AvatarDescritpion、Meta の3つのファイルは、後で使用することになるので Ctrl+D で複製し、独立したファイルとして扱えるようにしておきます。 ※ .vrm 内のアセットは Edit > Duplicate で独立したファイルとして扱えるようにしておく ※ VRM バージョン 0.53 では Prefab に内包されていますが、最新バージョンだと最初から独立したファイルとして扱えるようになっていますね。 Fbx の入れ替えが可能なシーンを作る ここからは Unity らしいシーンを構築していきながら、無用な複製ファイルを削除してプロジェクトを整理していきます。 -- まずは .vrm インポートで作られたプレハブをヒエラルキーに追加して、コンポーネントに設定されている Meta、VrmAvatar x2、AvatarDescription の参照先を、前の工程で複製したアセットファイルに差し替えます。 ※ メッシュは削除することになるので、マテリアルはひとまず置いておきます。 あわせて、VRM First Person の Renderers は気が付いたら参照が外れていてエラーの原因になるなど厄介なので、Size を 0 にして全ての参照を消しておきます。アバター利用がないなら、二度と触らなくていいと思います。 ※ デフォルトで全てのレンダラーが追加されていますが、VRM オーサリングの最後の最後に、必要なものだけを追加しましょう。忘れがちですが… アバター利用がない限りは必要にはなりませんし、ある程度は VRM 側が自動で対応してくれるようです。 ※ 各 VRM コンポーネントの参照先を更新する(Inspector 太字部分) 続いて、Hierarchy の VRM ルートノードを右クリック > Unpack Prefab して、secondary 以外を削除し、Fbx モデルデータをルートノードの子供としてヒエラルキーに追加します。 ※ モデルデータを Fbx への参照に切り替えた状態(青字部分) これでメッシュは Fbx ファイルを参照している状態になるので、究極的には Fbx モデルの GameObject(unitychan_Fbx)を入れ替えて、VRM アバターを別のメッシュ・スケルトン構造に変更することも可能になります。 VRM アセットの更新 VRM の階層構造を変更すると、VRM ルートノードにアタッチされた Animator(Avatar) のボーンへの参照が切れた状態になるので、VrmAvatar.asset ファイルは更新が必要になります。 あわせて、VRM Blend Shape Proxy で使われている Blend Shape Avatar/Clip のプレハブ参照が .vrm ファイルになっているので、Fbx ファイルに変更する必要もあります。 ※ Animator にエラーが出ているので Avatar を更新する必要がある ブレンドシェイプの設定 アセットの更新が済んだら取り急ぎ書き出して問題の有無を確認、としたいところですが、エラー対策をしておかないと VRM への書き出しが出来ないことがあるので、先にブレンドシェイプの設定をしておきます。 インスペクタースクリプトの更新 FBX-Linked VRM の場合、PreviewEditor.cs を少し弄らないと Blend Shape Clip のインスペクター下部に表示されるプレビューやフェイシャルのスライダーが機能しません。 (プレビューと設定が出来ないだけで、設定済みのデータを扱うだけなら問題はない) 編集機能を使用可能にするためには、以下から更新されたスクリプトをダウンロードして上書きします。 ダウンロード(UniVRM v0.53 向け) 保存先: Assets > VRM > UniVRM > Editor > BlendShape > PreviewEditor.cs UniVRM v0.53 以外を使用していて上記のファイルをそのまま使うことに抵抗がある場合は、以下の変更内容を参考にスクリプトを更新します。 ※ 文字列操作を元にプレハブを取得する前に、コンポーネントの参照を辿って取得を試みるようにしています。 Add non-string based method to search prefab · SatorImaging/UniVRM@b76ef91 VRM > UniVRM > Editor > BlendShape > PreviewEditor.cs の97行目あたりに、 var prefab = AssetDatabase.LoadAssetAtPath<GameObject>(assetPath); // ↓ ↓ ↓ 追加 ↓ ↓ ↓ if(prefab == null && 0 < (target as BlendShapeAvatar).Clips.Count) { prefab = (target as BlendShapeAvatar).Clips[0].Prefab; } // ↑ ↑ ↑ 追加 ↑ ↑ ↑ if (prefab == null) { var parent = UniGLTF.UnityPath.FromUnityPath(assetPath).Parent; var prefabPath = parent.Parent.Child(parent.FileNameWithoutExtension + ".prefab"); prefab = UnityEditor.AssetDatabase.LoadAssetAtPath<GameObject>(prefabPath.Value); } return prefab; を追加します。 VRM ブレンドシェイプのエラー対策 VRM エクスポート時のエラー対策の為、Neutral などのウェイト設定が必要のない表情、将来的に使うかもしれないが今は設定しない表情にも、何かしらのウェイトを 0 で追加しておきます。 ※ Neutral は全てのウェイトを 0 として登録する…? プロジェクトの整理 ここまでくると、.vrm エクスポート・インポートで作成された無用なファイル群を削除できるようになります。 VRM コンポーネント収集のためだけの仮 .vrm ファイル、加えて ***.Meshes と ***.Textures フォルダも必要のない複製ファイルなので削除しておきます。 マテリアルが VRM とそれ以外の用途で共通であれば、***.Materials も無用なので削除してしまいましょう。 ※ 無用な複製がなくなった状態 書き出しテスト ファイルの整理が済んだら一度 VRM として書き出して、T ポーズや BVH のテストアニメーションが適切に再生されるかテストをしておきます。 ※ ここで上手くいかない場合、VRM > UniVRM-*** > Freeze T-Pose を実行してエラー無しでキャラクターが T ポーズになるかどうかを確認し、エラーが出る場合は解消します。 -- なお、自身で T ポーズを付けるワークフローにも対応しているので、その場合は Force T-Pose をオンにせず、Pose Freeze のみオンにして書き出します。 ※ エクスポート時は Force T-Pose(必要な場合)と Pose Freeze をオンにする 書き出しに成功すれば、通常のワークフローで作成した VRM と同様にビューアーで表示することが出来ます。 ※ T ポーズで腕が水平になっていれば問題ない おまけ: Unity エディター上での簡易プレビュー 上記の画像は VRM.Samples の SimpleViewer.unity をエディター上で実行して VRM ファイルを確認しているところですが、SimpleViewer.unity はビルドターゲットが非 Windows 環境になっているプロジェクトでの実行時に VRM ファイルを選択する事が出来ません。 ※ Windows で Unity エディターを実行していても、ビルドターゲットがスマホになっている場合は VRM ファイルの選択ダイアログが表示されません。 以下を参考にスクリプトを更新すると、ビルドターゲットがスマホだったり macOS だったりした場合でも任意の VRM ファイルを選択してプレビューできるようになります。 Adding support for editor preview on non-windows platforms by sator-imaging · Pull Request #379 · vrm-c/UniVRM FileDialogForWindows.FileDialog がある部分に #elif UNITY_EDITOR... を追加。 #if UNITY_STANDALONE_WIN var path = FileDialogForWindows.FileDialog("open VRM", "vrm", "glb", "bvh"); // ↓ ↓ ↓ 追加 ↓ ↓ ↓ #elif UNITY_EDITOR var path = UnityEditor.EditorUtility.OpenFilePanel("Load VRM", "", "vrm"); // ↑ ↑ ↑ 追加 ↑ ↑ ↑ #else var path = Application.dataPath + "/default.vrm"; #endif おまけ2: macOS / Linux での VRM ファイルのプレビュー Windows 版のみ提供されている公式の VRM ビューアーは、表情の確認ができるなど UniVRM / VRM.Samples の SimpleViewer.unity よりも高機能なので、最終チェックには必須のアプリです。 macOS でも動作するようにアップデートしたアプリは以下からダウンロード出来ます。 VRM ビューアー for macOS VRM Spring Bone の作成 VRM 書き出しテストでボディーに問題が無ければ Spring Bone を追加して揺れものの設定をしてきます。 プレハブにコンポーネントを追加する際の注意点 ここからプレハブに対してコンポーネントを追加していくことになりますが、プレハブ由来の GameObject に対して直接コンポーネントを追加する、ということは控えます。 ※ これは VRM データ作成に限らず、ですね。 プレハブ由来の GameObject に対して直接コンポーネントを追加すると、プレハブ更新でその GameObject がなくなった時にコンポーネントが消失してしまいます。 直接付与するのではなく、GameObject を追加してそこにコンポーネントを付与するようにしておけば、更新で GameObject がなくなったとしてもルートに吐き出されて残るので、それを使ってどうにかすることができます。 ※ Fbx のルートもプレハブ由来ですが、ほぼ確実に存在するのでコンポーネントを付与しても大丈夫です。 (ルートを作らないオプションもありますが、使っている人はいないでしょう。。。?) ※ 階層構造の変化については、後半にある Fbx 上書きテストで実際の挙動が確認できます。 GameObject が増えると処理負荷は多少は上がることになりますが、コリジョンしか持ってない GameObject のコンポーネントを親 GameObject に移植する、という機能を用意すれば良いだけの話なので、使いまわし易さ、データ構造を説明するドキュメントを用意するまでもない分かり易さを優先します。 -- 揺れ物の設定は VRM エクスポーターが secondary ノードに纏めてくれるので、VRM 作成用シーンでは自分の扱いやすい状態で管理しても問題ありません。 ※ secondary ノード自体、VRM 作成用シーンに残す必要はないようです。 ひとつの GameObject に同一コンポーネントを複数追加した状態だと、特定の VRM Spring Bone に対して Root Bone や Collider Group をスクリプトからアサイン、という事も難しくなるので、余程の事情が無い限りは Spring Bone コンポーネントひとつにつき GameObject をひとつ作って作業します。 ※ Spring Bone 毎に GameObject を分けておいた方が管理・再利用がしやすい VRM Spring Bone Collider Group の作成 続いてコライダーの追加もしていきます。 Unity シーンの構造的にはプレハブの階層に Collider を追加した状態になっていますが、特に問題なく VRM への書き出しが可能です。※ 上図ヒエラルキーウインドウ参照 ※ コライダーを生成している様子 ※ Spring Bone を設定した VRM ファイルをプレビュー表示 VRM Spring Bone の設定 コライダーの生成が終わったら、VRM Spring Bone の設定も済ませます。 その他の VRM コンポーネントを設定 揺れものの設定が済んだら、その他の VRM コンポーネントの設定を行います。 VRM Look At Blend Shape Applier は忘れがちなので特に注意します。 VRM ルートノードにアサインされているべきコンポーネント一覧 VRM Meta VRM Humanoid Description Animator VRM Blend Shape Proxy VRM First Person VRM Look At Head VRM Look At Bone Applyer または VRM Look At Blend Shape Applyer 各コンポーネントの詳細は、以下の公式サイトで確認できます。 UniVRMのコンポーネント 各種アセットファイルの共用について VRM Meta のアセットファイルは大した情報量ではないので、共用でも書き出しの度に確認・編集でも問題はなさそうです。 Blend Shape の設定ファイル群も同様に共用可能ですが、無用なトラブルを避ける為にはキャラクターそれぞれでユニークなものを使った方が良いでしょう。ファイル自体を複製しても参照先は複製元のファイルのままなので、ちょっと準備が面倒ではあります…。 書き出した VRM の構造 VRM コンポーネントの設定が済んだら、使用・配布が可能な最終 .vrm を書き出せる状態になっています。 書き出した最終 .vrm ファイルを Unity に読み戻すと、キャラクターは T ポーズになり Spring Bone コンポーネントはすべて secondary ノードに集約され、元々コンポーネントを持っていた SpringBone *** も残った状態になっています。 ※ 書き出した FBX-Linked な .vrm を Unity に読み込んだ状態 通常のワークフローで作成した VRM と同様の .vrm を作成することが出来ました。 Fbx ファイル上書きテスト 最後に、いくつかのシチュエーションを想定した .fbx 差し替えテストをご紹介します。 メッシュ変更 後ろ髪の毛先はエクスポートミスですが、再エクスポートすれば良いだけなので気楽なものです。 ※ 髪型チェンジ メッシュの増減 肩に SD キャラを乗せました。 ※ 肩パーツ追加 スキンウェイト更新 SD キャラたちは肩のボーンの影響を受けるだけでいいところ、腕のボーンの影響も受ける状態でエクスポートしてしまいました。 ※ UV 調整 微調整しない、なんてことはないですよね。 ※ カットバイ対応・イベント毎の対応も気軽に ブレンドシェイプ追加 Maya から書き出すと blendShape1. ってノード名が接頭辞として付くようになっちゃって困っているんですが、どうしたらいいんでしょうか。 ※ ユニティちゃん洗顔後 階層構造の変更 Prefab 更新でペアレントが見つからなくなった GameObject は、Fbx ルートの直下に吐き出されます。 ※ その後元の階層構造に戻したとしても、吐き出された GameObject は元には戻りません。 これは Unity でのアセット作成全般に言えることですが、GameObject を新規で追加してさえいれば後からどうにでもなるので、アセット由来で生成された GameObject に直接コンポーネントを追加するような事は、余程のことが無い限りは控えましょう。 (一度パブリッシュしたらタイポ修正を含めて変更はしないで欲しいですよね) ※ 元々の親 GameObject が見つからないオブジェクトがルートに吐き出される様子 おわりに ここで紹介した手法は FBX の参照維持のため、意地になって結構むりくりやっている部分もあります。 とはいえ VRM 公式のエディタースクリプトへの対応が主ではあるので、書き出した VRM が変なことになっているという事はないと思います。 FBX-Linked VRM が仮に何か問題になるとしたら、 VRM ルートノードに付いてる Animator の Avatar まわり 子供の Fbx ルートにも Animator を付けっぱなしで作業しているので、うまく行かなかったらエクスポート時に削除して書き出す、を試してみる Blend Shape Clip の Relative Path まわり Blend Shape Clip のインスペクタープレビューの仕様上、メッシュの相対パスの起点を Fbx ルート <=> VRM ルート間で切り替えている エクスポート時は VRM ルートからの相対パスにする必要があり、その状態だと Inspector ではプレビュー・パラメーターが適切に表示されない(データ上は問題ない) エディタースクリプトなのに表示のついでにデータ弄っちゃう系が v0.53 以降で追加されると、ノードを選択して Inspector が描画されるだけでデータが壊れる可能性はあるかも Debug モードで Render Queue を弄って Normal モードの Inspector で表示すると勝手に元に戻るあれ のあたりが怪しいです。 ともあれ、VRM を作っていて困ったときは FBX-Linked なこの手法に限らず、VRM > VRM-*** > Freeze T-Pose を実行してエラーが出ないかを確認し、あれば対処というイテレーションが解決の近道だと思います。 -- 以上です。お疲れ様でした。 各種ライセンス情報 この記事内で使用、改変しているモデルデータのライセンス情報です。 ユニティちゃん この記事中で使用されているユニティちゃんは、ユニティちゃんライセンス条項の元に提供されています。 DATA DOWNLOAD-利用規約 « UNITY-CHAN! OFFICIAL WEBSITE いつき / 制服 花咲うらら氏の公開されているモデルデータです。詳細は以下のリンク先で確認できます。 いつき / 制服 - VRoid Hub あわせてどうぞ #VTuber開発まとめ #Unity開発まとめ

読む
Unity のシェーダー開発方法のまとめと備忘録・頂点アニメーションテクスチャ(VAT)シェーダー Qiita

Unity のシェーダー開発方法のまとめと備忘録・頂点アニメーションテクスチャ(VAT)シェーダー

Unity のみで完結できる頂点アニメーションテクスチャー(VAT・Vertex Animation Texture)のエクスポーターとシェーダーを作りました。 Vertex Animation Texture shader, #unity3d.202 frames@30fps animation, 4,472 tris each mesh.--GeForce GTX 1080 on Unity Editor90fps=1,500mesh60fps=3,000mesh#madewithunity #unity pic.twitter.com/ctxG7GT4tg— サトー (@sator_imaging) December 24, 2019 -- こちらの記事はとりあえず動くシェーダーは作れる、だけど… という内容です。 拾い物やネットからのコピペ、アセットストア経由など、プロジェクトは雑多なアセットのチャンプルーが常で、たまーにシェーダーを作ったり、という方や、プロジェクトの規模に合うであろう内容になっています。 もくじ はじめに 目標 対応させたい Unity 標準機能の一覧 Universal Render Pipeline(旧LWRP)について Shader Graph について Unity の標準機能への対応方法 Global Illumination への対応 Light Probe(球面調和)の影響を受けるようにする Reflection Probe に映るようにする Reflection Probe や天球・スカイボックスが映り込むようにする ライトマップのベイクに対応する Unity のライトマップをシェーダーに適用する 影を受ける Unity のライティング情報を取得する 影を落とす 頂点シェーダー等で変形させている場合の注意点 FallBack 法 UnityStandardShadow.cginc 法 全自前実装法 ステレオレンダリングへの対応 インスタンス及び関連技術への対応(GPU Instancing) Material Property Block への対応 Single pass instanced モードのステレオレンダリング フォグへの対応 フォグ対応の注意点 プラットフォームごとの違いを吸収する方法 ShaderLab の構造・文法の備忘録 自作シェーダー作成の際の注意点 シェーダーのテンプレート 構造体やシェーダープログラムのおススメと注意点 Properties プロパティーの命名に迷った場合 マテリアルインスペクターのふるまいを調整 CustomEditor を指定して完全にカスタマイズする Cull や ZTest 等に Inspector で設定したプロパティーの値を使う Enum がある場合はプロパティーに設定しておく プロパティーにシェーダーからアクセスする テクスチャ解像度や時間などの特殊なプロパティー SubShader と Pass アルファチャンネルを使用したカットアウト(Cutout)処理 パフォーマンスに応じてシェーダーを切り替える LOD 処理 SubShader の Tags SubShader の Pass CGPROGRAM ~ ENDCG CGINCLUDE ~ ENDCG シェーダーモデルのターゲットレベル multi_compile vs. shader_feature if/else の使用は避ける TEXCOORD が不足した場合 頂点シェーダーの注意点 フラグメントシェーダーの注意点 おわりに おまけ はじめに Project ウインドウから Unlit Shader を作り、それをベースに自作シェーダーを作ると、影を落とさない&受けない、Global Illumination の各種プローブ、ライトマップの適用やベイクにも反応しないシェーダーが出来上がります。 加えて、Unity のバージョンアップによって古くなった情報がいまでも検索に引っかかる為、専業ではない人間ではなかなか新しい情報に巡り合えず、開発に無駄な時間がかかってしまうのが Unity シェーダー開発のあるあるかと思います。 この記事は、VAT シェーダーを開発する過程で調べた、Unity の各標準機能に対応したシェーダーを開発する為に必要な情報と ShaderLab の備忘録をまとめたものです。 こんな方におススメ: バージョンは Unity 2018 LTS なんだかんだで Built-in Render Pipeline (Legacy) を使っている グラス型AR・VR やモバイル等で Forward Rendering を使っている 目標 前述の通り、Unity の標準機能に一通り対応させることです。特定のプロジェクトだけではなく汎用的に使うことができ、アセットストアへの出品も可能なものを目指します。 対応させたい Unity 標準機能の一覧 GI やライトマップ、各種プローブへの対応。 天球やスカイボックス、Reflection Probe が反射に映り込む。 Light Probe がある環境で影響を受ける。 ライトマップが適用される。 ライトマップのベイク時に周辺環境に影響を与える。 Reflection Probe のレンダリングに映る。 影を落とす&受ける。 GPU Instancing と関連技術に対応している。 グラス型AR・VR でのステレオレンダリングで、Single Pass が使える。 Single Pass(Instanced) にも対応している。 ※ 全てのアセットに目が行き届く開発環境でないと使ったことが無い人が多いのでは・・・? Lighting 設定のフォグの影響を受ける。 Universal Render Pipeline(旧LWRP)について 先日ベータ版から抜けて正式リリースとなった Universal Render Pipeline。 ここではシェーダーの基本的なところは抑えていますが、Built-in 向けのシェーダーを URP に対応させるにはどうしたらいいか、については扱っていません。 ステレオレンダリング&フォワードレンダリングやモバイルに関わることが多いという事もありますが、冒頭で述べたように、自身の管理外のアセットの対応状況に左右されることなどを考えると、中小規模のプロジェクトではまだ時期尚早かなと思っています。 以下の表を見て、うっ、となったというのもあります。 Feature comparison table | Universal RP | 7.1.7 Shader Graph について Maya のような DCC ツールもノードベースで見栄えをいじりますが、最後の最後で結局、欲しい情報を取れるノードが無くて望むものが作り切れない、なんて事も多いので、コーディングせずに Unity Shader Graph で、、、も扱っていません。 個人的には、ノードベースでは作りきれない、となった時に Shader Graph から ShaderLab のコードを書き出して自分で実装する、という選択もあると思うので、Unity でのシェーダー開発の方法は理解しておいて損はないと思います。 Unity の標準機能への対応方法 まずは Unity 標準機能への対応方法の紹介です。 ShaderLab の基本的なところは、備忘録として次の章にまとめています。 Global Illumination への対応 Light Probe(球面調和)の影響を受けるようにする ライトプローブに対応するには、UnityCG.cginc の ShadeSH9 を使用します。このマクロは Pass のタグ設定で LightMode を ForwardBase に設定した状態で使用する必要があります。 #include "UnityCG.cginc" ... Tags { "LightMode" = "ForwardBase" } 球面調和は可能な限り頂点シェーダーで処理する 球面調和(Spherical Harmonics)はけして軽い処理ではないので、頂点シェーダーで十分な結果を得られる場合はピクセルシェーダーで処理をしない方が良いです。 以下のサンプル画像を見てわかるように、Light Probe と Lighting > Environment Lighting の影響を計算するだけなので、ノーマルマッピング等を行わない限りにおいてはクッキリはっきりとした変化のある絵は出ないからです。 ※ ロボットの下手側の肩のライティング結果に、わずかながら違いが見受けられます。 例(頂点シェーダー): o.color.rgb *= ShadeSH9( half4(UnityObjectToWorldNormal(v.normal), 1) ); ※ 頂点シェーダーで設定したカラーはフラグメントシェーダーに渡される際に、GPU で頂点間を線形補完された状態になります。 例(ピクセルシェーダー): col.rgb *= ShadeSH9( half4(UnityObjectToWorldNormal(i.normal), 1) ); Reflection Probe に映るようにする カスタムシェーダー側で何もしなくても Reflection Probe に映り込み、頂点シェーダーの変形結果も反映されます。もしも映らない場合は Reflection Probe Static の設定を忘れていないかを確認します。 ※ VAT Kit ではシェーダー内で _Time を使用してアニメーションさせていますが、ベイクする度に映り込む位置が1フレームずつ進んでしまいました。Unity & ShaderLab ではベイク用のパスなどは用意されていないので、必要に応じて対策を施す必要があります。 Reflection Probe や天球・スカイボックスが映り込むようにする Reflection Probe 及び Lighting > Environment で設定された天球・スカイボックスの情報の取得方法は、こちらの公式ドキュメントに載っています。 Unity - Manual: Vertex and fragment shader examples ただし、上記の公式ドキュメントの実装だと、なぜか複数の Reflection Probe を跨いだ際のブレンドには対応していません。 Reflection Probe のブレンドに対応する ブレンディングに対応するにはフラグメントシェーダーで追加の処理が必要になります。 ※ Reflection Probe のブレンドに対応した例 リフレクションの計算には、ワールド空間の法線と視線ベクトルが必要になります。 ノーマルマッピング等を行わない場合は、頂点シェーダーでリフレクションの法線を事前に計算しておき、映り込みのサンプリングのみフラグメントシェーダーで行います。 ※ 視線ベクトルの計算に必要な頂点のワールド座標は、頂点シェーダーで計算した場合も GPU で線形補完されるので精度は変わらない(ハズ)なので、ノーマルマッピングをする時は頂点の座標のみ頂点シェーダーで計算しておくのも良いかもしれません。 Reflection Probe 対応のサンプルコード 各手法を切り替えられるようにコメントとして残したサンプルです。 struct v2f { ... half3 worldRefl : TEXCOORD2; half3 worldPos : TEXCOORD3; // not required if worldRefl is calculated in vertex shader ... }; ※ worldRefl を頂点シェーダーで計算した場合は、worldPos をフラグメントシェーダーに渡す必要はなくなります。v2f から消して、頂点シェーダーの o.worldPos を half3 worldPos に変更します。 頂点シェーダー v2f vert(appdata v) { ... o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz; float3 worldViewDir = normalize( UnityWorldSpaceViewDir(o.worldPos) ); float3 worldNormal = UnityObjectToWorldNormal(v.normal); o.worldRefl = reflect(-worldViewDir, worldNormal); ... } フラグメントシェーダー ※ 映り込みのボケはミップマップの LOD レベルを調整することで実現します。 fixed4 frag(v2f i) : SV_Target { ... half3 worldRefl; ///////half3 worldPos; half mipmap_lod_level = 0; // blurry reflection ////////mipmap_lod_level = roughness * UNITY_SPECCUBE_LOD_STEPS; // worldspace data from vertex shader worldRefl = i.worldRefl; ///////worldPos = i.worldPos; // calculate worlspace data in fragment shader ////////worldPos = mul(unity_ObjectToWorld, i.pos).xyz; ////////worldRefl = reflect( -normalize(UnityWorldSpaceViewDir(worldPos)), UnityObjectToWorldNormal(i.normal) ); // reflection probe blending half4 skyData0 = UNITY_SAMPLE_TEXCUBE_LOD(unity_SpecCube0, worldRefl, mipmap_lod_level); half4 skyData1 = UNITY_SAMPLE_TEXCUBE_SAMPLER_LOD(unity_SpecCube1, unity_SpecCube0, worldRefl, mipmap_lod_level); half3 reflColor0 = DecodeHDR(skyData0, unity_SpecCube0_HDR); half3 reflColor1 = DecodeHDR(skyData1, unity_SpecCube1_HDR); // resulting reflection color half3 reflColor = lerp(reflColor1, reflColor0, unity_SpecCube0_BoxMin.w); ... } リフレクションプローブのブレンディングはこちらを参考にさせて頂きました。 (Unity 2018 LTS よりバージョンが古い Unity についての記事です) 【Unity】【シェーダ】Reflection Probeの影響を受けるシェーダを書く ライトマップのベイクに対応する ライトマップのベイク時に周辺環境に影響を与えるようにする方法は、以下の通りです。 自作の自己発光マテリアルを使ってベイクした結果 まずは結果です。中央の黒い球体が、ライトマップのベイクの際に使われる Meta パスのみを実装したカスタムシェーダーで、周辺環境に対して光を放って影響を与えています。 自己発光させて周囲を照らしたい時の注意点 上図のように自己発光しているマテリアルで周囲を照らしたい場合、シェーダーの実装だけでは実現できません。 以下の通り Material.globalIlluminationFlags を適切に設定しておく必要があります。 ※ これは自己発光(Emission)が周辺環境に影響を与える時のみに必要になる設定で、Albedo や Specular のカラーブリーディングは設定をしていなくても反映されます。 (これは分かりませんよ) Yes. The thing is the color used by the baked lighting doesn't come from the usual vertex/fragment passes people are familiar with. Those come from a special "Meta" pass. See the Illumin-VertexLit.shader from the built in shader source for a basic example. However for realtime emission there's one more step that needs to be done. There's a flag that needs to be set on the material from script. Usually this is done with a custom material editor. It can be manually set via material.globalIlluminationFlags or automatically set with MaterialEditor.FixupEmissiveFlag(). https://forum.unity.com/threads/emmisive.492609/#post-3206559 ビルトインのスタンダードシェーダーの CustomEditor として使われている StandardShaderGUI.cs では、以下のような処理をしています。 // A material's GI flag internally keeps track of whether emission is enabled at all, it's enabled but has no effect // or is enabled and may be modified at runtime. This state depends on the values of the current flag and emissive color. // The fixup routine makes sure that the material is in the correct state if/when changes are made to the mode or color. MaterialEditor.FixupEmissiveFlag(material); bool shouldEmissionBeEnabled = (material.globalIlluminationFlags & MaterialGlobalIlluminationFlags.EmissiveIsBlack) == 0; SetKeyword(material, "_EMISSION", shouldEmissionBeEnabled); MaterialGlobalIlluminationFlags を設定するスクリプト エディターから設定する場合は、メッシュに対して以下のようなコンポーネントを適用します。設定が済めばアセット自体が更新されるので、剥がしても大丈夫(なハズ)です。 using UnityEngine; public class GlobalIlluminationFlags : MonoBehaviour { public MaterialGlobalIlluminationFlags flag = MaterialGlobalIlluminationFlags.AnyEmissive; void OnValidate() { var rend = GetComponent<Renderer>(); if (rend && rend.sharedMaterial) { rend.sharedMaterial.globalIlluminationFlags = flag; } } } ライトマップのベイク時に使用する "LightMode"="Meta" パスの実装 GI のベイクの際に使われる Meta パスは、UnityMetaPass.cginc で定義されている構造体に必要な値を設定して返してあげれば良いだけです。 struct UnityMetaInput { half3 Albedo; half3 Emission; half3 SpecularColor; }; Meta パス実装のサンプルコード Unity built-in Shader の Standard Shader の Meta パスをベースに、フラグメントシェーダーのみカスタマイズして実装するのが最も簡単な手法です。 ※ 強い光を設定する事が多い自己発光カラーのプロパティーは、[HDR] を付けておくと Inspector 上でスーパーホワイトの設定が出来るようになるので便利です。 [HDR] _EmissionColor("Emission Color", Color) = (0, 0, 0, 1) サンプルの Meta パスの実装は以下の通りです。 ※ #pragma fragment frag_meta_custom 等に名前を書き換えて自作シェーダーを実装します。 ※ UnityMetaInput は UnityMetaFragment を通して返します。 ※ _EmissionColor など、UnityStandardInput.cginc で定義済みのプロパティー変数の定義は不要です。(再定義するなとエラーが出ます) Pass { Name "META" Tags { "LightMode" = "Meta" } Cull Off CGPROGRAM #include "UnityStandardMeta.cginc" #pragma vertex vert_meta // change name and implement if customizing vertex shader #pragma fragment frag_meta_custom // changed to customized fragment shader name #pragma shader_feature _EMISSION #pragma shader_feature _METALLICGLOSSMAP #pragma shader_feature _ _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A #pragma shader_feature ___ _DETAIL_MULX2 #pragma shader_feature EDITOR_VISUALIZATION // pre-defined in UnityStandardInput.cginc from UnityStandardMeta.cginc //half _Glossiness; //half4 _Color; //half4 _EmissionColor; half3 _SpecularColor; // customized fragment shader float4 frag_meta_custom(v2f_meta i) : SV_Target { UnityMetaInput o; UNITY_INITIALIZE_OUTPUT(UnityMetaInput, o); // required but no effect for EnergyConservationBetweenDiffuseAndSpecular half oneMinusReflectivity = 0; // do it half smoothness = _Glossiness; half3 albedo = _Color; half3 specularColor = _SpecularColor; half3 emissionColor = _EmissionColor; // assign result to output albedo = EnergyConservationBetweenDiffuseAndSpecular(albedo, specularColor, oneMinusReflectivity); #if defined(EDITOR_VISUALIZATION) o.Albedo = albedo; #else o.Albedo = UnityLightmappingAlbedo(albedo, specularColor, smoothness); #endif o.SpecularColor = specularColor; o.Emission = emissionColor; return UnityMetaFragment(o); } ENDCG } Diffuse と Specular と Smoothness の関係性 Unity の Standard シェーダーの Meta パスでは、Diffuse と Specular と Smoothness に基づいて重み付けを行う Unity のマクロが2つ使用されていて、その状態でベイクを行うと以下のような結果になります。 (当然ですが、カラーブリーディングに合わせて自身の見た目を実装する必要があります) ※ 表面が滑らかだと Diffuse(赤)のみが拡散し、ザラついていると Specular(青)が混ざる。 表面が滑らかだとスペキュラー成分が拡散しないのではなく、本来であれば指向性の強い反射が起こるハズですが、2018 LTS ではライトマッパーがその現象に対応していません。(Enlighten、Progressive CPU / GPU ともに) ※ 表面が滑らかな曲面を使って、指向性の強い反射光を集めたレンダリング例 Standard シェーダーの Meta パスで使用されているマクロ関数 Standard シェーダーの Meta パスで使用されている Unity ビルトインのマクロ関数は、エネルギー保存の法則にしたがって Albedo の調整を行うものと、ライトマッパーに合わせてさらに Albedo の調整を行うものの2つで、以下の通り定義されています。 ※ SpecularStrength は specColor の .rgb の3つのうち最大の値を返します。 ※ UnityStandardCore.cginc の UNITY_SETUP_BRDF_INPUT = SpecularSetup 内で一度 diffuse の調整を行い、焼きこむ際には次に示す UnityLightmappingAlbedo マクロ関数でさらにライトマッパー向けの調整を行っているようです。 // Diffuse/Spec Energy conservation inline half3 EnergyConservationBetweenDiffuseAndSpecular ( half3 albedo, half3 specColor, out half oneMinusReflectivity ) { oneMinusReflectivity = 1 - SpecularStrength(specColor); #if !UNITY_CONSERVE_ENERGY return albedo; #elif UNITY_CONSERVE_ENERGY_MONOCHROME return albedo * oneMinusReflectivity; #else return albedo * (half3(1, 1, 1) - specColor); #endif } ※ Unity はエディタープレビュー時には上記の調整のみを行った Albedo を表示し、焼きこむ時のみ以下のマクロ関数で smoothness に基づいたライトマッパー向けの調整を加え、その結果を Albedo に設定しているようです。 ※ プレビューか否かの処理はマクロ内ではなく Meta パス内に直接記述されているので、将来のアップデートに伴ってコード修正が必要になりそうな気がしています。 half3 UnityLightmappingAlbedo (half3 diffuse, half3 specular, half smoothness) { half roughness = SmoothnessToRoughness(smoothness); half3 res = diffuse; res += specular * roughness * 0.5; return res; } 公式ドキュメントの Global Illumination Meta パスの実装例 公式ドキュメントにも、自己発光に対応していない実装サンプルがあります。 Unity - Manual: Material properties and the GI system Unity のライトマップをシェーダーに適用する ※ Unity でベイクしたライトマップをカスタムシェーダーに適用した状態。 Unity がベイクしたライトマップをシェーダーに適用する方法は、以下の通りです。 ※ モデルインポーターの「Generate Lightmap UVs」の設定に関わらず、TEXCOORD1 にはライトマップ用の UV が入っています。 struct appdata { ... float2 texcoord1 : TEXCOORD1; ... }; struct v2f { ... float2 texcoord1 : TEXCOORD1; ... }; ※ Unity のライトマップは複数のオブジェクトを一つのテクスチャアトラスにまとめた状態になっているので、ライトマップ内の指定の位置に UV をスケール&移動します。 v2f vert(appdata v) { ... o.texcoord1 = v.texcoord1.xy * unity_LightmapST.xy + unity_LightmapST.zw; ... } fixed4 frag(v2f i) : SV_Target { ... col.rgb *= DecodeLightmap( tex2D(unity_Lightmap, i.texcoord1.xy) ); ... } こちらの公式ドキュメントにも実装例があります。 Unity - Manual: Rendering Optimizations 影を受ける 影の情報をシェーダーで得る方法は、こちらの記事に非常に分かりやすくまとまっています。 Unityでマリオオデッセイの雲海を再現してみた #シャドウがかかっている - Qiita Unity のライティング情報を取得する 影を受ける以外にも、LIGHT_ATTENUATION マクロで Unity が提供するライティングの情報も取得できます。こちらの記事が非常に参考になります。 [Unity] AssetStoreのファーシェーダをupdateしたので分かったことを書いてみる #unityで準備されている機能でシャドウを実装する - Qiita 影を落とす カスタムシェーダーを割り当てたオブジェクトの影を落とす一番手っ取り早い方法は、後述の FallBack 法です。 頂点シェーダー等で変形させている場合の注意点 頂点シェーダーやジオメトリシェーダーによる変形がある場合は、変形処理を ShadowCaster パスでも同様に適用する必要があります。 その為、以下の FallBack 法や UnityStandardShadow.cginc 法は使用できません。 ※ 変形した場所ではなく、オレンジで囲われた本来の位置を元に影が落ちてしまっている。 ShadowCaster パスでも同様の変形を行う必要があるので、VATKit_vertShader.cginc 等のように頂点シェーダーを外部ファイル化して #include する等、重複した処理を書かずに済む方法も開発の早い段階から検討しておかないと、後々の切り分け作業で大変なことになりそうです。 参考: Vertex and Fragment shader with vertex displacement and shadows - Unity Answers FallBack 法 上記のシェーダーテンプレートにも入っていますが、 FallBack "Mobile/VertexLit" として処理を任せてしまうのが、将来的な保守も不要で一番です。 ※ ShadowCaster パスが存在するとフォールバックが起きないので、パスが存在しない状態にしておきます。 UnityStandardShadow.cginc 法 こちらは Standard Shader の ShadowCaster パスをそのまま使う方法です。 将来的なアップデートで動かなくなる可能性も無くはないので、FallBack を本来の用途以外で使うのはためらわれる、という場合以外は FallBack "Mobile/VertexLit" を使う方が良いと思います。 参考: StandardShaderを編集して、裏面も描画されるようにする オフィシャルサイトのアーカイブから、「ダウンロード(Win or Mac)」→「ビルトインシェーダー」を選択して最新のシェーダーコードをダウンロードすることもできます。 Get Unity - Download Archive - Unity 全自前実装法 頂点シェーダーで変形している場合など、ShadowCaster パスを自身で実装する方法は、こちらが非常に参考になります。 UNITYで影をつくる〜ShadowCaster ※ VertexInput を appdata に、VertexOutput を v2f にすると見慣れたものになります。 ステレオレンダリングへの対応 マルチパスのステレオレンダリング(単に複数のカメラで2回描画しているだけ)にはデフォルトで対応していますが、左右の目の画像を横に並べてレンダリングする、Single pass モードのステレオレンダリングに対応する為には、頂点シェーダー等を対応させる必要があります。 ざっくり言うとスクリーン座標など、画面が左右横並びで2倍幅になると影響を受ける処理は、Unity謹製のマクロを使おう、というお話です。 (例:mul(UNITY_MATRIX_MVP, v); ではなく UnityObjectToClipPos() を使う) Unity - Manual: Single Pass Stereo rendering (Double-Wide rendering) 加えて、Single-pass instanced(2018 LTS ではプレビュー版) モードへの対応もあります。そちらは以下に続きます。 インスタンス及び関連技術への対応(GPU Instancing) シェーダーをインスタンス対応にすると、マテリアルのインスペクターに「Enable GPU Instancing」というチェックボックスが表示されるようになります。 逆を言えば、Enable GPU Instancing が無いものはインスタンスに未対応となり、インスタンスだけではなく以下の関連技術の全てが無効であるという事になります。 まず最初に、インスタンスへの対応方法はこちらです。 Unity - Manual: GPU instancing Material Property Block への対応 シェーダーをインスタンスに対応させることで、MaterialPropertyBlock への対応も可能になります。 ただし、あくまでも似通ったマテリアルが大量に必要になる事態を防ぐための機能であって、インスタンスへの対応が必要だからと言って Batch 数や SetPass calls、Draw call が減ったりすることは無いようです。 ※ Saved by batching: 0、Batches / SetPass calls ともに 5,404 で、減っている様子はない。 VAT シェーダーでは Time Offset が MaterialPropertyBlock に対応しているので、冒頭で紹介した動画のようにメッシュとマテリアルが一対でも、それぞれのアニメーションのタイミングを変えることが可能になっています。 ※ 対応しても GPU Instancing のように Inspector の表示が変わるわけではないので、残念ながら外側からではどのプロパティーが対応しているのかは分かりません。 Material Property Block への対応方法 以下のページにある、「Adding per-instance data」セクションに対応方法の記載があります。 Unity - Manual: GPU instancing Material Property Block の使用方法 Material Property Block を使ったプロパティーの設定方法は、既存のものを取得 → 無ければ作成&セット → レンダラーへ適用の流れです。 Unity - Scripting API: Renderer.GetPropertyBlock Unity - Scripting API: MaterialPropertyBlock.SetColor Unity - Scripting API: Renderer.SetPropertyBlock Single pass instanced モードのステレオレンダリング Single pass Instanced モードへの対応方法の詳細はこちらです。 Unity - Manual: Single Pass Instanced rendering フォグへの対応 Project ウインドウから作成できる、Unlit Shader のテンプレートで既に対応がなされていますが、 #pragma multi_compile_fog を追加 struct v2f に UNITY_FOG_COORDS(1);(1 は TEXCOORD# の # 部分) vert() に UNITY_TRANSFER_FOG(o, o.vertex); frag() に UNITY_APPLY_FOG(i.fogCoord, apply_to_this_fixed4_color); で対応させることができます。こちらの Unity Answers の記事が詳しいです。 shaders : what is the use of UNITY_FOG_COORDS, UNITY_TRANSFER_FOG, UNITY_APPLY_FOG フォグ対応の注意点 フォグのマクロは LightMode が ForwardAdd に設定されている場合は、なにもしてくれません。ForwardBase もしくは LightMode 無しのパスでのみ動作します。 ForwardAdd を単純に実装して複数のライトで照らした場合は、2つ目以降のライトがフォグを無視することになるので、少しおかしな結果になった気がします(うろ覚えですが…)この辺りはフォワードライティングという手法の限界かもしれませんね。 ※ i.fogCoord の情報が ForwardAdd でも取得できるようなら、それを元にライティング側が配慮すれば対応は出来そうです。 プラットフォームごとの違いを吸収する方法 OpenGL や DirectX など、プラットフォームごとに UV 座標やデプスバッファの扱いなどに違いがあります。 何もしなくても Unity が吸収してくれる場合や、そうではない場合があります。詳細や対応方法は以下のページから確認できます。 Unity - Manual: Platform-specific rendering differences ※ 抜粋:クリップ後の座標に違いがある。 Direct3D-like: The clip space depth goes from +1.0 at the near plane to 0.0 at the far plane. This applies to Direct3D, Metal and consoles. OpenGL-like: The clip space depth goes from –1.0 at the near plane to +1.0 at the far plane. This applies to OpenGL and OpenGL ES. ※ 抜粋:デプスが黒→白ではなく、白→黒のプラットフォームがある。 Use SystemInfo.usesReversedZBuffer to find out if you are on a platform using reversed depth (Z). ※ 抜粋:UV 座標系の違いに対応する方法。 // Flip sampling of the Texture: // The main Texture // texel size will have negative Y). #if UNITY_UV_STARTS_AT_TOP if (_MainTex_TexelSize.y < 0) uv.y = 1 - uv.y; #endif v2f vert(appdata v) { ... o.uv = v.uv; // This example is rendering with upside-down flipped projection, // so flip the vertical UV coordinate too if (_ProjectionParams.x < 0) { o.uv.y = 1 - o.uv.y; } ... } UNITY_UV_STARTS_AT_TOP や _ProjectionParams については、こちらに詳細があります。 Unity - Manual: Predefined Shader preprocessor macros Unity - Manual: Built-in shader variables ShaderLab の構造・文法の備忘録 ここからは、シェーダーの中身の構造・文法についてです。 自作シェーダー作成の際の注意点 基本的にサーフェイスシェーダーは使わない方が良いと思います。ある程度まではパッと作れますが、後々制限に悩まされます。 特に、サーフェイスシェーダーの情報を扱っている人が少ないという点がネックです。 ※ 以下のようなコードが載っている場合はサーフェイスシェーダーの情報です。 #pragma surface surf Lambert void surf(Input IN, inout SurfaceOutput o) SurfaceOutputStandard uv_MainTex シェーダーのテンプレート シェーダー開発のテンプレートとして、リファレンスの URL をコメントとして記載した物を作ってみました。 Shader "Path/To/The/Shader" { // https://docs.unity3d.com/Manual/SL-Properties.html // https://docs.unity3d.com/ScriptReference/MaterialPropertyDrawer.html Properties { } // https://docs.unity3d.com/Manual/SL-SubShader.html SubShader { // https://docs.unity3d.com/Manual/SL-SubShaderTags.html Tags { "Queue" = "Geometry" "RenderType" = "Opaque" } // https://docs.unity3d.com/Manual/SL-Pass.html // Cull, ZTest, etc... CGINCLUDE #include "UnityCG.cginc" #include "Lighting.cginc" #include "AutoLight.cginc" #pragma target 3.0 ENDCG // https://docs.unity3d.com/Manual/SL-Pass.html Pass { // https://docs.unity3d.com/Manual/SL-PassTags.html Tags { } // https://docs.unity3d.com/Manual/SL-Pass.html // Cull, ZTest, etc... CGPROGRAM ENDCG } } FallBack "Mobile/VertexLit" // https://docs.unity3d.com/Manual/SL-CustomEditor.html //CustomEditor "ClassName" } 構造体やシェーダープログラムのおススメと注意点 印象ベースですが、各要素の名前は下記のものがおススメです。 特に、v2f の pos は、テンプレとして使う事も多い Unlit Shader NewUnlitShader.shader では vertex になっていますが、ライティング、影関連のマクロの影響で pos に変更しておいた方が良いです。 (TRANSFER_VERTEX_TO_FRAGMENT(o) というマクロで pos がハードコードされています) ※ struct は最後にセミコロン struct appdata { ... }; struct v2f { float4 pos : SV_POSITION; ... }; v2f vert(appdata v) { v2f o; ... return o; } fixed4 frag(v2f i) : SV_Target { ... } -- Properties Properties ブロックでは、シェーダーに必要なテクスチャやその他のプロパティーを設定します。 ※ シェーダープログラムからアクセスするには、後述の手続きが必要です。 Unity - Manual: ShaderLab: Properties 例: _MyTexture ("My texture", 2D) = "white" {} _MyNormalMap ("My normal map", 2D) = "bump" {} //Grey _MyInt ("My integer", Int) = 2 _MyFloat ("My float", Float) = 1.5 _MyRange ("My range", Range(0.0, 1.0)) = 0.5 _MyColor ("My colour", Color) = (1, 0, 0, 1) // (R, G, B, A) _MyVector ("My Vector4", Vector) = (0, 0, 0, 0) // (x, y, z, w) プロパティーの命名に迷った場合 プロパティーの命名に迷ったら、UnityStandardInput.cginc を参考にすると良いかもしれません。 UnityStandardInput.cginc - TwoTailsGames/Unity-Built-in-Shaders 抜粋: //--------------------------------------- half4 _Color; half _Cutoff; sampler2D _MainTex; float4 _MainTex_ST; sampler2D _DetailAlbedoMap; float4 _DetailAlbedoMap_ST; sampler2D _BumpMap; half _BumpScale; sampler2D _DetailMask; sampler2D _DetailNormalMap; half _DetailNormalMapScale; sampler2D _SpecGlossMap; sampler2D _MetallicGlossMap; half _Metallic; half _Glossiness; half _GlossMapScale; sampler2D _OcclusionMap; half _OcclusionStrength; sampler2D _ParallaxMap; half _Parallax; half _UVSec; half4 _EmissionColor; sampler2D _EmissionMap; //------------------------------------------------------------------------------------- マテリアルインスペクターのふるまいを調整 チェックボックスやスライダー付きの整数プロパティーなど、Unity のビルトインシェーダーのようなインスペクターを再現するには、以下のページにある Material Property Drawer アトリビュートを追加で設定する必要があります。 Unity - Scripting API: MaterialPropertyDrawer Unity - Manual: ShaderLab: Properties 「Property attributes and drawers」セクションに Material Property Drawer のページに記載のないアトリビュートがあります。 抜粋: 整数プロパティーにスライダーが欲しい場合は、[IntRange] 単に Inspector でチェックボックスを表示したいだけなら、[MaterialToggle] チェックボックスに応じて 0 or 1 がプロパティーに設定されます。 [Toggle] はキーワードを設定したい時に使用する。 #pragma shader_feature や #pragma multi_compile で使用します。 CustomEditor を指定して完全にカスタマイズする 上記のシェーダーテンプレートの、FallBack の並びに CustomEditor を追加してクラス名を指定すると、指定のエディター拡張でインスペクターの描画を完全にコントロールできるようになります。 CustomEditor "ShaderInspectorClassName" 参考 ※指定のクラスを含むエディタースクリプトは Editor フォルダ以下に配置します。 Unity - Scripting API: ShaderGUI Cull や ZTest 等に Inspector で設定したプロパティーの値を使う Cull 等にインスペクターで設定した値を渡したい場合は、[プロパティ名] と記述します。 例: Cull [_CullPropertyName] ZTest [_ZTestPropertyName] プロパティーに Enum を設定してドロップダウンメニューから選べるようにしておくと、間違った値を設定をしてしまうことを防ぐ事が出来ます。 例: [Enum(UnityEngine.Rendering.CullMode)] _Cull("Cull", Float) = 0 Enum がある場合はプロパティーに設定しておく 大抵のものは UnityEngine.Rendering に Enum が定義されているので、一覧から探して忘れずに設定しておきます。 Unity - Scripting API: CullMode プロパティーにシェーダーからアクセスする シェーダーからプロパティーの値を参照するには、CGINCLUDE か CGPROGRAM 内で変数を定義します。詳細はこちらです。 Unity - Manual: Accessing shader properties in Cg/HLSL ※ uniform float4 _MyColor; と書くことも出来ますが、uniform は無くても良いです。 テクスチャ解像度や時間などの特殊なプロパティー テクスチャとして _MainTex を設定すると、Inspector から UV オフセットとスケールが設定できるようになります。シェーダーからそれらの値にアクセスするには、_ST(Scale & Translation)を末尾に付けた float4 _MainTex_ST という特殊なプロパティーを使います。 同様に float4 _MainTex_TexelSize を定義した場合は、アサインされているテクスチャのサイズなどが取得できるようになります。 その他にも、末尾 _HDR や、VATシェーダーでも使っている _Time 等があります。詳細は以下のページが参考になります。 [Unity] シェーダで使える定義済値 - Qiita Unity - Manual: Accessing shader properties in Cg/HLSL SubShader と Pass SubShader はプロパティの並びに必要なブロックで、タグを通して Render Queue の設定などが可能です。 ※ レンダーキューについての抜粋 Background (1000): 背景、スカイボックス(天球)の描画に使用。 Geometry (2000): 不透明オブジェクト用のキューで、描画順は手前→奥。 AlphaTest (2450): カットアウト(Cutout)用のキューで不透明オブジェクトとしてソートされる。 ↑ ↑ ↑ レンダーキューが 2,500 以下の場合は不透明オブジェクトとして手前→奥にソートされる。 キューが 2,501 以上の場合は透明オブジェクトとして奥→手前にソートされるようになる。 ↓ ↓ ↓ Transparent (3000): 透明オブジェクト用のキューで、描画順は奥→手前。 Overlay (4000): レンズフレアや GUI、テキストの描画などに使用。 ※ "Geometry+5" のように相対的に指定することも可能です。 ※ フラグメントシェーダーでカットアウト処理を行うには clip() 関数を使用します。 SubShader のその他の詳細はこちらから確認できます。 Unity - Manual: ShaderLab: SubShader Tags アルファチャンネルを使用したカットアウト(Cutout)処理 キューを AlphaTest にしただけではカットアウト処理は行われません。Unity 2018 LTS・フラグメントシェーダー対応のカットアウト処理については、こちらの記事が非常に参考になります。 Unityのアルファテストがレガシーなものになっていた件 パフォーマンスに応じてシェーダーを切り替える LOD 処理 シェーダーの LOD については、こちらから確認できます。 Unity - Manual: Shader Level of Detail SubShader の Tags SubShader の Tags の詳細はこちらから確認できます。 Unity - Manual: ShaderLab: SubShader Tags SubShader の Pass SubShader には複数の Pass ブロックを持つ事ができ、影描画やライトマップのベイク時など、場合によって処理を変える事が出来ます。(パスが無い SubShader のみの実装でも動作します) Pass と SubShader は記述内容はほぼ同様ですが、Tags の内容が若干違います。 Unity - Manual: ShaderLab: Pass Tags タグの後には SubShader と同様に Cull 等の設定を必要に応じて記述します。 Unity - Manual: ShaderLab: Pass CGPROGRAM ~ ENDCG SubShader や Pass ブロック内に記述する、シェーダー本体の実装部分です。頂点シェーダーやピクセルシェーダーは CGPROGRAM ~ ENDCG の間に記述します。 Unity エンジンから取得できるデータの一覧など、良く参照する公式ドキュメントはこちらです。 チュートリアル Unity - Manual: Shaders: vertex and fragment programs リファレンス Unity - Manual: Built-in shader variables Unity - Manual: Built-in shader helper functions Unity - Manual: Predefined Shader preprocessor macros Unity - Manual: Built-in shader include files Unity - Manual: Providing vertex data to vertex programs Unity - Manual: Shader semantics Unity - Manual: Writing vertex and fragment shaders サンプル集 Unity - Manual: Vertex and fragment shader examples CGINCLUDE ~ ENDCG 上記の CGPROGRAM とほぼ同様ですが、SubShader 内などで、各 Pass 共通の処理を書くときに使用します。 シェーダーモデルのターゲットレベル ターゲットレベルは、基本的に Shader Model 3.0 にしておくと良いと思います。 #pragma target 3.0 各モデルでサポートされている機能の一覧はこちらで確認できます。 Unity - Manual: Shader Compilation Target Levels multi_compile vs. shader_feature 設定によって処理内容を変える方法として、#pragma multi_compile... と #pragma shader_feature... の2つがあります。 multi_compile 使用しているかどうかに関わらず、すべての組み合わせがコンパイルされる。ランタイム中に Material.EnableKeyword で切り替えが可能。 shader_feature プロジェクト内で使用している組み合わせだけがコンパイルされる。ランタイム中に切り替えは不可能。 とりあえず multi_compile を使っておこう、と思えますが、multi_compile は組み合わせのすべてを shader variants としてコンパイルするので、数によっては非常に時間のかかる処理になってしまいます。 (例: オン・オフが4つ、2 ^ 4 = 16 種類のバリアント) シェーダーが初めて表示されるときにメインスレッドでコンパイルが走るわけですが、シェーダーバリアントが多い場合は、特にモバイル環境でコンパイルに時間がかかり、終わるまでアニメーション・パーティクル・UIの入力ほか全てが停まることになります。 そのため、shader_feature との使い分けが必要になります。 参考: Unity - Manual: Making multiple shader program variants if/else の使用は避ける シェーダーの条件分岐で if/else を使用することは可能ですが、処理が重いので代わりに step 関数を使用します。詳細は以下の記事が非常に参考になります。 条件分岐のためにstep関数を使う時の考え方をまとめてみた - Qiita ※ mix() は GLSL の関数で、ShaderLab (HLSL) では lerp() を使用します。 GLSL と HLSL の差異はこちらにまとまっています。 GLSLをHLSLに書き換える - Qiita TEXCOORD が不足した場合 UV は基本的には最大 4 枚(TEXCOORD0~3)で、TEXCOORD1 はライトマップ用に使われる想定になっています。モデルのインポート設定で Generate Lightmap UVs をオンにした場合、TEXCOORD1 が更新されるという事ですね。 この TEXCOORD は UV 以外にも Unity 標準のフォグの実装などでも使われていたり、その他様々な用途で消費され、足りなくなってきます。 UVは2次元の座標ですが、TEXCOORD は float4 or half4 の4要素を持てるようになっています。なので、UV 1つ目を TEXCOORD#.xy に、UV 2つ目を TEXCOORD#.zw に、といったように2つを1つにまとめる事も可能です。 ※ VAT シェーダーでも TEXCOORD0 の .zw を使っています。 Unity 上で UV を設定する場合、Mesh.uv* を使用すると .zw の設定が出来ないので、代わりに Mesh.GetUVs & Mesh.SetUVs を使います。 Unity - Scripting API: Mesh.GetUVs Unity - Scripting API: Mesh.SetUVs v2f など、頂点シェーダーからピクセルシェーダーにデータを送る際には、TEXCOORD を効率よく利用することを心がけておきたいです。 頂点シェーダーの注意点 テクスチャの色情報を取得する tex2D() がありますが、これはフラグメントシェーダーの中でしか使えません。 バーテックスシェーダーからテクスチャにアクセスしたい場合には、代わりに tex2Dlod() を使用します。 フラグメントシェーダーの注意点 注意点、では無いですが、fixed4 frag() だと HDR レンダリングに対応できるのか、出来ないのか、調べ切れませんでした。 溢れた色が思った通りにならなければ、half4 frag() や float4 frag() にすると良いかもしれません。 おわりに 冒頭で紹介した VAT シェーダーですが、仕事で使う必要が無くなった&他の事で手一杯なので、今後の開発についてはまっっったく予定が立たない状態ではありますが、積んでしまったパーティクル(Shuriken)のメッシュインスタンスへの対応なども、シェーダーの開発に合わせてこちらの備忘録まとめに追加していければ良いなと思っています。 今回は1体のポリゴン数が 4,472、アニメーションが 202 frames @ 30fps のアセットを録画しながら大量に動かす、という結構な重みでのテストでしたが、モバイルでも 100 体程度なら十分動いたのは予想外でした。 ループモーションで動くキャラをつまんで移動することもできるので、リアルタイムストラテジーのように引いた絵に大量のキャラがいるようなゲームであれば、VAT でのアニメーションでも十分なのかもしれませんね。 -- 最後までお読み頂きありがとうございます。これは Unity のアドベントカレンダーに向けて書いていたのですが、当初想定した以上に長く&遅くなってしまいました。みなさまの今後のシェーダー開発の助けになれば幸いです。 それでは以上になります。お疲れさまでした。 おまけ モバイル端末(Android)でのテスト動画です。 モバイルで VAT シェーダーのテストVertex Animation Texture shader on mobile platform, #unity3d.202 frames@30fps animation, 4,472 tris each.Xperia 5 (Snapdragon 855 / Adreno 640)60fps=180mesh30fps=460mesh1,000mesh=20fps pic.twitter.com/k1GpXStzQW— サトー (@sator_imaging) December 25, 2019

読む
Substance Painter のレジストリ(TDRどうこう)をダブルクリックで解決するヤツ Qiita

Substance Painter のレジストリ(TDRどうこう)をダブルクリックで解決するヤツ

こいつです。 一度修正しても、グラボのドライバをアップデートしたりすると復活したりします(今日復活した) ※ 調べるの面倒だしダイジョブやろ! と Continue anyway したらマシンが止まったので、ちゃんと設定やっといた方が良いです。 レジストリを更新する .reg ファイルを作る メモ帳などで、以下のテキストを SubstancePainter_Fix_TDR_Issue.reg など、拡張子を .reg にした状態のテキストファイルとして保存します。 SubstancePainter_Fix_TDR_Issue.reg Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlGraphicsDrivers] "TdrDdiDelay"=dword:0000003c "TdrDelay"=dword:0000003c .reg ファイルをダブルクリック 保存した .reg ファイルをダブルクリックします。 すると、 「このアプリがデバイスに変更を加えることを許可しますか?」 … 「レジストリエディター」 … と出たり、 とか出たりするので、「はい」を選択。 以下のダイアログが出て、レジストリが更新されます。 いつかまた忘れたころにダイアログが出ても、次からは .reg ファイルをダブルクリックするだけで TDR Issue を回避できるようになります。 以上です。お疲れさまでした。 -- まとめ #DCCツール&アセット開発まとめ

読む
#Unity開発まとめ Qiita

#Unity開発まとめ

Unity関連のまとめ。 ソフトウェア開発 リップシンク シェーダー開発 ARCore アセット Unity 関連 ハードウェア データグローブ アプリケーション開発 HTC Vive アプリケーション開発 その他 ソフトウェア開発 Hi5 グローブを2台以上同時に使う Noitom 社製の Hi5 グローブで収録されたモーションキャプチャーデータを、ネットワーク経由(UDP)で別のマシンにリアルタイムでストリーミングするソフトウェアです。 【YouTube】Hi5 グローブ ― キャプチャーデータのストリーミング用ソフトウェア SteamVR・HTC Vive のトラッキング品質の改善 リップシンク OVR Lipsync 更新(2019-04-23日版) 複数のマイクをつないでキャラごとにリップシンク 複数のマイクをつないでキャラごとにリップシンク(その2) シェーダー開発 頂点アニメーションテクスチャ(VAT)& Unity シェーダーの開発まとめ 【YouTube】VATKit - Vertex Animation Texture toolkit for Unity ARCore ARCore とセルシェーダーと環境光推定 【YouTube】Light Estimation with ARCore アセット 【Unity】 キャラクターのポーズ編集用エディター拡張 【YouTube】Unity ポーズエディター チュートリアル Unity でタッチジェスチャーの認識 【YouTube】Touch Gesture Recognition for Unity Unity の Terrain を FBX でエクスポート Unity 関連 Unity 2018 でライトマップに OptiX Denoiser を適用 Unity 2018 以前のバージョンのライトマッパーはデノイズに対応していないので何とかしよう、というお話。 VRM データをもっと Unity らしく作る Unity の Transform のパフォーマンス最適化まとめ vector3.x = 0 は出来るのに、transform.position.x = 0 は出来ない、ということで、こいつらは少し特殊な扱いです。Transform をキャッシュしていたとしても、 ..... = new Vector3(cache.eulerAngles.x, cache.eulerAngles.y, cache.eulerAngles.z); など、メンバーに3回アクセスすると、3回分の Vector3 のコピーが... Unity 2018 LTS リリース(2019-05-10) Unity 2019.1 vs 2018.3 比較 Unity 2019.1 新機能一覧(公式ドキュメントより) ハードウェア データグローブ Hi5 グローブのセットアップから Unity への組み込みまで アプリケーション開発 Hi5 グローブを2台以上同時に使う Noitom 社製の Hi5 グローブで収録されたモーションキャプチャーデータを、ネットワーク経由(UDP)で別のマシンにリアルタイムでストリーミングするソフトウェアです。 【YouTube】Hi5 グローブ ― キャプチャーデータのストリーミング用ソフトウェア HTC Vive アプリケーション開発 SteamVR・HTC Vive のトラッキング品質の改善 その他 Leap Motion のセットアップから Unity への組み込みまで

読む
Unity でタッチジェスチャーの認識 Qiita

Unity でタッチジェスチャーの認識

テストやデバッグ目的で、作ってるものの一部分だけ切り出してスマホでちょっと見てみよう、て時に欲しくなった奴です。 -- Unity でのタッチジェスチャーの認識、Input.GetTouch() は生の情報を取れるだけでジェスチャーの判定とかはしてくれないので、ちょっと面倒。 ガッツリと作ってるものなら既に入力周りは実装済みだろうし、逆にちょっとテスト用に~ だとアセットストアにあるような、Inspector からイベントの登録ができます! だとかはオーバーキルだし結局スクリプト必要だし。 テスト用のシーンに軽く好みのタッチ操作を実装したいって時に、C# スクリプトからすぐに使えるライブラリっぽいものが欲しい、という方にはお勧め。 出来ること 使い方 タップ判定の閾値 タップ判定 タッチしている指の数 UnityEngine.Touch タッチの継続時間 ジェスチャー スワイプ フリック ピンチ(拡大・縮小) ピンチ(回転) ピンチ(スワイプ) こちらから 出来ること Touch Gesture Recognition for Unity - YouTube 使い方 using SatorImaging.UnityTouchRecognizer; する。 TouchRecognizer に初めてアクセスしたときに初期化されるが、必要に応じて TouchRecognizer.Initialize() で明示的にイニシャライズする。 MonoBehaviour の Update() 内などで、TouchRecognizer.Update() を毎フレーム呼ぶ。 ※ 今時点で .Update() は、同一フレーム内で何回呼ばれても一度しか更新しない。という処理はしていないので、複数の場所で .Update() しない。 タップ判定の閾値 時間の閾値のみでタップ距離の閾値は無し。.Get***() で距離や角度の閾値を指定出来るので必要であれば。 TouchRecognizer.tapCountTimeThreshold タップの判定の閾値(秒) TouchRecognizer.tapCountIntervalTimeThreshold 複数回タップの判定になる、各タップの間隔(秒) タップ判定 TouchRecognizer.IsTapped タップ判定されたフレームでオンに。 TouchRecognizer.TapCount タップの回数。インターバルの閾値次第でどんどん増えていく。 TouchRecognizer.TapFingerCount タップ判定された時の指の数。2 本の指でタッチした状態で片方の指でタップをした場合は 2 となる。ピンチジェスチャーに割り当てた画面回転などのアクションをリセットするときに使う。 タッチしている指の数 TouchRecognizer.FingerCount 現在タッチしている指の数。 TouchRecognizer.IsFingerCountChanged 指の数が変わったフレームでオンに。 TouchRecognizer.IsFingerCountIncreased 指数が増えたフレームでオンに。 TouchRecognizer.IsFingerCountDecreased 指数が減ったフレームでオンに。 UnityEngine.Touch タッチしていないときは TouchRecognizer.nullTouch が返ってくる。0 > Touch.fingerId なら nullTouch。 TouchRecognizer.FirstFinger UnityEngine.Touch を直接見たい場合。 Touch.fingerId を追っかけてるので場合によっては .SecondFinger は存在して .FirstFinger は .nullTouch の場合アリ。 TouchRecognizer.SecondFinger UnityEngine.Touch を直接見たい場合。 タッチの継続時間 TouchRecognizer.TouchDuration タッチの継続時間(秒) TouchRecognizer.LatestTouchDuration 最新のタッチの継続時間(秒)。指数が減った場合は最初のタッチの秒数に(なので、結果増える) 使いどころは思い浮かばないがとりあえず用意しておいた。 ジェスチャー ジェスチャー系のパラメーターはフリック判定で使ったりするので、.Update() するまでは直前の値を保持し続ける。 .Get***() で Threshold を指定した場合は閾値を超えた分が返ってくる。 - 例: 閾値に 100(px)を指定して 123 ピクセル動いた場合、23 が返ってくる。 -- タッチしている指が2本の場合に .SwipeVector 他、1本指のジェスチャーを取ると float.NaN か Vector2(float.NaN, float.NaN) か int.MinValue が返ってくる。 なので、基本は .FingerCount で処理を分ける。 スワイプ TouchRecognizer.SwipeVector スワイプのベクトル。 TouchRecognizer.SwipeDeltaVector スワイプの前フレームからの差分ベクトル(生値) TouchRecognizer.GetSwipeVector(float distanceThreshold) TouchRecognizer.GetSwipeDeltaVector(float distanceThreshold) 指定した閾値(ピクセル)を超えた分のスワイプのベクトル。 フリック フリックした後、カメラがスーーーっと止まる、をやろうとすると、ベクトルの減衰処理が必要だったりなので、機能を追加予定。 今時点でのフリック判定は、指数が減ったフレーム(.IsFingerCountDecreased)で、.FingerCount が望みの数の時に .SwipeDeltaVector 等の .magnitude が閾値を超えていたら .SwipeVector か .SwipeDeltaVector を使って良い感じにする、で出来る(ハズ ピンチ(拡大・縮小) TouchRecognizer.PinchLength ピンチの長さ(px)。縮めるジェスチャーだとマイナスの値。 TouchRecognizer.PinchDeltaLength 前フレームからの差分。 TouchRecognizer.GetPinchLength(float lengthThreshold) TouchRecognizer.GetPinchDeltaLength(float lengthThreshold) ピンチジェスチャーの長さ(w/閾値指定) ピンチ(回転) TouchRecognizer.PinchAngle ピンチで回した角度(反時計回り、度数でラジアンではない) TouchRecognizer.PinchDeltaAngle デルタ。 TouchRecognizer.GetPinchAngle(float angleThresholdInDegrees) TouchRecognizer.GetPinchDeltaAngle(float angleThresholdInDegrees) 閾値指定。 ピンチ(スワイプ) TouchRecognizer.PinchVector 2本指でのスワイプのベクトル。ピンチの拡縮や回転ではあまり反応しない(が全く無反応というわけではない)。 2本指を同じ方向にスワイプした時のジェスチャを取る場合に使う。 TouchRecognizer.PinchDeltaVector Δ TouchRecognizer.GetPinchVector(float distanceThreshold) TouchRecognizer.GetPinchDeltaVector(float distanceThreshold) 閾値。 こちらから Touch Gesture Recognizer - Asset Store

読む
SteamVR・HTC Vive のトラッキング品質の改善 Qiita

SteamVR・HTC Vive のトラッキング品質の改善

はじめに SteamVR Device Monitor は、主に HTC Vive の HMD、ベースステーション、コントローラー、トラッカー等のデバイスのトラッキング状況とステータスを表示する為のソフトウェアです。 広い空間内で大量のデバイスを使う環境で、しっかりとした精度を出したい VR ビジネスやエンターテインメントの現場で特に有用です。 スクリーンショット ※ Valve Index 他、Steam VR 対応のデバイスなら対応している(ハズ)HTC Vive Cosmos も、おそらく。 -- HMD を装着する必要はなく、マウスを使ってカメラを自由に移動してルーム内のさまざまな場所での認識精度やトラッキングの安定性を確認でき、設置する現場環境において十分な精度が出るまで、勘に頼ることなく Base Station の位置を見直す事が出来ます。 また、以下に示すような状況では、トラッキング精度が悪いのか特定のトラッカーだけが不規則な挙動を示すのか、まず最初に何がどうなっているのかをしっかりと確認し、その上で問題の修正に取り組む事が出来るようになります。 Vive トラッカーのトラブルと対処方法 ※ 複数人で作業して、「ちょっと移動してみて」「後ろ向いてみて」等、デバイスを動かしながら、SteamVR Device Monitor で確認をするのがおススメです。 はじめに スクリーンショット 動作画面 使い方 起動方法 各種操作方法 カメラ操作 ステータス表示 フリッカー検出機能 SteamVR プラグインのバージョン おわりに SteamVR のトラッキングステータスの扱い ダウンロードはこちら BOOTH Steam 動作画面 動作中の画面は以下の通りです。 SteamVR の TrackingResult が Calibrating_OutOfRange の時は、うまいことスムージングかける様にすれば大丈夫そう。IKinema にこの辺りやってほしかったんだけど、潰れちゃったら困る pic.twitter.com/BMMyNR5AyS— サトー (@sator_imaging) September 16, 2019 使い方 アプリを起動すると、トラッキングされたデバイスの 3D モデルと各種ステータスの一覧が表示されます。 起動方法 「SteamVR_DeviceMonitor」フォルダにある、「SteamVR_DeviceMonitor.exe」をダブルクリックして起動してください。 ※ Hobbyist Edition の場合は、 「SteamVR_DeviceMonitor_HobbyistEdition」フォルダにある、「SteamVR_DeviceMonitor_HobbyistEdition.exe」をダブルクリックしてください。 各種操作方法 カメラ操作 マウス左ボタン カメラが旋回します。 マウス中ボタン カメラが上下左右に移動します。 マウス右ボタン その場で上下左右を見まわします。 マウスホイール / Alt + マウスの右ボタン カメラを前後に移動します。 R キー カメラを初期位置に移動。 ステータス表示 ↑ / ↓ キー デバイス上にオーバーレイ表示されるステータスのサイズを変更します。 フリッカー検出機能 初期設定では移動する方向が一瞬(1フレーム)で 60 度以上変わり、かつ 1.0cm 以上移動した場合、フリッカーとして検出します。 P / O キー 移動量の閾値を設定。 D / S キー 移動方向の閾値。 SteamVR プラグインのバージョン SteamVR Device Monitor の各バージョンで使用している SteamVR プラグインは以下の通りです。 v1.0.0(2019-10-09) SteamVR Unity Plugin - v2.3.2 (sdk 1.4.18) おわりに SteamVR のトラッキングステータスの扱い このソフトウェアでデバイスの動作を見ていると、SteamVR の提供するステータスを鵜呑みにしてエラーを吐くのはちょっと違う、というのが分かります。 TrackedDevicePose_t の ETrackingResult が Calibrating_OutOfRange となっている場合、名前の印象とは裏腹に Calibrating_TrackingUnstable ぐらいの感覚で、実際にはデバイスのトラッキングは継続しています。 ※ 実際にトラッキングエリアからデバイスが外れてベースステーションが見失った場合は、デバイスリストからデバイスそのものが消えます。 OutOfRange の場合は大抵、デバイスが小刻みに震えているかスライドしている状態なので、エラーを出さず、最後に Running_OK だった位置を使うなどして上手くスムージングを掛けて処理してあげると良いかもしれません。 ※ トラッカーやコントローラーでなく HMD の座標をいじる場合は要注意です。 -- Apple に買収されたと噂の IKinema は律義にデバイスステータスを捉えていて、精度的には十分な動きをしているのにステータスが変わったせいで止まる、という問題(?)がありました。 そういう実装でリリースされた場合、ステータスを確認せずに動作していた旧バージョンを使い続ける羽目になったりします。 ルームど真ん中でトラッキングしていても、ほんの一瞬、ステータスが変わってしまうことは(多分)防ぎようがないので、OutOfRange が1秒続いたらエラー、など、ステータスは上手く捌いてやると良いと思います。 public enum ETrackingResult { Uninitialized = 1, Calibrating_InProgress = 100, Calibrating_OutOfRange = 101, Running_OK = 200, Running_OutOfRange = 201, Fallback_RotationOnly = 300, } -- ダウンロードはこちら BOOTH 【VR】 SteamVR デバイスモニター(HTC Vive 等) Steam Steamworks に申請中。

読む
ARCore とセルシェーダーと環境光推定 Qiita

ARCore とセルシェーダーと環境光推定

ARCore とセルシェーダーと環境光推定 田舎の開けた場所で。 照明が入るとキャラよりもメカで遊びたくなる。 ARCore の Light Estimation 光源 スカイボックス(映り込み) その他 歩きながらキャラを置いたら デレステの AR モード Vuforia SDK デレステ AR モードの利用規約 昼間&夜間 NPR セルシェーダーにはつらい照明環境Light Estimation with #ARCore pic.twitter.com/X3oPEKvpoC— サトー (@sator_imaging) August 14, 2019 ARCore の Light Estimation Light Estimation は環境光推定って訳でいいのだろうか。 光源 光源の向きは良い感じ。 夜間に自動販売機の横に置いたらちゃんと照明がその向きから来た。 けど自販機の横を過ぎてタイムラグがあってからライティングが反映された。 影の色や強さは拾ってくれない。 影の中にキャラを置いても日陰にいる感じにはならない場合と、なる場合がある。 照明の明るさは怪しい…? スマホの照度センサーを覆っても明るさは変わらなかったので、センサーを使っているわけではなさそう。 セルシェーダーの場合は、ライトの明るさをクリップしないと明るくなりすぎる。 背景のカメラ画像の平均輝度をライトの明るさにする、ぐらいが丁度よさそう。 スカイボックス(映り込み) スカイボックスも作ってくれてるみたいだけど、ちょっと良くわからない画像になってる。 どこで撮影しても同じテンプレの画像を使ってるように見える。 明るいライトや草とか、特徴的な部分は映り込んでほしかった。 映り込み用のスカイボックス画像は自前で作った方が良さそう。 その他 カメラのブラーやボケ、グレインは上手いこと合わせたい。 ARCore の設定でフォーカスモードを Fixed にすればボケは気にしなくても良さそう。 パンフォーカスだとしてもカメラのモーションブラーは付けないと合わない。グレインも。 スマホのカメラの焦点距離とか取得できそうな気がする。けど機種間で差がありそうだ。 歩きながらキャラを置いたら Light Estimation with ARCore - YouTube デレステの AR モード デレスポが出る、 のでデレステのアカウントを復旧したら AR モードが付いてた。 『デレステ』をもっと楽しむための新アプリ『デレスポ』発表―VR対応でアイドルがもっと身近に! | インサイド Vuforia SDK 使用しているのは Vuforia というやつ。 AR マーカー(画像)以外にも立体物の認識が出来るようだけど、フィギュアを認識してどうこう、みたいな機能は特に見当たらず。 Vuforia SDK 4.0 with Object Recognition デレステ AR モードの利用規約 参考。

読む
Vive トラッカーのトラブルと対処方法 Qiita

Vive トラッカーのトラブルと対処方法

はじめに 設定に問題もなく絶っ対に動くはずなのに、トラッカーが想定通りに動かない状態になる原因は、(おそらく)トラッカーが過去にペアリングしたことがあるドングルが複数、同じ場所に存在する環境で使用しようとすること。 複数とペアリングしたことのあるトラッカーが複数のドングルと無線通信をしようとして、他のトラッカーの通信を妨げている。 ※ 多分に推測を含みます。 スペック的にも Vive と SteamVR の設定的にも絶対に動くはずなのに動かない…! 不規則にトラッキングが外れる、もうなんもわからん! という状態なら以下を試してみると良い、かも。 大量の Vive トラッカーを使う際の注意点 重要なこと おかしくなりがちな使用例 注 おかしな挙動の例 対処方法 ペアリングの管理 リセット トラッカーのペアリング手順 挙動のおかしいペアの排除 トラッカーの電源が入らない場合 おわりに 大量の Vive トラッカーを使う際の注意点 重要なこと トラッカーを同時に、同じ環境下で大量に使うかどうかに関わらず、以下は守っておく。 Vive トラッカーのドングルは共用しない。 技術的には可能だが絶対にやらない。 コントローラーは使わない場合も必ず接続しておく。 リンクボックス内蔵の汎用 Bluetooth ドングルを埋める為。 Vive のリンクボックスにはコントローラーの無線接続用に、汎用 Bluetooth ドングルが内蔵されているので、それらがトラッカーに無用な影響を与えないよう、Vive コントローラーは使わなくても接続しておく。 また、運用時にコントローラーも HMD も使わないという場合でも、トラッキングエリア内には入れておいた方が良い。 おかしくなりがちな使用例 トラッカーA: - ドングル A と B とペアリングされたことがある。 トラッカーB: - ドングル B とペアリングされたことがある。 トラッカーは空いているドングルと勝手にペアリングするような挙動だが、基本的には過去にペアリングされたことがあるドングルに無線接続を試みているように見受けられる。 で、 現場 A でトラッカー A をドングル A とペアリング。 現場 B ではトラッカー A をドングル B とペアリング。 それぞれ問題なく使用できていた状態で、さて 現場 C でドングル A・B を同じ環境に用意した状態で、トラッカー A・B を使おう となった際、どうやら挙動が怪しい。 注 この状況は現場が別々の場合以外にも、トラッカーの挙動が怪しいから変えてみる(ドングルは変えない)という運用を繰り返し行っていた場合にも起こりうる。 おかしな挙動の例 Vive トラッカーが断続的に数フレーム、ミリ秒単位で消える(トラッキングが外れる)が頻繁に、不規則に起きる。 Steam VR モニターには問題なくトラッカーが接続されていると表示されている。 充電は確認済みなのに一度電源を切ると Vive トラッカーの電源が入らない(本体の LED がつかない) PC に USB で有線接続すると電源が入れられる状態になる。(なんで?) Steam VR モニターから「トラッカーの電源を切る」をやっても切れないヤツがいる。 他のトラッカーをオフにしていくと、ふと切れるタイミングがある。 ※ 過去に複数のドングルとペアリングしたことがあるトラッカーは、同時に複数のドングルとの接続を試みていて、それが他のトラッカーの通信を妨害しているのでは、と怪しんでいる理由 1分ぐらい様子見してて問題ないから、よしやるか! となった途端、不安定になる。(腹立つ) 特徴的なのは、おかしな挙動をするのは特定のトラッカーのみであり、その他のトラッカーは非常に安定した状態である(なので、Vive ベースステーションの設定・設置に問題はない)こと。 対処方法 単体では問題なく動くが、とあるトラッカーと同じ環境で使用するとおかしな挙動を示す、という問題の起きるペアを排除する。 ※ 単体では問題なく動くので、トラッカー自体は故障している訳ではなさそう? ペアリングの管理 大量の Vive トラッカーを扱う場合は、必ず「ドングル」「トラッカー本体」「クレードル(台座)」にラベルを貼ってペアリングの管理をする。 基本的には同じパッケージに入っていたもの以外とはペアリングしない。 (他のパッケージ付属のドングル&トラッカーでも技術的にはペアリング可能だが絶対にしない) ペアリング管理を初めからやっている場合は良いが、そうでない場合は以下を。 ↓ ↓ リセット まずはおまじないとして。 USB ドライバを削除 Steam VR の設定ウインドウ → 開発者セクションから全デバイス削除を行う。 念のため Windows のコントロールパネルの Bluetooth 設定にある、Watchman Dongle も全部削除。 をまずは行い、 Steam VR をアンインストール Steam をアンインストール Steam もアンインストールするのはコンフィグを消すため。(一応) Steam と SteamVR を再インストールする。 -- 「電源管理を無効化」は実行していない。これをやって逆におかしくなったりした事もある。 (が、無効化が問題の原因かはハッキリ分からず) トラッカーのペアリング手順 以下の手順でトラッカーとドングルをペアリングする。 準備 コントローラーを左右とも接続した状態にする。 全てのトラッカーのドングルを PC から外し、すべてのトラッカーの電源を切る。 準備が出来たらトラッカーとドングルのペアごとに、以下を繰り返し行う。 面倒くさがらずに必ず1ペアずつ。 ドングルと、電源が切れた状態のトラッカーを USB で PC に有線接続の上、通常通りペアリングを行う。 「Something went wrong」というような表示が出る組み合わせもあるが、続けていればいつかはペアリングができるので根気よくやる。 ペアリングが済んだドングルは PC から外し、トラッカーも USB から外して電源を切る。 ※ ペアリングの管理を忘れずに。 諸々終わったらトラッカーのロールの設定も忘れずにやっておく。 挙動のおかしいペアの排除 ペアリングを済ませたら、一つずつトラッカーの電源を入れていき、同時に複数のトラッカーを使用した状態での挙動を見る。 で、 挙動のおかしなトラッカーとドングルのペアがいたら PC から外して電源を切る。 新しいペアを PC に接続する。 SteamVR モニター経由で電源が入っているすべてのトラッカーの電源を落とす。 再度、一つずつトラッカーの接続を確立していく。(LED が緑になるまで他のトラッカーの電源を入れない) を、同時に使えるトラッカーの組み合わせが見つかるまで繰り返す。 -- トラッカーの予備が無い場合は分からず。が、予備が無いならトラッカーは特定のドングルとのみペアリングされているハズなので問題はない?? ※ 今思えば予備が無かったころの方が諸々上手くいっていた。 予備が無い場合に挙動が怪しいトラッカーが居たら、それはトラッカー自体の故障の可能性あり。 オフィスの移転、予備のトラッカーを仕入れる等があると、ペアリングがごちゃごちゃになるので注意。トラッカーの故障を疑って予備を仕入れて運用する場合は、ペアリング管理をしっかりと。 トラッカーの電源が入らない場合 それまでは全く問題が無かったのに、急に本体のボタンを入れても電源が入らなくなるトラッカーが出たりする。 その場合、 ペアになっているドングルを USB ケーブルからトル。 外した USB ケーブルを使ってトラッカーを PC に接続する。 トラッカー本体のスイッチを押す。 で電源が付くようになる。 おわりに 対処方法は、ほぼおまじない。が、もう何やっても上手くいかない! という場合には。 トラッカー単体での動作は問題ない、設定も変えてないので絶対に動くはずなのに、という場合は、同時に使うトラッカーの組み合わせによっておかしな挙動をしている。 開封したばかりのトラッカーが、他のトラッカーと同時に運用するとおかしな挙動を示す。 さっきまで諸々上手くいってただろーー! 等々、同時に使うトラッカーの組み合わせを変えるだけで解消したりするので、もう深く考えても考えてもしょうがない部分なので地道に。(か、何か重大な見落としがあるか) トラッカーとドングルを完全に初期化する、ファームウェアを再インストールする、という事はぱっと見ムリそうで、おかしな挙動のトラッカーが居たらとりあえず排除。を動くまでやる。 同時に使えないドングル&トラッカーのペアを排除してペアリングの管理が行き届きさえすれば、今までは一体何だったんだと思うぐらい、トラッキングがばっちりになる。

読む
Unity の Transform のパフォーマンス最適化まとめ Qiita

Unity の Transform のパフォーマンス最適化まとめ

(今更ですが)毎フレーム大量の Transform を扱う機会があったので、Unity 上で Transform を更新する際の手法とパフォーマンスの比較・最適化の方法のまとめを。 毎フレーム数百かそれ以上の Transform の .position や .rotation / .eulerAngles へのアクセスや変更がある場合には考慮する意味がある、といった内容です。Transform 沼にハマっているなら。 備忘録 はじめに 【重要】 rotation / eulerAngles の xyzw へのアクセスは必ずキャッシュする Transform だけキャッシュするのではなく、Quaternion や Vector3 もキャッシュ localRotation が一番高速 オイラー角よりもクオータニオンの方が高速 ワールドスペースよりローカルスペースの方が高速 ルートのみワールド空間で扱う localEulerAngles += よりも Transform.Rotate() 使えるなら HumanPoseHandler.SetHumanPose() を使う テスト動画 シーン構成 まとめ クオータニオンは高速 オフセットを加える場合は = Quaternion * Quaternion が一番高速 オイラー角は厳禁 どうしてもオイラー角でオフセットを指定したい Quaternion / Vector3 の xyzw メンバーへのアクセス自体が重い HumanPoseHandler の SetHumanPose の場合 こちらもどうぞ はじめに 面倒くさがってビルドして試さずに、すべてエディター上で確認しています。 また、.rotation / .eulerAngles を中心に確認していますが .position / .scale も同様の扱いかと思います。 Unity 2018.4.0f1(Unity 2018 LTS) Windows 10 64bit @ Intel Core i9-9900K 3.6GHz -- Humanoid キャラ一体の骨が 60~ 以上あったりするので、値の取得含めた Transform の操作は、油断しているとすぐ数百単位になる。そして Transform の値の取得に大きな罠があります。 【重要】 rotation / eulerAngles の xyzw へのアクセスは必ずキャッシュする これがかなり重要。 場合によっては数十%のパフォーマンスへのインパクトがあります。Transform のキャッシュでは(場合によっては)足りない。 Transform だけキャッシュするのではなく、Quaternion や Vector3 もキャッシュ vector3.x = 0 は出来るのに、transform.position.x = 0 は出来ない、ということで、こいつらは少し特殊な扱いです。Transform をキャッシュしていたとしても、 ..... = new Vector3(cache.eulerAngles.x, cache.eulerAngles.y, cache.eulerAngles.z); など、メンバーに3回アクセスすると、3回分の Vector3 のコピーが行われる。らしいです。 ↓ ↓ ↓ Transform.position や Transform.rotation、Transform.eulerAngles 等はフィールドではなくプロパティで getter がセットされていて、アクセスのたびに構造体のコピーが行われています。 (というようなことが、ネットのどこかに書いてあった気がしますが失念) ※ まとめにキャッシュの有り無しでのパフォーマンスの比較あり。 -- localRotation が一番高速 でした。 オイラー角よりもクオータニオンの方が高速 でした。 ワールドスペースよりローカルスペースの方が高速 .rotation よりも .localRotation、.eulerAngles よりも .localEulerAngles の方が高速でした。 ルートのみワールド空間で扱う 場合によってはルートのみワールド空間の値を扱い、それ以下のオブジェクトはすべてローカル空間の値を扱うなど。 テストではローカル値を扱うようにするだけで倍近いスピードに。 localEulerAngles += よりも Transform.Rotate() オフセットの調整等はオイラー角の方が直感的なので、.localEulerAngles += ..... としがちですが、Transform.Rotate() の方が高速です。 数が多い場合は結構なパフォーマンスへのインパクトがあります。 Unity - Scripting API: Transform.Rotate 使えるなら HumanPoseHandler.SetHumanPose() を使う 対象が Humanoid の場合、HumanPoseHandler の SetHumanPose の方が高速な場合があります。 以下がとても参考になります。 Bizcast/NoitomHi5InertiaToFingerMuscle テスト動画 フレームレートに大きな変化が出やすい数の Transform を更新してますが、場合によってはキャラ数体の場合でも、秒間 10fps 程度の変化がある可能性も。 シーン構成 95 個の muscles / Transform を1フレームに 100 回更新 = 秒間に約 10,000~ Transform の向きを更新するテストを行った動画。 ※ 揺れもの無しの人型キャラクター 100 体分のボーン数、ポリゴン自体は1体分 Unity の Transform のパフォーマンス最適化誰かがすでに調べ切っている気がするけども… オイラー角遅すぎる pic.twitter.com/hvLnTMIGnb— サトー (@sator_imaging) July 3, 2019 まとめ 可能な限りオイラー角は扱わない。 .eulerAngles / .localEulerAngles に値をセットする・メンバーにアクセスすると極端にパフォーマンスが落ちる。 Quaternion / Vector3 のメンバーにアクセスするのはコストがかかるので必ずキャッシュする。 Transform ではなく、Quaternion / Vector3 をキャッシュ。 クオータニオンは高速 取得した値を直接放り込むなら、SetHumanPose よりも高速。 .localRotation を変更した場合のフレームレート pseudo: .localRotation = Time.time; 約 800fps .rotation を変更した場合のフレームレート pseudo: .rotation = Time.time; 約 400fps オフセットを加える場合は = Quaternion * Quaternion が一番高速 各キャラクターごとの差分の吸収など、回転のオフセットは可能な限りクオータニオンで扱う。オイラー角を扱わなければ、SetHumanPose よりもパフォーマンスが出る。 .rotation にクオータニオンのオフセットを加えて変更 pseudo: .rotation = Time.time * Quaternion 約 360fps オイラー角は厳禁 オイラー角を扱うだけで何をしても重いので、可能な限り使わない。 .localEulerAngles を変更した場合のフレームレート pseudo: .localEulerAngles = Time.time; 約 500fps .eulerAngles を変更した場合のフレームレート pseudo: .eulerAngles = Time.time; 約 300fps どうしてもオイラー角でオフセットを指定したい ワールド空間のクオータニオン値をセットしてから、オイラー角でオフセットの数値を入力する必要がある場合は Transform.Rotate() を Space.Self で使う。 .rotation をセットしてから Transform.Rotate() でオフセットした場合のフレームレート pseudo: .rotation = Time.time; Transform.Rotate(); 約 210fps pseudo: .rotation = Time.time; .localEulerAngles += new Vector3() の場合 約 175fps 意味わからん Quaternion / Vector3 の xyzw メンバーへのアクセス自体が重い 前述の通り transform.position.x = 0 が出来ない、思っているのと違う奴らです。 数が多い場合、軽い気持ちでメンバーにアクセスするとパフォーマンスへのインパクトが凄いことに。 複数回アクセスする場合は、Transform の .rotation や .eulerAngles は var cached = transform.rotation 等するだけで劇的に高速に。 .... transform.position.x とか気軽に使いがちだけど、アクセスする数が多い場合は厳禁。必ずキャッシュ。 .rotation の各メンバーにキャッシュ無しでアクセスした場合(4回のアクセス) pseudo: .rotation = transform.rotation.xyzw + Time.time; 約 200fps キャッシュすると 約 320fps に pseudo: .rotation = cachedRotation.xyzw + Time.time; クオータニオンのメンバーを直接弄ることはないだろうけど、オフセットを適用するなら Quaternion * Quaternion に落とし込むのが一番高速 .eulerAngles の各メンバーにキャッシュ無しでアクセスした場合(3回のアクセス) pseudo: .eulerAngles = transform.eulerAngles.xyz + Time.time; 約 110fps キャッシュすると 約 190fps に pseudo: .eulerAngles = cachedEulerAngles.xyz + Time.time; HumanPoseHandler の SetHumanPose の場合 Avatar が Humanoid で無いと動かない、Humanoid 依存のソフトウェア・コンポーネントにしたくはないので、あまりちゃんと調べてないですが…。 HumanPoseHandler.SetHumanPose を使用した場合のフレームレート 約 250fps -- こちらもどうぞ #VTuber開発まとめ - Qiita

読む
Hi5 グローブを2台以上同時に使う Qiita

Hi5 グローブを2台以上同時に使う

はじめに Hi5 グローブの製造元である Noitom 社が販売している Neuron には、ネットワーク経由でデータを別のマシンに転送する機能がありますが、同じ Noitom 社製の Hi5 グローブにはそういった機能がありません。 2台以上の Hi5 グローブを使用して同時にキャプチャーを行おうとする場合には、Axis Neuron と同じようにネットワーク経由でデータを転送するソフトウェアが必要になります。 Hi5 Glove のデータを別の PC にストリーミングする Hi5 Remote は、Noitom 社製の Hi5 グローブで収録されたモーションキャプチャーデータを、ネットワーク経由(UDP)で別のマシンにリアルタイムで転送するソフトウェアです。 Hi5 Glove Remote アプリネットワーク経由での同期テスト pic.twitter.com/Tml8fmTJXh— サトー (@sator_imaging) July 1, 2019 Hi5 Remote の使い方 Hi5 グローブを PC に接続し、NetworkConfig.txt を設定してから Hi5Remote.exe を実行します。 Hi5 Remote の使い方 NetworkConfig.txt の編集 設定する上での注意点 設定ファイルに問題がある場合 ショートカットキー 実行中はウインドウをアクティブに デバッグ用ソフトウェア ソフトウェアの仕様 動作環境 転送データ仕様 稼働時間 バイトオーダーが違うマシンが混在している場合 組み込む上での参考資料 Hi5 Remote で受信したデータの適用 おわりに こちらもどうぞ NetworkConfig.txt の編集 Hi5 Remote と同じフォルダにある、Hi5Remote_Data/StreamingAssets/ フォルダの中に、接続先を設定をするためのファイル NetworkConfig.txt があります。 NetworkConfig.txt をメモ帳などのテキストエディタで開き、以下を参考にして接続先の情報をテキストファイルの最初の行に入力します。 [IPアドレス]:[ポート]@[最大送受信レート/秒] 例: 127.0.0.1:54321@200 設定する上での注意点 ポート番号は 32768 から 61000 の間に設定することをお勧めします。 2 台以上のマシンから Hi5 Remote を使用して1台のマシンに向けてデータを転送する場合は、ポート番号がそれぞれ異なる数字になるように設定する必要があります。 入力が終わったらファイルを保存して、Hi5 Remote の実行ファイルを起動します。 起動すると、NetworkConfig.txt で指定した IP アドレスのポートに対してデータ転送を開始します。 設定ファイルに問題がある場合 設定ファイルに問題がある場合は、アプリの左下に表示される IP アドレスが、127.0.0.4 ポートが 49494 になります。 IP アドレスが意図したものと違った場合は、NetworkConfig.txt を再度編集してから Hi5 Remote を再起動してください。 ショートカットキー リモート・デバッグソフトウェア共に、以下のショートカットキーを使用する事が出来ます。 Shift + R NetworkConfig.txt を読み込み直し、新しい設定でネットワーク接続を行います。 Shift + H ウインドウに表示されている各種情報を非表示にします。 実行中はウインドウをアクティブに Unity を使用したソフトウェアには、依然としてウインドウがアクティブになっていないとフレームレートが落ちる、という問題があります。 稼働中は可能な限り、Hi5 Remote ウインドウをアクティブにした状態にしておくことをお勧めします。 ※ 他のウインドウがアクティブな場合は以下の通り注意を促す表示がなされますが、ネットワーク経由でのデータのストリーミングは継続して行われています。 デバッグ用ソフトウェア 動作確認用にデバッグ用のソフトウェアが付属しています。 Shift + D のショートカットキーを押すことで、 テストアニメーションをネットワーク越しに転送するモード 転送されたアニメーションを受信して確認するモード を切り替えることができます。 ソフトウェアの仕様 動作環境 Windows 10 の 64bit 版で動作を確認しています。 ネットワークは無線LAN(Wi-Fi)ではなく、有線接続の LAN 環境での使用をおすすめします。 転送データ仕様 転送するデータは以下の通りです。 8 bytes header 4 bytes float * Quaternion xyzw * 20 joints * 2 hands 1度のデータ転送で計 648 バイトのデータを送信・受信します。 秒間 200fps でデータを転送した場合には、1秒間に 129.6KB、1分間で約 7.8MB のデータを送信するため、1Mbps (ビット/秒)のネットワーク帯域が必要になります。 稼働時間 長時間運用のテストでは送信側&受信側共にフレームレートが極端に落ちることなく、約4時間半の長時間稼働を確認しています。 ※ 受信側はデバッグアプリでの確認の為、受信機能を組み込んだ本試験は別に行う必要があります。 テストアニメーションを使用して、約4時間半の連続稼働フレームレートは送信側は終始 180 前後受信側の HUD の Frames Ignored は、直近で処理したフレームよりも前に送信されたデータを受信した数 pic.twitter.com/pk1dYCNLlm— サトー (@sator_imaging) July 1, 2019 バイトオーダーが違うマシンが混在している場合 バイトオーダーが違うマシンが混在している環境では上手くデータが転送できません。 設定に問題が無いのにデータが転送できない場合は、アプリ右上の経過時間のすぐ下に表示されている、Little Endian もしくは Big Endian の表記が、各マシンで統一されているのかを確認してください。 -- 組み込む上での参考資料 Unity の Transform を数多く扱う際のパフォーマンスの最適化については、以下をご覧ください。 Unity の Transform のパフォーマンス最適化まとめ - Qiita Hi5 Remote で受信したデータの適用 多くの Transform 毎フレーム更新することになるので、上記リンク先を参考に受信用のコンポーネントを組み込んでください。 おわりに 生放送等で Hi5 グローブを複数台使ってみたい、使おうと思っている方、おりましたらご連絡など頂ければ! -- こちらもどうぞ #VTuber開発まとめ - Qiita

読む
#VTuber開発まとめ Qiita

#VTuber開発まとめ

開発記録とメモのまとめ(随時更新) ソフトウェア篇 Windows スタンドアロン リップシンク OVR LipSync Unity VRM ハードウェア篇 モーションキャプチャー(フルトラ) HTC Vive トラッカー Azure Kinect DK HTC Vive / Vive Pro Perception Neuron / Neuron Pro ハンドトラッキング(手のモーションキャプチャ) データグローブ 画像解析 ソフトウェア篇 Windows スタンドアロン Hi5 グローブを2台以上同時に使う Noitom 社製の Hi5 グローブで収録されたモーションキャプチャーデータを、ネットワーク経由(UDP)で別のマシンにリアルタイムでストリーミングするソフトウェアです。 【YouTube】Hi5 グローブ ― キャプチャーデータのストリーミング用ソフトウェア SteamVR・HTC Vive のトラッキング品質の改善 リップシンク OVR LipSync 複数のマイクをつないでキャラごとにリップシンク(その2) 複数のマイクをつないでキャラごとにリップシンク OVR Lipsync 更新(2019-04-23日版) Unity Unity の Transform のパフォーマンス最適化まとめ Unity 2019.1 vs 2018.3 比較 【Unity】 キャラクターのポーズ編集用エディター拡張 【YouTube】Unity ポーズエディター チュートリアル VRM VRM データをもっと Unity らしく作る ハードウェア篇 テストや組み込み。 モーションキャプチャー(フルトラ) SteamVR・HTC Vive のトラッキング品質の改善 HTC Vive トラッカー Vive トラッカーのトラブルと対処方法 Azure Kinect DK Azure Kinect DK と HoloLens 2 気になったところ HTC Vive / Vive Pro HTC Vive Pro(Base Station 2.0)に切り替え Perception Neuron / Neuron Pro Neuron 用身体測定マニュアル 演者さんに送付する、Perception Neuron / Neuron Pro 用の身体測定マニュアルの PDF。 Neuron Pro の導入・テスト ハンドトラッキング(手のモーションキャプチャ) データグローブ Hi5 グローブを2台以上同時に使う Noitom 社製の Hi5 グローブで収録されたモーションキャプチャーデータを、ネットワーク経由(UDP)で別のマシンにリアルタイムでストリーミングするソフトウェアです。 【YouTube】Hi5 グローブ ― キャプチャーデータのストリーミング用ソフトウェア Hi5 グローブのセットアップから Unity への組み込みまで 画像解析 Leap Motion のセットアップから Unity への組み込みまで Azure Kinect DK と HoloLens 2 気になったところ

読む
複数のマイクをつないでキャラごとにリップシンク(その2) Qiita

複数のマイクをつないでキャラごとにリップシンク(その2)

はじめに キャラごとにショートカットキーを設定して、キーを押しているときだけ対応したキャラがリップシンクする、という仮組はしてあるけど、操作が辛いし一人がベタ付きはコスト掛かりすぎ。 なので、複数マイクを使ってそれぞれのキャラに一つマイクを割り当てて口パクをさせよう、というお話。 はじめに 動作結果 準備と確認すべきところ Windows の録音デバイス オーディオ機器選定 Unity の AudioSource アプリのフォーカスが外れたとき マイク再割り当て後の音ズレ MicrophoneSelector こちらもどうぞ 動作結果 まずは動作結果。基本的には想定したとおりに動く。 下手側のキャラは日本語、上手側のキャラは英語のボイスに合わせてリップシンク。 Unity で複数マイクを使っての OVR LipSyncオーディオインターフェイスが無いから2体でしか試せない。Babyface Pro とか買ったはいいけど持てあましてる人とかいねーかな pic.twitter.com/7lAa8JZsSE— サトー (@sator_imaging) 2019年6月14日 -- 自宅にオーディオインターフェイスが無いので、3体以上のキャラで試せてないのがちょっと不安。 2体の時とはまた別の罠がありそうではある。 準備と確認すべきところ 音周りは Windows、Unity 共に、これといった理由の無いおまじない要素が多め。運任せのけせらせら。 基本的に、以下については再起動するたびに確認した方が良い。 Windows の録音デバイス Windows のサウンド設定で録音デバイスを表示して、複数のデバイスのレベルメーターがそれぞれ個別に振れている状態にする。 オーディオインターフェイスのメーターが仮に振れてたとしても、サウンド設定のダイアログでメーターが振れない限りは Unity で音が拾えない。 必ず Windows のレベルメーターを見て確認する。 -- オーディオインターフェイスの仕様的には動くはずなのに、なぜか挿しても動かない、とか普通にあるので、Windows を再起動したりプラグを挿すタイミングを変えてみたりする。 挿してもレベルメーターが表示されない、レベルメーターは表示されても振れない(音が来ない)とかもあるのでちゃんと確認する。 とにかく色々と試す。運要素強め。 サウンド設定をクリアしない限り、Unity では何やってもダメ。 ※ 録音デバイスはマシンを再起動するたびに確認する。 オーディオ機器選定 MOTU MicroBook II(旧型?)だとここで躓く。インターフェイス側では個別にメーターが振れていても、Windows 側ではミックスされた状態のメーターしか振れていないなら、Unity では個別に音が取れない。 口パクさせるための音声なので、音質にはそこまでこだわらず、ノイズが乗らず複数の入力をミックスされていない状態で拾えるインターフェイスを選ぶ。 Unity の AudioSource Windows のサウンド設定で、【既定のデバイス】として設定されているデバイスは、MicrophoneSelector(後述)を使わない方が安定する。Unity が自動的に AudioSource に設定するのに任せる。 【既定のデバイス】じゃ無いやつには、MicrophoneSelector コンポーネントを付ける。 アプリのフォーカスが外れたとき エディター実行時、最初は動いてるけど Game View から一度でもフォーカスが外れると【既定のデバイス】以外の入力は音が拾えなくなる。 MicrophoneSelector を使っている OVR LipSync は、フォーカスが戻った時に AudioSource に再度マイクの設定をし直す必要がある。 MonoBehaviour.OnApplicationFocus(bool) あたりで設定すれば、多分オッケー。(まだ試してない) Unity - Scripting API: MonoBehaviour.OnApplicationFocus(bool) マイク再割り当て後の音ズレ GameObject のオンオフで AudioSource のマイク割り当て直しを試した感じ、再割り当て後に音がズレまくったのがちょっと不安。 やり方が悪いのか、既定以外のデバイスではそれが限界なのかが分からず。 -- 【既定のデバイス】に設定されていて Unity が自動で設定した AudioSource は、フォーカスが外れた後もマイクの再割り当て無しに継続して動作する(してしまう)ので、他のデバイスと動作をそろえる為にも、ステレオミキサーあたりを既定にしておいた方がいいかも。 MicrophoneSelector AudioSource に任意の入力デバイスを割り当て。以下より。 複数のマイクをつないでキャラごとにリップシンク - Qiita -- こちらもどうぞ #VTuber関連まとめ - Qiita

読む

良く読まれている技術ブログ記事

すべて Qiita一覧