Raspberlyのブログ

Raspberlyのブログ

Unityネタをメインとした技術系ブログです。にゃんこ大戦争や日常なども。そろそろブログタイトル決めたい

【勉強会レポ】: Roppongi.unity #4

勉強会のレポート(メモ)です。
参加したのはこちら、「Roppongi.unity #4」
会場提供はDMM.comさんです。

roppongiunity.connpass.comハッシュタグ#roppongiunity

 

f:id:Raspberly:20190827074300j:plain

 

動画はこちら、所々音がプツプツするので注意


Roppongi.unity #4

 

 

 

 

 

 

 

 

 

LT1. 異次元美少女と心を通わせる冴えたやり方

画面の中にいきたいという野心がありました。
そこで見つけたのがLookingGlass。
こちらをつかって令和版伺かを作りました。

令和の伺かを支える技術

VeryAnimation

すごい便利なアセットです。Unity内だけでアニメーションが作れるアセット。

Looking Glass

3Dディスプレイ

Embedded Browser

Unity×Browserを実現するアセット
Webの情報を使ったりいろいろなAPIをつかうことができる

ワークフロー

・VRoid Studioでキャラ作成
・VeryAnimationでアニメーション作成
・LookingGlassで表示
・EmbbededBrowser+Nuxtでコンテンツ制作

今後やること

・対話エンジンとの接続
・ブラウザ内のレイアウトの調整

伺か令和版よろしくお願いします。

 

 

 

 

 

 

 

 

LT2. プロポーズはVRとともに。

さっきとは違い三次元の話

斬新なプロポーズをしたいためVRを選択しました。
使うデバイスはOculusQuestです

どうやって使うのか

ミニゲームで楽しませます。
クリア時にサプライズでプロポーズにつなげるようにしました。
場所はレストランの個室を確保しました。

 

 

素材はアセットストアのものを使いましたが、そのままだとカックカクのため最適化をする必要がありました。

 

主な最適化

・ポリゴンを減らす
・SetPass callを減らす
・オクルージョンカリングを使う

 

ポリゴンを減らす

Mesh Simplifyアセットを使い削減しました

LODも設定


SetPass callを減らす

MeshBakerでまとめる

オクルージョンカリング

カリング時の処理の方が重かったため、今回は使いませんでした。

LWRPに設定

BuiltInからLWRPに変更、ライトマップも低解像度でベイク

まとめ

チューニングには気を付けましょう
VRを使えばプロポーズの成功率が上がる

 

 

 

 

 

 

 

 

LT3. AROWを使って地図ゲームを作ってみた。

AROWを支える技術についてお話します。

AROWとは

位置情報とリアルマップを使ったアプリやゲームを、低価格短期間で作ることができるUnity用SDKです。

サンプルゲーム作ってみた

アニマルランランド。
これにはグリッドとオブジェクトの重要度で描画を切り替えることができる、
オクルージョンカリングに近い最適化システムがあります。

github.com

新規開発

POIを使ってプレハブを生成を行う機能を開発しています。
これにより現実世界に基づいたマップゲームを作ることができます。
さらにPOIに近づいた時の検出も行います。

宣伝

現在オープンテスト中です
興味のある方はぜひ試してみてください。

 

 興味のあるかたはこちらも併せてどうぞ。

raspberly.hateblo.jp

 

 

 

 

 

 

LT4. CircleCI,TravisCIでAndroid,iOSアプリのビルドを自動化

 

展開が早く、情報量が多いので動画をご覧ください。

 

 

 

 


LT5. エモいピッチ変換

エモくならないようにしないためのノウハウについて

ピッチって何

音程のこと、心理的な値です。

音律

音と音の相対的な高い。
覚えてほしい音律は平均律、これはオクターブを基準に12音を等間隔に分割したもの。
早送りや巻き戻しでピッチが変わることに気を付けましょう。

Unityでのピッチ変換

UnityではAudioSourceのピッチをいじるだけでピッチが変わります。
ランダムピッチでは本当にピッチをランダムにしてもいいのでしょうか?
実は2音以上鳴らす時不協和音になりやすい。

 

そのため、あらかじめ使う音は定義しておく必要があります。
ランダムで使う場合はその中から抽選して使いましょう。

まとめ

ピッチ変換をうまく使うと1つの音で複数の音を作ることができます
ただしピッチ変換は時間軸もいじることに注意

宣伝

こちらの本をよろしくお願いします。本日発売です。

Unityサウンド エキスパート養成講座

Unityサウンド エキスパート養成講座

 

 

 

 

 

 

 

 

LT6. Zenject Example 〜さよならManager〜

ZenjectでManagerを滅ぼす話をします。

MastarDataManager

どこのご家庭でもManagerクラスはあると思いますが、
このManagerの立ち位置を考えてみましょう。

・複数のデータクラスを保持しているから
・全てユニークなインスタンスなのでシングルトンに持たせた方が楽だから
・シングルトンならどこからでもアクセスできるから

つまりこれらを解決できるのであればManagerは必要なくなります

なぜシングルトンなのか

シングルトンをZenjectで差し替える、Bindするようにしましょう。

なぜMonoBehaviourなのか

Startで初期化したい、それならIInitializableを実装しましょう。
裏側で動いてくれるようになります。

まとめ

Zenjectを使えばただインスタンスをまとめただけのクラスは不要になります。
Managerの役割を見直しましょう。

宣伝

Zenject本を書いています。

 

 

 

 

 

 


LT7. 本当は簡単に実装できるリアルタイム通信(WebSocket)実装講座(デモつき)

Websocketが簡単にできるというお話
Webscoketはどんなゲームでも使われる双方向通信を行う仕組みです。

どう実装するか

ミドルウェアを使ってもいいが、お高いし学習コストも高い
そこでサンプルプロジェクトを用意してきました。

github.com

ここでデモ 動画をご覧ください

運用時において考えておくこと

スケールアウト、ネットワークの寸断再接続など考えておくことはいくつかあります。

また、VR/ARでのマルチプレイやゲーム実況でのリアルタイムコミュニケーションの需要がどんどんでてくると思います。

 

 

 

 

 

 


LT8. Parameter Dance

イベント用に作ったVRVJ用コンテンツについてお話します。
OculusRiftを使ったVJです。動きなどを取得しシェーダー側で絵をつけていきます。

なぜ作ろうとおもったのか

もうちょっと身体性を使ってなにかやりかたったため。
手首の動きなど細かい小さな動きを取りたかったためOculusを使いました

カメラ設定

VRとは別にプロジェクタに投影するためのカメラが必要でした。
急激な動きの取得や値の変化などはUniRxを使うことで簡単に取れました。

知見

神楽鈴や独鈷所を持ってTouchを使う場合は、中指で持つようにすると安定します。

 

 

 

 

 

 

懇親会

f:id:Raspberly:20190827073721j:plain

f:id:Raspberly:20190827073741j:plain

 

 

書籍の宣伝をするichijoさん

f:id:Raspberly:20190827074844j:plain

実は今日発売、ご家庭に職場に一冊どうぞ。

Unityサウンド エキスパート養成講座

Unityサウンド エキスパート養成講座

 

 

 

 

謎の装置にテンションの上がる大人達

f:id:Raspberly:20190827075017j:plain

 

 

 

「もいちゃんといっしょ!」という癒し系ゲームを体験させていただきました。

なでなでしてあげたり、おやつを上げたりすると喜びます。
耳を澄ますと実はしゃべっている!?

f:id:Raspberly:20190827075255j:plain




 

 

 

 

告知

VRM勉強会

