TATIKUNLOG.

主にゲーム作りについて書き留めるブログ。

【Asset紹介】Fullscreen Editor【Unity】

ゲームビューをフルスクリーンにして確認したりするのに便利なアセットの紹介です。

ちなみに、7月31日現在セール中につき半額になってます。

  • 紹介するアセットのリンク
  • 環境
  • アセットの概要
  • 使い方
    • とりあえずフルスクリーン表示
    • 細かい設定
      • Toolbar Visible
      • Fullscreen On Play
      • Placement source
      • Disable Notifications
      • Keep Utility Views Above
      • Disable Scene View Rendering
      • Use global toolbar hiding
      • Mosaic Screen Mapping
    • ショートカットキーの設定
  • おわりに

紹介するアセットのリンク

Fullscreen Editor

Fullscreen Editor

環境

Unity2021.1.15f1

Fullscreen Editor 2.2.4

アセットの概要

エディターのウィンドウをフルスクリーン表示することができるアセットです。

ショートカットキーに対応していて、サクッと切り替えをして使えるので使い勝手は良いです。

続きを読む

URPのDepth Of Field(被写界深度)をドキュメントを読みながら使ってみる【Unity】

f:id:tat1kun:20210726231653p:plain

URPのDepth Of Field(被写界深度)のポストエフェクトを見ていく記事です。上の画像のように背景をぼかしたような演出に使えます。

被写界深度については調べると沢山出てきますが、ここではURP上ではどう使ったらどんな感じに見た目が変わるのかを見ていきます。

※今回触るのはURPのPost-processingで、Built-inのPostProcessingStackではありません。

  • 実行環境
  • 今回の記事で使用しているアセットのリンク
  • Postprocessingのセットアップ
  • URPのDepth Of Fieldは二種類ある
    • Gaussian
      • Start
      • End
      • Max Radius
      • High Quality Sampling
      • フレームデバッガで深度を確認
    • Bokeh
      • Focus Distance
      • Focal Length
      • Aperture
      • Blade Count
      • Blade Curvature
      • Blade Rotation
      • Bladeの値を触って確認
  • 終わりに
  • 参考
  • メモ

実行環境

Unity 2021.1.15f1

Universal RP 11.0.0

今回の記事で使用しているアセットのリンク

Japanese School Classroom

Japanese School Classroom

本の学校の教室を再現しているアセットです。

本アセットはURPに対応していないので、マテリアルの変換を使ってます。

docs.unity3d.com

Postprocessingのセットアップ

以前に記事にしましたので、リンクを記載しておきます。

tat1kun.hatenablog.com

続きを読む

URPのBloomをドキュメント読みながら使ってみる【Unity】

Bloomのポストエフェクトと言えば、導入すれば何かいい感じになるエフェクトということでよく使われてますよね。

その一方で、なんとなくパラメータを調整してなんとなく良い感じになったらOKみたいな感じで触ってる人は少なくないと……思ってます。私もその一人みたいなところがあったので、ドキュメントを読みながら触っていきたいと思います。

※今回触るのはURPのPost-processingで、Built-inのPostProcessingStackではありません。

実行環境

Unity 2021.1.15f1

Universal RP 11.0.0

Postprocessingのセットアップ

以前に記事にしましたので、リンクを記載しておきます。

tat1kun.hatenablog.com

各プロパティ

f:id:tat1kun:20210725210844p:plain

Bloom

Threshold

f:id:tat1kun:20210725213246p:plain

Bloomを適用する閾値を設定します。 この値より小さい明るさのピクセルにはBloomを適用しません。 マニュアルを読むと、ガンマ空間の輝度値を参照するということが書かれています。 ガンマ色空間については下のリンク先に書かれています。

リニアレンダリング概要 - Unity マニュアル

上の図はそれぞれのThresholdの値による見え方の違いです。 スパっと切れるわけではなく、閾値を大きくすると、Bloomのかかり方が段々弱くなっているのが分かります。

Intensity

f:id:tat1kun:20210725214204p:plain

Bloom効果の強さを設定します。強さは0から1で設定します。

と、0から1で設定するとマニュアルに書かれていますが、普通に1よりも大きく設定できます。 上の画像のように、1より大きくした場合、そのままBloomの効果は強くなります。

とはいえ、こっちで無理に強くして輝かせるのではなく、マテリアルの方で調整した方が適切だと思います。

Scatter

f:id:tat1kun:20210725214943p:plain

Scatterは散乱のことです。Bloom効果の半径、周辺への光の広がりの強さを設定します。 強さは0から1で設定できます。Scatterはスライダーになっているため、Intensityのようにここで1より大きく設定というのはできません。