明日やります。LT枠が少し空いているのでよろしければどうぞ。
一般枠も空いております。

vrm.connpass.com

Unite Tokyo 2019 EVE2

Uniteの前々前夜祭です。一般参加者枠は既に埋まっていますが増枠の可能性があります。
もし時間が空いていましたら参加登録よろしくお願いします。

connpass.com

 

 

 

 

 

 

タイムライン

 

 

 

 

 

 

VeryAnimationが紹介されていましたが、こちら本当にすごいアセットです。
予備知識一切なしの状態から初めても20分ほどでこんなアニメーションが作れちゃいます。

f:id:Raspberly:20190827080601g:plain

 

使い方はこちらをどうぞ

www.asset-sale.net

50%Offセールもよくやっていますよ。

 

 

 

 

 間違っている箇所、消してほしいツイートがありましたらコメントにお願いします。

【1周年】ブログを開設してから1年経ちました【記念】

 
 
🎉2019年8月22日をもちまして、このブログは1周年を迎えました🎉

今回は開設1周年を記念しまして、今までの振り返りをしてみます。

 

 

 

ブログを始めたきっかけ

ブログでアウトプットを始めようとしたきっかけについて

 

勉強会でのインプット

学生時代にコロプラさんのインターンや採用説明会に参加していまして、
講師の方がアウトプットの重要性を説いていました。
アウトプットという単語を聞いたのがこれが最初だったと思います。

 

「アウトプットは自分の成長につながるけど難しそうだなぁ」
といった印象でした。

colopl.connpass.com

peatix.com

 

 

昔からいろいろな勉強会に参加し、インプットはそこそこしていました。
この頃から勉強会のメモ程度は書いてましたが、公開したりなどアウトプットはしていませんでした。

techsalon.connpass.com

techsalon.connpass.com

atnd.org

 

 

はてなブログ開設

そんな時アウトプットを始めるきっかけがありました、
それは去年2018年にあったUnity アセット真夏のアドベントカレンダー 2018 Summer! です。

 

この時はてなブログを開設し、初めて技術記事を投稿しました。

raspberly.hateblo.jp

記事を書くに当たって、Qiitaはてなブログ、どちらで書こうか迷いましたが、
最終的にはてなブログを選択しました。

理由としては技術系以外の雑記なども書けますし、テラシュールブログさんやコガネブログさん、
ひよこのたまごさんなどよく見る方々が使っていたのが大きいです。

 

 

 

勉強会のまとめ

 しかし、アドカレ以降特に書きたい事もなく、Twitterでネタを見つけて書いたり、

raspberly.hateblo.jp

raspberly.hateblo.jp

 

読んだ本のまとめを書いたりしていました。

raspberly.hateblo.jp

こちらは完全に止まっている

 

 

いろいろと迷走している時にサポーターズさんの、エンジニアブログに関する勉強会に参加し、
アウトプットの利点や工夫ポイントを学びました。

supporterzcolab.com

 

 
それ以降、勉強会レポを書き始めるようになり、1年間で60以上の勉強会レポを書いています
(1月あたり5つの勉強会レポを書いている計算に)


初めて書いた勉強会レポはTechXGameCollege椿さんによるUnityアニメーションの勉強会です。

raspberly.hateblo.jp

勉強会のまとめを書くことは、学んだことの整理にもなりますし後で振り返ることもできます。
何よりも、自分だけが見るものではなく他の人も見るものなので、
見た目や文章構成に気を遣うようになり、きれいにまとめることができました。

 

 

そして、勉強会レポなどをいろいろ書いていった結果、4月に10000アクセスを達成しました。

この時点でセルフブランディングとしては大成功ではないでしょうか。
1年間での合計アクセス数は27236でした。

 

 

 

 

 

1年間の振り返り

ブログも含めアウトプットに力をいれた年だったと思います。

 

技術系記事の投稿

今年の5月にOculus Questを興味本位で購入しました。
VR開発は昔していましたが、DK2以来久々(CV1はちょっとだけ)ということもあり、
うまくいった所を自分なりにまとめて入門的な内容で開発記事を投稿しました。

raspberly.hateblo.jp

これが結構好評でして、以降OculusQuest開発をシリーズ化しました。

【Oculus Quest開発メモ】離れた場所にある物を掴む Distance Grabber & Grabbable編【Unity】 - Raspberlyのブログ

【Oculus Quest開発メモ】VR空間内を歩き回る OVR PlayerController編 【Unity】 - Raspberlyのブログ

【Oculus Touch開発メモ】手の見た目をカスタマイズする 付属シェーダー編【Unity】 - Raspberlyのブログ

【Oculus Quest開発メモ】Questでもポストプロセスを使いたい! Fast Mobile Post Processing編【Unityアセット紹介】 - Raspberlyのブログ

 

シリーズ化すると、固定の読者が増えやすく、執筆時のモチベーションもかなり保てます。

 

勉強会レポ

このブログは1年間で93記事書いてきましたが、その内の61記事が勉強会/イベントレポです。
改めて振り返るととんでもない数です。
私は感想文などがとても苦手なため勉強会の内容や要点をまとめることをメインでレポを書いています。

f:id:Raspberly:20190823235244p:plain



 

 

Gotanda.unity

11月にはGotanda.unity #9で🎉 人生初のLT登壇🎉 をしました。

raspberly.hateblo.jp

 

Gotanda.unity#7から参加していましたが、#8の懇親会でフツフツと登壇したい欲が出ていました。

最初はかなり不安でしたがGotanda.unityの雰囲気がよく、とても楽しくLTさせていただきました。
また、この登壇をきっかけに多くの人とつながれました。

 

同じくGotanda.unity#12でも登壇いたしました。

raspberly.hateblo.jp

 

思えばUniteTokyo2019のUnity Roomコーナーの前でとと様と出会ったのが大きな転機だったのかも!

 

 

 

最後にいいたいこと

アウトプットの敷居

アウトプットをしたことない人にとって、最初の敷居はたしかに高いと思います。
私も最初躊躇しました。
「こんな内容でアウトプットしていいのかな」
「この内容なんか間違ってるかも」
「他の人がもっとわかりやすく解説してる」・・・

 

間違っていたら訂正すればいいですし、かぶりなど気にせず気軽に投稿してみるといいです。
勉強会の感想ツイートも立派なアウトプットです!

 

本格的な記事を書き始めるとっかかりとしてはアドベントカレンダーがオススメです。
特にUnityは毎年やっていますので、ぜひ参加してみてください。

qiita.com

こちらもオススメ

コミュニティを通して学んだ、ブログの書き方整理 - らんてく!(Lanchester Tech Blog)

 

 

Gotanda.unityは神

LT登壇するのはとても楽しいので、まだの方はぜひやってみましょう!

正直とと様と出会わなかったら今の私はいなかったと思う。

 

 

 

勉強会コミュニティへの感謝

勉強会ブログをいろいろ書いてきましたが、これは勉強会を開催してくれた運営様、
勉強会を支えて応援してくれる参加者様がいて初めて成り立ちます。

いろいろ参加して感じた事は、勉強会の内容以上に参加者同士の交流の大切さです。
私も多くの方に助けられているので、自分から助ける側に回ったり、
よりコミュニティを盛り上げる一員になりたいです。

 

 

 

 

 

 

長々と書いてきましたが、このブログが1年続いたのは
読者様そして勉強会やUnity開発コミュニティ皆様のおかげです!
これからもどうぞよろしくお願い致します!

 

【アセット紹介】Weather Maker で天気を操作する【Unity】

これはUnity アセット真夏のアドベントカレンダー 2019 Summer!の22日目の記事です。