Tint

f:id:tat1kun:20210725223027p:plain

Tintは色合いのことで、Bloom効果の色合いを設定します。

上の画像では左から、白、オレンジ、青に設定した結果を表示してます。

Clamp

f:id:tat1kun:20210725230331p:plain

UnityがBloomの計算に使用する最大強度を設定します。 Bloomの強度がこの値より大きい場合、この値に収めるように縮められます。 実験として、Scatterを0に設定し、同じIntensityでClampを変えてその見た目の変化を確かめてみました。

High Quality Filtering

今回、Cubeによる違いを確認することができなかったのですが、 ドキュメントによると滑らかさが向上するらしいです。 ただし、リソースを多く消費するらしいので、対象プラットフォームによってONOFFを考えた方が良さそうです。

Skip Iterations

処理シーケンスの最後の反復処理は、レンダリングされたフレームの外観にほとんど寄与しない場合があります。この設定では、スキップする最後の反復処理の数を定義します。この値を大きくすると、処理負荷が軽減され、特にモバイルデバイスでのパフォーマンスが向上します。デフォルト値は1です。(ドキュメント本文から抜粋)

翻訳ソフトで直訳してみましたが、ドキュメントの説明を訳しても内部処理について詳しくない人は意味不明だと思います。なので、少し詳しく見ていきます。

反復処理って何のことだろう?って思ったんですが、これはBloomエフェクトを実装するときのダウンサンプリング実行回数だと思われます。

※ここでのダウンサンプリングは画像の縮小処理を指しています

Frame Debuggerでその挙動を確認してみれば、サンプリング回数が変化していることが確認できます。

f:id:tat1kun:20210725233239p:plain

上図では、Skip Iterationsを0から2まで変化させたときの描画回数を比較しています。

Skip Iterationsを増やすと、Bloomの部分で3ずつ回数が削減されているのが確認できます。 これは、ダウンサンプリング→ガウスぼかし→ぼかし画像を適用の3手順分でしょう。

↓の川瀬のブルームフィルターを実装しているとは限りませんが、ブルームの実装例として参考にしました。

川瀬のブルームフィルター - Wikipedia

Lens Dirt

Texture

テクスチャを割り当てることで、レンズに汚れ(汚れやほこりなど)の効果を与えることができます。

f:id:tat1kun:20210725235447p:plain

適当なテクスチャを適用してみた例です。テクスチャ見たまんまではないのでわかりにくいですが、 テクスチャ中央を着目すると、テクスチャの白い部分で明るくなっているのが確認できます。

Intensity

汚れの強さを設定できます。

Troubleshooting performance issues

処理が重い場合は参考にしてください、的なことが書かれている部分です。まずは原文をそのまま引用して載せておきます。

1.Disable High Quality Filtering. Bloom then uses bilinear filtering instead of bicubic. This reduces the overall smoothness of the Bloom effect, but greatly improves performance, especially on lower-end hardware and platforms. In some extreme cases, you might see blocky graphical artifacts in your Scene.

2.Use a lower resolution Lens Dirt Texture to reduce memory pressure and speed up blending across volumes.

  • High Quality Filteringをオフにすると、ブロック状のアーチファクトが生じることがあるが、パフォーマンスは向上する。

  • Len Dirtに適用するテクスチャの解像度を抑えるとパフォーマンスが向上する。

といったところでしょうか。 ここの記述から察するに、High Quality Filiteringのオンオフによる違いは、ぼかす際のアルゴリズムの違い(バイキュービックとバイリニア)だったみたいですね。

おわりに

書き終わってから、PostProcesingStackV2と項目を比べてみたのですが、思ったより差分があって驚きました。 とりあえずBloomの記事を書きましたが、今後は自分が必要としてる知識から埋めていくように記事を書いていこうかなと思っています。

参考

docs.unity3d.com

URPのポストエフェクトのつけ方【Unity】

UnityのURPにおけるポストエフェクト(Post-processing)のつけ方のメモ記事で、 内容としては、URPのドキュメントのPost-processingのHow to configureを訳す感じです。

Post-processing in the Universal Render Pipeline | Universal RP | 12.0.0

URPでもPostProcessingStackって使ってなかった?

URP(LWRP)ちょっと触ったって人はもしかすると、「URPでもPostProcessingStackって使ってなかった?」という認識を持っている方もいると思います。これに関しては、既に様々なところで変更があったことが言及されていますが、具体的にどの辺で変わったのかはドキュメントで確認することができます。