f:id:Raspberly:20190819100742p:plain

ハッシュタグ : #アセットアドカレ2019

 

今回はアセットの紹介をしていきます。
紹介するのはWeather Maker - Unity Weather System, Sky, Water, Volumetric Clouds and Light*1です。
天気など自然環境を構築できるアセットです。

 

こちらは去年の8月にありました、「アセットストアの購入金額に応じてアセットが無料でもらえるイベント」でいただいたものです。今まで積んでいた。
アセットストアで50ドル以上のお買い物をすると本アセットが無料で入手できました。

www.asset-sale.net

 

 

 

 

☀☂☁⚡☃⛅⛈☀☂☁⚡☃⛅⛈☀☂☁⚡☃⛅⛈

WeatherMakerはとても機能が多いため、今回は天気の操作をメインで取り上げます。

☀☂☁⚡☃⛅⛈☀☂☁⚡☃⛅⛈☀☂☁⚡☃⛅⛈

 

 

 

開発環境 

Unity2018.4

Weather Maker var5.8.2

Weather Makerはアップデート頻度が非常に多いアセットです。
使用するバージョンによって、やり方やUIが異なる場合があります。

 

 

必要条件

--------------------------------------------------
-Weather MakerにはUnity 2017.4以降が必要です。
-Weather Makerにはテクスチャ配列のサポートが必要です。
-Weather Makerは、gles 2.0、WebGLDirectX 9.0以前ではサポートされていません。Unityのバグが原因でWebGLのサポートが壊れています。私は彼らと協力して修正を支援しています。
-iOS / MACでは、OpenGLレンダリングを使用します。Metalには、3Dテクスチャルックアップなどの機能が壊れています。

 

.NET設定

Unity2019.1以降の場合、PlayerSettingsで.NET4.5または.NET standard 2.0を有効にします。

Rain Makerの削除

もしプロジェクト内に
Rain Maker(同パブリッシャーの類似アセット)がインポートされている場合は削除します。

ColorSpaceをLinerに

PlayerSettings->OtherSetting->ColorSpaceをLinerにします。
ガンマよりも見た目がよくなるそうです。

f:id:Raspberly:20190802150120p:plain

 

 

 

 

 

サンプルシーンの確認

アセットをインポートしたら、サンプルシーンを見てみましょう。豊富にそろえてあります。

f:id:Raspberly:20190819100936p:plain

UIがものすごくちっちゃいことに気をつけましょう。
画面サイズによっては潰れてしまってしまうこともあります。

f:id:Raspberly:20190819101051p:plain

こちらでは、実際に天気を変化させたり、昼夜を切り替えることができます。

デモシーン

 

 

初期セットアップ

まずは初期設定から、簡単に紹介します。
詳しくは付属のReadme.txtを見てください。

シーンの作成

デモシーンをそのままいじってもいいですが、今回は新しくシーンを作ります。
この時、他に何もオブジェクトがない状態だと少し寂しいので環境を整えましょう。 

Assets/WeatherMaker/Demo/DemoResourcesにあるSimpleTerrainをシーン内に加えます。

f:id:Raspberly:20190819111829p:plain

これはWeatherMakerのデモ用として用意されたTerrainです。

f:id:Raspberly:20190819113011p:plain

もちろん自分で用意した環境や、アセットを使っても問題ありません。

 

  

シーンにプレハブを配置(重要)

UnityEditorのWindow->Weather Maker -> Add Weather Maker to SceneWeatherMakerPrefabを配置します。

f:id:Raspberly:20190805105801p:plain

 

ちなみに、MainCameraのProjectionがOrthographic(2D)になってる場合は
自動的に2D用のWeatherMakerPrefabが配置されます。

f:id:Raspberly:20190805110003p:plain

手動で配置したい場合は、Assets/WeatherMaker/Prefab/WeatherMakerPrefabを配置します。
2Dの場合はWeatherMakerPrefab2Dを。

 

 

このWeatherMakerPrefabこそ、このアセットをコアであり簡単に空や天気をコントロールできるプレハブです。
パーティクルやサウンドなど必要なものはすでにセットアップされています。
後はこいつを使うだけです。

また。各種天気の状態やデータはProfile(ScriptableObjectみたいなやつ)で管理されています。(後述)
このプレハブは、それらProfileを参照したりパラメータを変更する機能がありますが、
このProfileは直接編集もできまし、自分好みのProfileを新しく作成することもできます。

右クリックからCreate/WeatherMakerで作成できます。

f:id:Raspberly:20190822092046p:plain

今すぐ使うわけではありませんが、Profileがあることを知っておきましょう。

 

 

DirectionalLightの削除

シーンに最初から含まれているライトは削除しておきましょう。
太陽にすでにライトがあります。

 f:id:Raspberly:20190802162714p:plain

LightingSettings

Window/Rendering/LightSetting/EnvironmentのSkybox MaterialとSun Sourceを変更します。

SkyboxにはWeatherMakerに含まれているSkybox用のマテリアルWeatherMakerSkyBoxMaterialを、
SunSourceにはシーン内に配置したWeatherMakerPrefab内にあるSunを追加する。

 

f:id:Raspberly:20190802164201p:plain

Environment LightingをGradientColorに変更

Environment ReflectionsをCustomに変更

f:id:Raspberly:20190802153025p:plain

 

 

 

MainCameraの編集

Cameraパラメータの設定

Clear FlagをSolidColor
Backgroundを全て0(真っ黒)
Far Planesを2000以上
Rendering PathをDeferred
Allow MSAAを無効化

f:id:Raspberly:20190821024239p:plain

Rendering PathはDeferredにした方がよりよく見えるようになるそうです。

Tagの設定

シーン内のMainCameraのTagがMainCameraになっていることを確認しましょう。
通常はデフォルトで大丈夫のはず。

f:id:Raspberly:20190802151515p:plain

 

PostProcessingの設定

必須ではありませんが、見栄えがよくなるため設定しておきます。
PackageManagerからインストールしておきましょう。

実はWeather MakerにはPostProcessingを簡単に自動設定する機能が用意されています。

Window/Weather Maker/Setup Post Processingで、シーン内にあるカメラにPost Processing Stackが自動で設定されます。

f:id:Raspberly:20190819103640p:plain

f:id:Raspberly:20190819104206p:plain

ProfileはWeatherMaker側でいい感じに作成してくれたものです。
ワンクリックですべて設定してくれるのはとても便利。

 

 

 

 

実際に動かしてみよう

 

WeatherMakerPrefabの中にはいろいろ入っています

f:id:Raspberly:20190805115220p:plain

この中の内、
・WeatherMakerPrefab
・AudioManager
・DayNightCycle
・LightManager
の4つは必ず有効化していなければいけません

他のPrefabで、使わないものであれば無効化することができますが、Prefabの削除はしないようにしましょう。

 

 

一日のサイクルを作る

日が沈んでまた昇る、そんなサイクルを作ることができます。

f:id:Raspberly:20190821223256p:plain

f:id:Raspberly:20190821223443p:plain

DayNightCycleにアタッチされているWeatherMakerDayNightCycleManagerのプロファイルを見てみましょう。

f:id:Raspberly:20190821223733p:plain

Time Of Dayがシーン内での時間になります。
ここの値を変えることで昼夜の変えることができます。

f:id:Raspberly:20190821225332g:plain
月は必要でないのなら無効化することができますが、太陽を無効化してはいけません

サイクルを停止したい場合はSpeedを0に設定すれば時間が経過しなくなります。

ちなみに光に指向性を持たせたり、緯度・経度・惑星軸まで調節できます。
夕日の色を変えたりなど、こだわりたい方はとことんこだわれる。

 

 

 

雲を作る

雲を作ってみましょう。
雲の状態はいくつかプリセットがあります。これを選ぶだけで簡単に状態をセットできます。 

f:id:Raspberly:20190821230231g:plain

雲はもちろんリアルタイムで変化します。

 

 

 

 

 

天気の操作

それでは実際に雨を降らせたり晴れさせたりしていきましょう。

WeatherMakerPrefabにあるPrecipitationが雨や雪を管理するオブジェクトです。

f:id:Raspberly:20190821123447p:plain

インスペクターを見てみましょう。

f:id:Raspberly:20190821130008p:plain

 

Precipitationが天気を設定する項目です。

Rain(雨)、Snow(雪)、Sleet(みぞれ)、Hail(雹)、Customと別れています。
Noneにすると晴れます。

f:id:Raspberly:20190821130213p:plain

Precipitation Intensityが天気の強度です。0~1まで設定でき、1が一番強い状態です。

Precipitation Change Durationは天気の推移を行う時間です。

Precipitation Change Delayは天気が変わる際に遅延させる時間です。

Precipitation Change Threadは天気が変わるしきい値です。

 

  

 

雨を降らす

WeatherMakerPrecipitationManagerのPrecipitationでRainを設定します。

f:id:Raspberly:20190821231651p:plain

この時、Precipitation Intensityが0だと天気が発生しないことに注意しましょう。
最大の強さで発生させたいのなら1にすべきです。

 

以下が雨を降らせている場面です。
非常にわかりづらいですがポツポツ降っているのが見えると思います。

f:id:Raspberly:20190822000916g:plain

 

デモでは以下のように確認できます

f:id:Raspberly:20190821181917g:plain
デモと比べると実際に降らせた時は雨が非常に弱く見えます。
ここを少し変えてみましょう。



雨をカスタマイズする

雨はパーティクルシステムでできています。
これはPrecipitation/Rainの子オブジェクトに配置されています。

f:id:Raspberly:20190821232711p:plain

パーティクルを直接編集してもいいですが、
親であるRainに便利なコンポーネントがアタッチされているのでそちらを使います。

f:id:Raspberly:20190821234557p:plain

画面に収まらないくらいのパラメータ数!実際は下にさらに続きます。
それぞれツールチップでパラメータの役割が表示されています。

 

雨を強くしたいので、適当に以下の値を最大値まで上げてみます。

f:id:Raspberly:20190822002428p:plain

 

 

先ほどと比べるとだいぶ雨っぽくなりました。ミストもいい味出しています。

f:id:Raspberly:20190822001541g:plain

できればもっと土砂降り感も出してみたいところ。

 

 

 

雪を降らせる

雪を降らせるのは雨同様とても簡単です。
PrecipitationをSnowに設定するだけ。

f:id:Raspberly:20190822005206p:plain

f:id:Raspberly:20190828083358g:plain

 雨同様、カスタマイズも可能です。

f:id:Raspberly:20190828083457g:plain



 

 

晴れさせる

雨が降ったので次は晴れにしてみます。今から晴れるよ。

f:id:Raspberly:20190822011146g:plain
Precipitation Intensityを0、またはPrecipitationをNoneにします。
雲がある場合は、上記の通りNoneに設定すると完全に晴れます。

 

 

 

 

 

まだまだ紹介しきれない機能

ウェザーゾーンなどもまとめようと思ったのですが、かなり大変そうだったので概要だけ紹介します。

ウェザーゾーン

特定の範囲内に入った時あらかじめ設定しておいた天気にランダムで変化させるシステムです。

ヌルゾーン

雨や霧などをレンダリングしたくない時に使う領域です。
これにより、洞窟や屋内では天気の影響を受けません。

ボリューメトリッククラウド&フォグ&ライト

立体感のある雲や霧、光を出すことができます。

オーロラ/ライトニング

オーロラや稲妻を出すことができます

海を作り出すことはもちろん、水中に入った時の表現もできます。 

Weather APIとの連携

現実世界の天気と連動させることができます。

 

 

 

まとめ

Weather Makerを使えば簡単に天気や空を作成することができます。
プレハブを配置して、パラメータを変えるだけ!


また冒頭の通り、このアセットは非常に多くの機能を持っています
ほとんどの自然環境を再現できる上にかなり細かいカスタマイズができます。
更新頻度も短く、頻繁にバージョンアップもされています。

 

今回で全て解説するのは困難でしたので、HUD Navigation Systemと同様複数回に分けて解説記事を投稿する予定です。

 

 

雪のオーバーレイに関する記事を追加しました。

raspberly.hateblo.jp

 

 

 

 

 

参考文献

https://demo.digitalruby.com/WeatherMaker/Readme.txt

チュートリアルビデオ
--------------------------------------------------
最新のWeather Makerビデオ...

-Open Weather Map APIhttps://youtu.be/7_r7oibCM68
-uMMORPG / Mirrorチュートリアルhttps://youtu.be/BIFQqmG2Gws
-体積雲:
	-美しい空のセットアップ:https://youtu.be/1Xk2z858T1U
	-完全な概要(40分以上):https://youtu.be/ZoULn0mYbt8
	-レイマーチの最適化:https://youtu.be/Dwk4vF_6ogs
	-クラウドノイズエディター:https://youtu.be/NxuJ5H2mZwY
	-オーロラ/オーロラ:https://youtu.be/J9QSebVLEO8
-時間的再投影:https://youtu.be/JCzE7JfFPU8
-パフォーマンスプロファイル:https://youtu.be/-Yoj_OjJL4g
-完全なセットアップガイド:https://youtu.be/DHNnS6f85rM
-クイックスタートガイド:https://youtu.be/5IACGZULiDw
-新しいプレハブの概要:https://youtu.be/hWJF5v0s4gc
-天気ゾーン:https://youtu.be/11QoMD_qhHw
-ヌルゾーン:https://youtu.be/ZPBum2YcgB8

 

 

 

類似アセット

アセットストアには天気にまつわるアセットがたくさんあります。

 

aria1.amebaownd.com

bibinbaleo.hatenablog.com

www.asset-sale.net

www.asset-sale.net

Enviroは頻繁にセールも行われているアセットですし、UniStormはかなり昔からある人気アセットです。
是非お気に入りの天気アセットを見つけてみてください。

 

 

 

 

 

余談

ウェザーには「天気」「天候」「気象」などいろいろ意味がありますがこれらは何が違うのでしょうか?
実は以下のように分けられます。

気象
大気の状態・変化を物理現象として捉えた言葉

天気
数時間から数日間の気象状態

天候
1週間から1ヶ月程度の気象状態

気候
1ヶ月以上の長期的な気象状態

 

天気、天候、気象は表す期間によって名前が異なります
天気や天候など短期間の状態をひっくるめて気象というそうです。

「天気」「天候」「気候」「気象」 - 違いがわかる事典

 

 他間違っている箇所がありましたらコメントにお願いします。

*1:名前が長いので記事内では「Weather Maker」と表記します

【Oculus Quest開発メモ】Questでもポストプロセスを使いたい! Fast Mobile Post Processing編【Unityアセット紹介】

 

今回はOculus Questの開発ネタをやっていきます。
内容的にはOculus Rift Sなどにもそのまま応用できるかと思います。

 

 

OculusQuestでもポストプロセスを使いたい!
そんな時に役に立つアセットFast Mobile Post Processing(有料)について紹介します。

f:id:Raspberly:20190816233232p:plain

 

この記事はUnityゆるふわサマーアドベントカレンダー2019 16日目の記事です。