Render pipeline compatibility

This package is compatible with the following render pipeline versions:

Built-in render pipeline. Universal Render Pipeline (URP) 7.x, with Unity 2018 LTS, and 2019 LTS. Certain effects are not compatible with URP. Scriptable Render Pipeline (SRP).

(PostProcessingStackv2 3.1.1のドキュメントより)

要するに、URP7+Unity2019ぐらいまでは従来のPostProcessingStackを使っていて、URP8+Unity2020以降URP独自実装されたPostprocessingを使うようになったってことですね。

URPを使ってみるというときに間違えて導入しないように注意しましょう。

新しく作成したシーンに使用する

f:id:tat1kun:20210718155941p:plain

新しく作成したシーンに対してCubeを置いただけのシーンを作成しました。

カメラの設定の変更

カメラのPostProcessingのチェックボックスにチェックを入れます。

f:id:tat1kun:20210718155821p:plain

ゲームオブジェクトにVolumeコンポーネントを追加

f:id:tat1kun:20210718161113g:plain

空のゲームオブジェクトVolumeを作成して、Volumeコンポーネントを追加します。

Volume Profileの作成

f:id:tat1kun:20210718161226p:plain

VolumeのProfileの右側にあるNewボタンから新しいProfileを作成します。

エフェクトを付ける

f:id:tat1kun:20210718162036g:plain

後はVolumeの下のAdd Overrideから色々とエフェクトを付けることができます。

色々とつけてみた

f:id:tat1kun:20210718163329p:plain

雑にエフェクトを沢山つけてみましたが、デフォルトのスカイボックスのデフォルト感が凄いですね!

モバイル向けの設定について

Post-processing effects can take up a lot of frame time. If you’re using URP for mobile devices, these effects are the most “mobile-friendly” by default:

  • Bloom (with High Quality Filtering disabled)
  • Chromatic Aberration
  • Color Grading
  • Lens Distortion
  • Vignette

Note: For depth-of field, Unity recommends that you use Gaussian Depth of Field for lower-end devices. For console and desktop platforms, use Bokeh Depth of Field.

Note: For anti-aliasing on mobile platforms, Unity recommends that you use FXAA.

箇条書きされてる5つのエフェクトはモバイルでも大丈夫、depth-of fieldは弱いモバイルデバイスではGaussian、デスクトップやコンソールではBokehを使う、 モバイル向けの場合はアンチエイリアシングはFXAAを推奨。ってところでしょうか。

おわりに

現在のURPにおけるポストエフェクトのかけ方について触れました。 デバイス負荷とトレードオフですが、上手く使えると絵作りが良い感じになるので、活用していきたいですね。

【Feel】MMFeedBacks を使ってみるだけ【Unity】

この記事で紹介しているアセットのリンク

Feel

Feel

はじめに

記事タイトル通りで、MMFeedBacksを設定して起爆させるだけです。

環境

Unity2021.1.14f1

Feel2.3

事前準備

f:id:tat1kun:20210711225844p:plain

以下の三つのゲームオブジェクトを生成しておきました。

  • Cube

今回MMFeedBacksで動いてもらうゲームオブジェクト

  • Feedbacks

MMFeedBacksの中身を持たせる空のゲームオブジェクト

  • StartFeedbacks

MMFeedBacksを動かすためのスクリプトをアタッチする空のゲームオブジェクト

を設定しておきました。

フィードバックの設定

まずFeedbacksにMMFeedbacksコンポーネントを持たせます。

f:id:tat1kun:20210711225819p:plain

次にAdd new feedback...をクリックして、使いたいフィードバックを選択します。

今回はTransformからScaleを選びます。

f:id:tat1kun:20210711225722p:plain

色々いじれる項目が見えますが、今回は動かしてみるだけなので最低限の設定だけ行います。

Animate Scale Targetに今回スケールを変化させる対象のCubeのTransformを設定します。

f:id:tat1kun:20210711225946p:plain

これでフィードバックの設定は完了しました。

次はこのフィードバックを起動するためのスクリプトを書きます。

起動のためのスクリプト

using UnityEngine;
using MoreMountains.Feedbacks;
public class StartFeedBacks : MonoBehaviour
{
  public MMFeedbacks _feedbacks;

  private void Update() {
    if(Input.GetKeyDown(KeyCode.Space)){
      _feedbacks.PlayFeedbacks();
    }
  }
}

内容としては、MMFeedbacksを取得しておいて、

PlayFeedbacksメソッドで起動します。

今回はスペースキーの入力を受けたら起動するようにしました。