qiita.com

#ゆるふわアドカレ

 

 

 

UnityではPost ProcessingStackを使う事でポストプロセスを簡単につけることができます
しかしこれは非常に重くモバイルには不向きです。(そもそもVRではPostProcessingはあまり推薦されていない)
そこで今回はアセットの力を借りてポストプロセスをかけてみます。

 

 

 

 

 

 

 

開発環境

Windows 10

Unity 2018.4.5f

Oculus Integration ver1.39

Oculus Quest

 

 

 

 

アセットストア

アセットストアでは様々なポストプロセスパッケージがあります。
ジャンル的にはShaders Fullscreen & Camera Effectsです。

VR対応を明記していなくともMobile向けであれば動くようです。(要確認)

Fast Mobile Post Processing: Color Correction(LUT), Blur, Bloom

モバイル向けに特化したPostProcessingで、LUT(色補正)、BLUR、BLOOMの3つが入ったセットです。
特にBLURに関してはアセットストア最速を謳っています。

f:id:Raspberly:20190723111326p:plain

【最終更新日】 2019年6月11日
【サポートバージョン】Unity2017.1.0~

こちらのアセットは期間限定で無料ダウンロードすることができました。
もし入手できている方はラッキーです。

www.asset-sale.net

 
正式名称が長いので以下「Fast Mobile Post Processing」と表記。

 

同パブリッシャーさんのアセット

アセットの作者であるRufat Ismaylovさんですが、他にも複数のアセットをリリースされています。
どれもモバイル向けのものです。

 

 

 

 

 

Sleek Render(配信終了)

Standalone VR Meetup #2にて、ごんびぃー@GONBEEE_projectさんの発表にありました、
モバイル向けのポストプロセス、Sleek Renderも選択肢に入ってきます。

 

これはモバイルでも動く高速なPostProcessingStackです。
2017年11月にリリースされ、リリース初期は無料でダウンロードできました。

www.asset-sale.net

 

しかし2019年7月にて配信が終了しました。
これに関してはUnityForumでアセット作者の方が説明しています。

配信終了理由

要約するとアセットストアの収入だけでは生活が厳しく、これ以上更新し続けることができなくなったため。

たとえ更新できなくとも販売し続けることはできますが、カスタマーサポートの観点では大きな欠点になるため。

SleekRenderの入手方法

購入済みの方は、いつでもAssetStoreメニューからダウンロードすることができます。(AssetStoreの機能)

購入していないが興味のある方向けに、MITライセンスでGitHubに置くことを検討しているそうです。
ただし最近購入した方の金銭的努力を損なうので、2020年1月まではないとのこと。

既に購入済みの方はメールからサポートを受けることができます。
こちらもごんびぃー@GONBEEE_projectさんが解説記事を出しています。
詳しい使い方は下のリンクからどうぞ。

qiita.com

 

 

モバイル向けで複数のポストプロセスが入ったものですとこのあたりでしょうか。
SleekRenderは現在入手不可ですので、今回はFast Modile Post Processingを使っていきます。

 

 

 

 

 

シーンの用意

今回も毎度おなじみ、AvatarGrabシーンを使っていきます。
Assets/SampleFramework/Usage/AvatarGrabにあります。

f:id:Raspberly:20190816190502p:plain

 

光るオブジェクトの用意

Bloomなどが効いているか確認するため、光を放つオブジェクトを作っておきます。
これはまあなんでもいいです。

f:id:Raspberly:20190816183936p:plain

raspberly.hateblo.jp

 

 

 

Fast Mobile Post Processing

基本的に付属のスクリプトをカメラに張り付けるだけで動作します。

f:id:Raspberly:20190815231338p:plain

 

インスペクターパラメーター

Shader

PostProcessingシェーダーを設定するだけ

Blur

ぼかしを有効にするかどうか

Iterations

ReadMeによると「不鮮明な繰り返しの数。より多くの反復、より多くの操作を必要とするシーンをよりぼやけさせる」とのこと
???
値が大きいほど負荷がかかるので注意、値は2のままにしたほうがいいらしい。

BlurAmout

ぼかしのレベル

f:id:Raspberly:20190816092417g:plain

BloomAmout

Bloomの量

f:id:Raspberly:20190816092441g:plain

BloomThreshold

ブルームをかけるしきい値

f:id:Raspberly:20190816092506g:plain

FilterWidht & FilterHeight

適用されるぼかし画像の幅

LUT

色補正を有効にするかどうか

LutAmout

Lutの量

f:id:Raspberly:20190816092603g:plain

SourceLut

色補正のプリセットは複数あります。

f:id:Raspberly:20190816093010g:plain

 

使い方

Cameraにスクリプトを追加する

MobilePostProcessingまたはMobilePostProcessingSingletonをCameraにアタッチします。
ちなみにCameraとはCenterEyeAnchorのことです。

f:id:Raspberly:20190815231338p:plain

 

Shaderを設定

ShaderにはSupGames/Mobile/PostProcessを設定します

f:id:Raspberly:20190815232254p:plain

LUTテクスチャの設定

Source LutにLUTテクスチャを設定します。

f:id:Raspberly:20190815233355p:plain

LUTテクスチャは以下の通りです。

f:id:Raspberly:20190815233455p:plain

Maskテクスチャの設定

ReadMeによるとBlurMask.pngまたはhumanEye.pngを設定するとのことですが、
BlurMaskが見当たらないのでhumanEyeを使います。

f:id:Raspberly:20190815234551p:plain

 

LUTとBlurチェックボックスでオンオフ切り替えることもできます。
もちろん両方同時に適用可能。

 

実機で動かしてみる

Androidビルドをして実機で動かしてみましょう。
設定は上記の通りです。

f:id:Raspberly:20190816184010g:plain

無事動きました。が何か違う気がする。
デフォルトのパラメータ設定ですとBlurが強すぎるのかもしれません。

 

このあたりを少し調整してみます。
LUTとBlorをオフにしてBloomのみ使ってみます。

ここで注意点

BlurとLUT両方のチェックボックスをオフにするとPostProcessingが動作しません。
片方は必ずチェックしておく必要があります

Blurの場合ですとBlurAmoutを0に、FilterWidthとFilterHeightを1にするとBlurが実質機能しなくなるのでこれで乗り切ります。

f:id:Raspberly:20190816184404p:plain

 

大分見やすくなりブルームが効いているのがわかります。
右手を握ることでオンオフ切り替えるようにしてみました

f:id:Raspberly:20190816131547g:plain

ただ、なんかこう・・・光がにじみ出る感じが少ないですね。

どちらかというとDirectionalLightをもう一つ追加しているかのような見た目。
モバイル向けなのでこのあたりは割り切りかもしれません。

 

 

 

 

PostProcessingStack v2

そもそもUnity標準のPostProcessingStackはどのくらい重いのでしょうか。

去年あたりからアンチエイリアシング、ブルーム、色収差など一部のエフェクトにはFastModeが用意されています。
これはクオリティを落とすことでパフォーマンスをブーストするモバイル向けの機能です。

これを使って実際にQuestで動かしてみましょう。

使用するエフェクトはアンチエイリアシングとブルームです。

f:id:Raspberly:20190816120414p:plain

f:id:Raspberly:20190816184230p:plain

 

 

あれ?意外と良い。
少しカクついているような気がしなくもないですが、全く動かないというわけではなさそう。
光がにじみ出ている感じがとてもいい。

f:id:Raspberly:20190816131724g:plain

 

 

 

 

プロファイラー

パフォーマンスはどうでしょうか、プロファイラーを見てみましょう。
大体の目安としてどうぞ。

Fast Mobile Post Processing

f:id:Raspberly:20190816131505g:plain

PostProcessingStack v2

f:id:Raspberly:20190816131419g:plain

 

ちなみにFast Mobile Post Processingのオンオフ時の違いはこんな感じ

f:id:Raspberly:20190816125306p:plain

 

FastModeとはいえPostProcessingStackの処理は重い様子。
その分とてもきれいですのでここはケースバイケース。

 

 

 

 

 

まとめ

Fast Mobile Post Processingならとても軽量なポストプロセスをかけることができる
PostProcessingStackなら高品質だが処理はそこそこ重い、ただし全く動かないというわけでもない

 

ごんびぃーさんの記事を見る限り、SleekRenderの方がとてもきれいで使いやすそうではあります。
持っている方はSleekRenderの方を試してみるといいかもしれません。

qiita.com

 

 

 

 

参考文献

baba-s.hatenablog.com

 

PostFX v2 – アップグレードされたポストプロセッシングスタックで美しいビジュアルを実現しよう – Unity Blog

Create high-quality visuals in Unity with the Post-Processing Stack - Unity

Unity's post-processing image effects stack - Unity

Best Practices for Rift and Android

 

 

 

 

他間違っている箇所がありましたらコメントにお願いします。

【Oculus Touch開発メモ】手の見た目をカスタマイズする 付属シェーダー編【Unity】

 

今回はOculus Touchの開発ネタをやっていきます。
使う機材はOculus Questですが、Oculus Rift Sでもそのまま使うことができると思います。

 

OVR GrabberDistanceGrabberでも登場した手について。
デフォルトですとマスターハンドよろしく普通の白い手になりますが、
見た目をいろいろカスタマイズしていきます。

f:id:Raspberly:20190809230058p:plain



 

 

 

開発環境

Windows 10

Unity 2018.4.5f

Oculus Integration ver1.39

Oculus Quest

ALVR

 

 

 

 

セットアップ

始めてVR開発をする方はこちらを参考にしてみてください

raspberly.hateblo.jp

 

また流れ的には前回の続きとなります。前回はこちら!

raspberly.hateblo.jp

 

 

 

 

 

 

 

 

サンプルシーンの確認

Assets/SampleFramework/Usageに様々なサンプルシーンがあります。
学習や挙動の確認にとても有益です。見てみましょう。

手を表示するシーンはたくさんありますが、前回と同じAvatarGrabシーンを使っていきます。
手が単体で置いてあるCustomHandsシーンでも問題ありません。

f:id:Raspberly:20190809102327p:plain



前回のメモでも登場した手のモデルですが、
モデル内にSkinnedMeshRendererがアタッチされているオブジェクトがあります。

左手の場合。l_hand_skeletal_lowers/hands:hands_geom/hands:Lhandがこれに該当します。

f:id:Raspberly:20190809211044p:plain



注目すべきはMaterialsです。ここのMaterialを変えるだけで手の見た目を変えることができます。

f:id:Raspberly:20190809105526p:plain

 

 

 

 

 

 

手用に用意されたシェーダー

OculusIntegrationには手用のシェーダーが既に用意されています。
2つあるのでそちらを見ていきましょう。

Oculus/Hands_DiffuseBump

f:id:Raspberly:20190809134022p:plain

Shininess

光沢感、この値が大きいほど手が輝いているように見えます

f:id:Raspberly:20190809223105g:plain

ShineColor

光沢の色

f:id:Raspberly:20190809223152g:plain



 

 

 

 

 

Oculus/Hands_Transparent

透過対応シェーダーです。Rimの値を変えることで手のアウトラインを強調することができます。

f:id:Raspberly:20190809112125p:plain

InnerColor

手のベース色

f:id:Raspberly:20190809223238g:plain

RimColor

手の縁であるアウトラインの色

f:id:Raspberly:20190809223311g:plain

RimPower

アウトラインの強さ。値が小さいほどはっきり表れる。

f:id:Raspberly:20190809223347g:plain



 

 

 

実際に手の見た目を変えてみる

適当な場所にマテリアルを作成します。
今回はHand_Matとという名前で作成しました

f:id:Raspberly:20190809210013p:plain

 

作成したマテリアルを手のSkinnedMeshRendererのMaterialsに設定します。

f:id:Raspberly:20190809230524p:plain

 

次にシェーダーを変更します。
Oculus/Hands_Transparent

f:id:Raspberly:20190809225007p:plain



最後にマテリアルのパラメータを調整するだけ
私の場合はInnerColorをグレー色に、RimColorを青くしました。
RimPowerを最低値にしてRimが目立つようにします。

f:id:Raspberly:20190809230654p:plain



実行してみるとこんな感じ、なんだがゴースト感が出てますね。

f:id:Raspberly:20190809223728g:plain

 

 

 

 

 

他のシェーダー

実は他にもシェーダーはいろいろあります。
手に応用できるものですと、AvatarSurfaceShader系でしょうか。

f:id:Raspberly:20190809170511p:plain

詳しくはこちら

Gray Avatar Hands instead of Transparent Blue? — Oculus

 

 

 

 

 

 

 

 

リアルな手にする

LeapMotion用のハンドモデルを使ったやり方があります。
詳しくはこちらをどうぞ。

zabaglione.info

 

 

こちらのアセットを使います

ダウンロード時に互換性の警告が出ますが関係ないので同意しましょう。

f:id:Raspberly:20190809232714p:plain

インポートするのはModelsだけです。他の所はチェックを外しておきましょう。

f:id:Raspberly:20190809232814p:plain 

 

元記事の方ですとHandプレハブに置き換えたりしていますが、
手がアニメーションしなかったのでマテリアルだけ使います。

両手のSkinnedMeshrendererのMaterialsをHand_Diffuseに変更します。

f:id:Raspberly:20190809233734p:plain

これでリアルな手になりました。

f:id:Raspberly:20190809233702p:plain

 

f:id:Raspberly:20190809235505g:plain

 

 

 

 

 

アセットストア

きちんとした手を出したい場合は、アセットストアなどで探すことができます。
ほとんどが有料です。

もし購入するのであれば更新日時やレビューで動作するのかどうかを確認しましょう。

 

 

 

 

 

まとめ

・手の見た目を変えたい場合は、手モデルのMaterialを変える

・専用のシェーダーがあるため、それを使うと簡単に半透明な手などが出せる

・モデル自体を変えたい場合はアセットストアなどを活用する

 

他にも自分でシェーダーを書いたりテクスチャを張っていくと細かいカスタマイズもできそうです。
ぜひ自分好みにカスタマイズしていってください

 

 

ALVRを使うと人差し指がアニメーションしない問題もそろそろ解決したいところ。

 

 

参考文献

bibinbaleo.hatenablog.com

 

qiita.com

 

 

 

 

他間違っている箇所がありましたらコメントにお願いします。

【Oculus Quest開発メモ】ALVR実行時にAvatarGrabの手が出ない問題 Hand編【Unity】

 

今回はOculus Questの開発ネタをやっていきます。

Oculus QuestをALVRで起動した時にAvatarGrabシーンで手が出ない問題を解決します。
OculusQuestのバージョンアップでALVR関係なく手がでないことが起こりますが、そちらも解決します。

f:id:Raspberly:20190808234352g:plain

 

 

 

 

開発環境

Windows 10

Unity 2018.4.5f

Oculus Integration ver1.39

Oculus Quest

ALVR

 

 

ALVRとは

こちらで少し触れています。

raspberly.hateblo.jp

 