あとはゲームオブジェクトにアタッチして、

起動するMMFeedbacksを指定して準備完了です。

f:id:tat1kun:20210711230359p:plain

動かしてみる

youtu.be

無事スケール変化のフィードバックを起動することができました。

SerializeField を付けた変数がどこにいってるのかについて【Unity】

f:id:tat1kun:20210711162159p:plain

最近、Unityの書籍とかでスクリプトを読んでいると、「SerializeField」という属性を変数の上にくっつけてるケースを良く見ます。

使用用途は「インスペクタ上でその変数の値を変更できるようにする」が主なんですが、

実際何をしているものなのか良く忘れるので、メモしておこうと思いました。

今回、フィールドを変数と表記しているのですが、フィールドという表記に馴染みがない人も少なくないので、どうしたらいいかと悩んでいるところではあります。

シリアライズ

シリアライズ自体には

様々な要素を組み合わせた複合的なデータや、コンピュータで実行中のプログラムがメインメモリ上に展開しているオブジェクトなどを、一定のデータ形式や変換規則に従って文字列やバイト列に変換し、保存したり送受信できるようにすることを指す。(IT用語辞典 e-Wordsより)

という意味があるみたいですが、

Unity上ではデータを読み書きできるように何らかの形で書き出しておくものだと考えて間違いないかと思います。

Unityでスクリプト変数のシリアライズ

スクリプトのシリアル化 - Unity マニュアル

スクリプト変数(フィールド)のシリアライズの条件に関しては公式リファレンスで詳しく書かれています。

今回は「[SerializeField]属性を持たせる」のと「publicにすること」シリアライズをしてみます。

※属性については↓の記事が参考になります。

UnityのAttribute(属性)についてまとめてメモる。 - テラシュールブログ

シリアライズされた変数はどこに

インスペクタで設定した変数のデータがどこに保存されているのか、と調べてみました。

まずは適当なシリアライズされる変数を用意しておきます。

f:id:tat1kun:20210711151352p:plain

インスペクタ上でも適当な値を設定します。

シリアライズされた値はインスペクタ上に表示され、編集可能になるので、下のように表示されます。

一方で、privateの変数は表示されていません。

f:id:tat1kun:20210711151418p:plain

で、設定した値はシーンファイルの中で確認することができます。

f:id:tat1kun:20210711153347p:plain

ここで確認するのはmetaファイルの方ではなく、シーン名.unity自体の方です。

普通に開こうとするとUnityEditor側でシーンを開くことが多いので、なんとかテキストエディタで開いてやります。

f:id:tat1kun:20210711152253p:plain

下の方にhensuuという、先ほど設定した変数を確認することができました。

また、シリアライズされた配列が連続して配置されているのが分かります。

このffffff7fは16進数表記で、10進数表記に直すと2147483647になります。

さいごに

データを扱っていくうえで、どこに何があるのかを把握するのは大事です。

今回、普段何気なく編集しているインスペクタ上の値がどこにあるのか分かって良かったです。

Unityのシリアライズに関する記事ってググると結構出てくるので、改めて書くかは悩ましいですね。

余談

シリアライズする形式はテキスト形式とバイナリ形式の選択をすることができます。

f:id:tat1kun:20210711160622p:plain

f:id:tat1kun:20210711160635p:plain

この違いについてマニュアルを参照して確認してみましたが、

基本的にはテキストで出力するので問題ないみたいです。

というか、バージョン管理ソフトを使用する場合にはテキストを使用する必要があるみたいですね。

バイナリ形式はコンピュータ側に優しいだけなので、基本的には必要ない感じでしょうか。

f:id:tat1kun:20210711160426p:plain

Editor - Unity マニュアルより

参考

UnityのAttribute(属性)についてまとめてメモる。 - テラシュールブログ

【Unity】スクリプトがシリアライズされる仕組み | ねこじゃらシティ

【Unity】SerializeReferenceをちゃんと理解する - LIGHT11

Editor - Unity マニュアル

URPの『Universal Rendering Example』プロジェクトを見ていきたい【Unity】

はじめに

URPのポストエフェクトを自作してみたいと思って色々調べてみたのですが、

なんの情報を信用していいのか良くわからなかったので、

Unity公式のGithubのサンプルプロジェクトを参考にすることにしました。

ちなみに、RendererFeatureでURPにRenderパスを追加することで、追加のエフェクトをかけているようです。

このRendererFeatureが良く分からないので、それを調べる目的もあります。

docs.unity3d.com

見るプロジェクト

github.com

続きを読む