簡単に言うと、PC向けVRの映像をOculusQuestなどスタンドアロンHMDに転送するソフトウェアです。
これにより、毎回ビルドしなければならないQuestの動作テストをEditor上ですぐに動作させることができます。

 

 

 

 

Oculus Questのバージョンアップデート

7月下旬にOculusQuestがアップデートされました。
この時、同時に少し不具合が起きています。これらの不具合はALVR関係なく起こります。

まずはこちらの手段をお試しください

 

・コントローラーが片方したトラッキングされない! 

AvatarGrabシーンでクラッシュする!

といった問題は以下のQiitaを参考にしてみてください・

qiita.com

kimono-oyaji.com

otasyumi.site

 

 

追記、Oculus Integration 1.40の場合

Oculus Integrationのバージョンによって微妙に解決方法が異なりますが1.40の場合、マニフェストの編集で解決します。

  • OVRCameraRig にアタッチされている OVR Manager の Target Devices の “Gear Vr Or Go” を “Quest” に変更する
  • 以下のメニュー操作で Asset/Plugins/Android/AndroidManifest.xml を作る
    • Oculus > Tools > Remove AndroidManifest.xml
    • Oculus > Tools > Create store-compatible AndroidManifest.xml

なお、Build And Run を実行したときに

DeploymentOperationFailedException: No activity in the manifest with action MAIN and category LAUNCHER. Try launching the application manually on the device.
UnityException: Could not find any valid targets to launch on for Android

というエラーが出る場合は、生成された AndroidManifest.xml

<category android:name="android.intent.category.INFO"/>

のところに

<category android:name="android.intent.category.LAUNCHER"/>

を書き足すととりあえず上手くいくようです。

詳しくはこちらをどうぞ。

framesynthesis.jp

 

 

 

前提条件

OculusIntegrationを使用しており、ALVRで動作確認をしようとしたところ手が表示されない状態であること

Androidビルドなら表示されていること。

 

 

 

 

 

主要コンポーネント

Hand

ハンドというのはかなり大雑把な名前ですが、手のアニメーションや描画、当たり判定の切り替えを担当するコンポーネントです。 

 

 

 

 

 

サンプルシーンの確認

Assets/SampleFramework/Usageに様々なサンプルシーンがあります。
学習や挙動の確認にとても有益です。見てみましょう。

 

実は正常に表示されるシーンがあります、それはCustomHandsシーンDistanceGrabシーンです。

f:id:Raspberly:20190809101910p:plain
この2つのシーンではGrabberにOVR GrabberDistanceGrabberコンポーネントがアタッチされていますが、
Handコンポーネントもアタッチされていることを確認しましょう。

f:id:Raspberly:20190808175854p:plain

 

このHandコンポーネントはAvatarGrabシーンではアタッチされていません。

f:id:Raspberly:20190808175957p:plain

当然、プレハブ化されているAvatarGrabberやLocalAvatarWithGrabも同様です。

 

 

 

Hand

f:id:Raspberly:20190808180055p:plain

インスペクターパラメーター

Controller

手のタイプ、右手なら「R Touch」、左手なら「L Touch」にするとよい

Animator

子オブジェクトにある手のモデルのAnimator

Default Grab Pose

 

 

 

 

 

Handの修正

手が非表示になる時、Hand.csを編集するだけで解決することがあります。

Hand.csのOnInputFocusLostメソッドを以下のようにします。
renderers[i].enabled部分をコメントアウトします。

 

 

 

 

Handの手動追加

上記でHand.csを修正しても手が表示されない時はHandを手動で追加します。

コンポーネントのアタッチ

まず、両手のAvatarGrabberにHandコンポーネントをアタッチします。

f:id:Raspberly:20190808204949p:plain

 

そしたら、HandのControllerを修正します。右手ならR Touch、左手ならL Touchにします。
この値はOVR GrabberのControllerと同じ値にするといいでしょう。

f:id:Raspberly:20190808210034p:plain

 

手のモデル

Assets/Oculus/SampleFramework/CostomHands/Modelsの中にある、
「l_hand_skeletal_lowres」と「r_hand_skeletal_lowres」を
Handコンポーネントががアタッチされているオブジェクトの子オブジェクトにします。

f:id:Raspberly:20190808210631p:plain

f:id:Raspberly:20190808211046p:plain

 

AnimatorControllerがnullなので、右手左手に応じたAnimatorをアタッチします。

f:id:Raspberly:20190808233153p:plain

f:id:Raspberly:20190808233114p:plain

 

パラメータの設定

先ほど子オブジェクトにした手のモデルを、HandをコンポーネントのAnimatorに設定します。

f:id:Raspberly:20190808232906p:plain

 

最後に、Default Grab PoseにAssets/Oculus/SampleFramework/CostomHands/Modelsの中にある、
HandPoseDefaultPfプレハブを設定します。

f:id:Raspberly:20190808233439p:plain

f:id:Raspberly:20190808233719p:plain

f:id:Raspberly:20190808233750p:plain

これでHandの設定は終了です。

 

うまくいけば、無事手が表示されていると思います。

f:id:Raspberly:20190808235841g:plain

うまくいかなかった場合は↓
 

 

 

 

 

 

シーン再生時にTime.timeScaleが0になる

スタンド攻撃を受けている

 

調べても同じ報告が出てこないので私の環境だけかもしれませんが、
シーン開始時にtimeScaleが自動的に0になる場合があります

そもそもシーン開始時に手が動いていない場合はこの可能性を疑いましょう。

f:id:Raspberly:20190809002151p:plain


この状態になると視点移動はできますが手が動かず、物理演算も止まります

Update()の中でDebug.Log(Time.timeScale);を呼び出すと、毎フレーム0が呼ばれます。

シーン開始時にtimeScaleが0になるようなら以下のスクリプトを適当なオブジェクトにアタッチしましょう。

 

 

 

 

 

 

【8月9日追記】時間が止まる問題への対策

この問題について解決策を教えていただきました。
どうやらシーン内で悪さをしているコンポーネントがいるようです。

 

シーン内にある、DynamicにPauseOnInputLossコンポーネントがアタッチされています。

f:id:Raspberly:20190809091245p:plain

このコンポーネントは、OVRManagerのInputFocusLostにイベントハンドラを登録しています。

InputFocusLostは入力が失われた時に呼ばれるイベント変数で、初回Update時に実行されているようです。

コンソールで"[OVRManager] InputFocusLost event"が出ている場合、この可能性が大!

 

解決方法としては、シンプルにPauseOnInputLossを無効化するといいでしょう。

f:id:Raspberly:20190809100124p:plain

 

この現象はOculusQuestがアップデートされる前から稀にあったのでとても助かりました。

@shienaさんありがとうございます。

 

 

 

 

 

まとめ

・手が表示されない場合、Hand.csを編集してみる

・それでもだめなら、Handを直接追加してみる

・それでもだめなら時間が止まっていないか確かめる

 

 

 

  他間違っている箇所、わかりにくい点がありましたらコメントにお願いします。

 

【勉強会レポ】 : Unity UIエンジニアリング勉強会

勉強会のレポート(メモ)です。
参加したのはこちら、「Unity UIエンジニアリング勉強会」
会場はNIFcLoungeさんです。

unity-ui-avengers-outgame.peatix.com

ハッシュタグ#unity_avengers

f:id:Raspberly:20190803235333p:plain

 

 

 

 

 

#1 『もしあなたがアウトゲームをつくるときになったらやること』 @masakoha523

IRIAMというアプリを作っていました。今回はそれらの実体験も含めます。

そもそもアウトゲームって何?

大部分がUIで定義されていて、それを用いて何らかのアクションを起こすパート

これを作るとしたら何を考えるか そんな話をします
今回はuGUIの話ではなくコードをごりごり書く話をします

プロジェクト発足時にやっておきたいこと

・用語の統一
ポップアップ、モーダル、ダイアログなどはきちんと定義しておく
これがないとPrefabやクラス名に大きな影響がでてしまう

・コード規約の統一
・動作基準端末と動作対象端末の選定
・CanvasOrderの設定
UIは複数の画面が重なっていくことが多い、なので各UIのレイヤーを決めておきましょう。
もしレイヤーをさわる時、uGUIを使うアセットがある場合は注意しましょう

・デザインの話

フォント、ボタンの大きさ、マージン幅、色など

これらの認識を合わせておこう

 

UIの実装 複数人開発の効率化

MVP

IRIAMではMVPアーキテクチャを採用しました
どういうコードを書くのかという指針になります

MVPについてはこちらをみてね

developers.cyberagent.co.jp

共通パーツを作る

拡縮するボタン、ポップアップ機能

画面遷移基盤を作る

どこの画面も同じように実装できる
最初にやらないと、後にいろいろ独自実装が入ってきて切り離せなくなってしまう

たくさんの機能やオープンソースフレームワークを作った話

IRIAMで作った機能は3つあります

Clione

GitHub - MasaKoha/Clione: スマホゲームのアウトゲームので使用される、様々なパターンの画面遷移基盤

画面遷移のライブラリ

Icarus

ローカライズシステム

GitHub - MasaKoha/Icarus: ローカライズシステム

MVPScriptGenerator4Unity

GitHub - MasaKoha/MVPScriptGenerator4Unity: MVP Script Generator for Unity Editor

MVP派の方はぜひ使ってください

 

まとめ

アウトゲームは分量との闘い
複数人でつくるなら下地作りが大事です

 


 

 

 

 

 

 

 

#2 UnityのUIでやってはいけないこと

unityはuiを簡単に使うことができますが自動で最適化はしてくれません
なのでやってはいけないことを知っておく必要があります

1.アンカーを使わずにUIを設置してはいけない

アスペクト比が異なる端末で崩れる可能性があります
意図的に中央に置きたいもの以外はアンカーを設定しましょう

驚くべきことに、アスペクト比が動的に変わる端末が出る可能性があります
今後端末ごとにアスペクト比が固定であるという概念はなくなる可能性もあります

ノッチがあるときどうするか

セーフゾーンを作って対応する
ただし、ノッチが右上にあったり、ノッチがなかったりするので
そういう時は頑張ってください

ビルドするとUIのサイズが変わってしまう

Canvas Scalerとかで想定サイズを設定しておきましょう
アスペクト比があっていればいいです
アンカーをちゃんと設定すればある程度の変化にも対応できます

2.特に注意せずマスクを設定してはいけない

マスクを使うとドローコールが増えるので
マスク済みの画像を用意することで抑えることができます

じゃあマスクは悪なのかというとそんなことはない
間隔や範囲を調整するといった工夫もできる

3.何も考えずにUIを動かしてはいけない

UIはたくさんあっても意外と安い、動かさなければほとんど負荷にはならない
ただしどれか一つでも動かすと負荷になる

これはCanvas内にあるUIの再構築に時間がかかるため(多ければ多いほど負荷が大きくなる) 

おすすめの解決方法はTween系を使うこと

LayoutGroupの存在は忘れましょう
これの使用は避けてください

4.透明を何度も描画してはいけない

ポリゴンで抜くなどして描画範囲を減らすことができます ただしポリゴン数は増える

5.Textの影やアウトラインは使用してはいけない

見栄えがいいがポリゴンが増える(何も動いていない場合はそうでもないが)

TextMeshProを使いましょう
最近ダイナミックフォントも使えるようになりました

6.Atlasになんでもつっこんではいけない

同じタイミングで使うものだけAtlasにしましょう 

7.SpriteDefaultを使ったSpriteRendererをAssetBundleにいれてはならない

自分でマテリアルを作って差し替えましょう

 

 

 

今回の話は信用せずにプロファイラーを信用しましょう

Unityのアップデートなどにより変わる可能性があるためです

 


 

 

 

 

 

 

 

 

LT1 『ちょっとしたUIの変更を楽にする手法』@tty_yamada

話すこと

フォントを一括で変更する
UIの配置を再ビルドせず再配置する

フォントの一括変更

インスペクターからフォントをいちいち変えていられない
uGUI Textの場合エディタ外で名前を変えるだけで差し替えられます
TMPの場合、エディタ拡張でやりました

GitHub - ttyyamada/TMPFontReplacer: UnityのTextMeshProのフォントを一括で変換できるツールです

UIの位置をリビルドせずに変更したい

RemoteSettingsを使いました
ビルドせずパラメータの変更ができるサービスです
バグがあった場合の緊急対応や強制アップデートの仕組みを作ることができます

まとめ

フォントの置き換えは一括でできるとよい
RemoteSettingでリリース後のビルド対応を減らすことができる

 


 

 

 

 

 

LT2 『Presetでちょっぴり楽するUI組み立て』@lycoris102


今日はPresetのお話をします

Presetはコンポーネントの設定を保存することができる機能です
アセットの状態も保存でき、ProjectSettingも保存することができます
保存したPresetをデフォルト値として使うことができます

これを適応できるパターン

1.予期しない当たり判定の無効化

RaycastTargetをオフにしたPresetを使うことができます
これで毎回RaycastTargetをオフにする作業から解放されます

2.デザインガイドラインを作る

アプリ全体で統一感ができます
Presetを用意しておくといいでしょう

Prefabと違ってPresetは変更の追従ができないことに気を付けましょう

3.画像アセットのデフォルト値を設定できる

共通の設定をインポート時に適応することができます

 

 

Presetをぜひ活用してみてください

 


 

 

 

 

 

 

 

LT3 『ScrollViewアセットマスター』@azumagoro

スクロールビューに関するお話

スクロールビューあるある

・データ数に合わせてセルの個数を変えたい
・スナップさせたい
・表示位置をジャンプさせたい
・複数種類のセルを使いたい

これらの解決策としてアセットストアでアセットを買うことが挙げられます
今回はそのアセットの紹介

UGUI Super ScrollView

とても機能が多い。格子状、ジャンプ機能もろもろ。

コガネブログさんでも解説記事があります

baba-s.hatenablog.com

 

EnhancedScroller

ちょっと安い類似アセット

違いはこんな感じ

f:id:Raspberly:20190803234522p:plain


結論

EnhancedScrollerがいいのかも

 


 

 

 

 

 

 

懇親会

f:id:Raspberly:20190804000610j:plain

 


 

 

 

 

 

タイムライン

 


 

 

 

 

 

 

 

おまけ

今回椿さんに登壇いただきましたが、過去にTECH x GAME COLLEGEにて
UIの最適化に関するトークがありました。
こちらも併せてどうぞ。
ただし、今回椿さんが言っていた通り既に解決済みの内容もあることに注意。

raspberly.hateblo.jp

 

 

 

本イベントの主催者であるアズマゴローさんは、
過去にUnityにおけるマネタイズの勉強会をとと様と開催していました。

raspberly.hateblo.jp

 

今回もとと様がスタッフとして活動していました。

 話すタイミングがありませんでしたが「デザインあ展」のシャツを着ていた!!!


 

 

 

 

 

 

 

他の方の感想ブログ

www.masakoha.com

 

orotiyamatano.hatenablog.com

 

 

 

 間違っている箇所、消してほしいツイートがありましたらコメントにお願いします。