7080 + 1

ゲームプログラミングの記事を書いてます。

【Unity】ImageEffectを使わずにポストプロセス処理をする

始めに

ImageEffectを使うと、オリジナルのポストプロセスを書けるのはUnityの機能として以前からありました。私もポストプロセスでステンシルバッファを使った描画処理をやっていたのですが、Unity2017.3にアップデートした途端に挙動がおかしくなってしまったのです...。

色々と調べてみた結果、ImageEffectを使わずにポストプロセスをする方法を思い付いたので記事にします。

ちなみに、ステンシルバッファをImageEffectでは使えないのかというと、そんなことはないです。Unity2017上でもちゃんと動く方法はありますが、今回の本筋からは外れるので、別記事にします。そのうち書こうと思うで、少々お待ちください。

では、ImageEffectを使わずにどうやってポストプロセスをするのか、書いていきます。

実装

結論を言葉だけで説明すると、

  • uGUIのImageでカメラを覆って、GrabPassを使って描画する。(RenderQueueは一番最後になるように設定)

になります。具体的に説明します。

・用意するもの
ポストプロセスで使うシェーダ
uGUIのImage

以上になります。
まず、uGUIのImageをシーン内に置いてください。これ用のCanvasの設定が必要なので、新規Canvasの子で作ったほうがいいかもです。
で、Canvasの設定を以下のようにしてください。
f:id:atori708:20180325000903p:plain

RenderCameraはポストプロセスをかけたいカメラです。
PlaneDistanceは他のオブジェクトより絶対前になればどこでもいいですが、カメラのnearプレーンのすぐ近くにしておけば安心だと思います。今回はMainCameraのnearと同じ数値にしています。
これでカメラがImageを一番前面にして描画するようになります。
また、Imageはカメラを覆うようにWidth,Heightともにstreachにし、Materialにポストプロセス用の奴を適用します。
f:id:atori708:20180325001239p:plain

次にシェーダの方です。この記事を見ている皆さんには、恐らくImageEffectで適用していたシェーダがすでにあると思います。それを少し編集するだけでいいです。
編集するのは2箇所になります。

  • RenderQueueをとにかくでかい数値に
  • GrabPass{}を追加する

RenderQueueは大きいほど後に描画されます。とにかくでかくすることで、他の全ての描画が終わった後に描画を走らせます。
そしてGrabPassにより、_GrabTextureに描画後の結果が入ってきます。なので、_GrabTextureをシェーダでいじってやれば、ポストプロセスで処理することができる。というわけです。

一応ものすごくシンプルなシェーダを、ImageEffectと今回のパターンの両方載せておきます。
色を反転するポストプロセスシェーダです。変化している場所を見比べてください。


この方法だとImageEffectに比べて、カメラのMSAAをONにしててもステンシルバッファを取得出来るというメリットがあります。ただ、Unityが推奨しているポストプロセスのやり方ではないので、なにか予期せぬことが起きるかもしれません。実機等でちゃんとテストしてみてください。

なんかわからんけどImageEffectうまく動かねえって人は今回の方法を試してみてはいかがでしょうか。

【Unity】Redoのショートカットを変えた~い【Windows】

※これはWindowsのUnityだけの話です。

事始め

UnityのショートカットはUndoがCtrl+ZRedoCtrl+Yになっています。この2つは昔からショートカットで定番となっており、ほとんどのソフトウェアで使えるものだということは、皆さんご存知のとおりです。

しかし、ここ数年のWindowsのソフトでは、Ctrl+Shift+ZでもRedoが出来るものが増えてきています。これはCtrl+Yよりも指を動かす量が少ないのでとても快適です。私の場合、一度慣れるとCtrl+YRedoをすることはほとんどなくなりました。
Ctrl+Shift+Zに対応していないソフトはその瞬間に使う気力をなくします。手を大きく広げてYに指を伸ばす事の醜さったら目も当てられないですね。

恐ろしいことにUnityはCtrl+Shift+Zに「未だに」対応していません。これはWindowsユーザにだけ与えられた特別な足枷です。ショートカットキーを変更することすら許されていません。Unity Technologiesは一体何を考えているのでしょうか?

...前口上が長くなりました。Unity最高!

本題

Unityはエディタ拡張を書くことでショートカットキーを増やすことができます。指定したメソッドを呼び出すので、自分で書いた処理をショートカットキーで呼び出すことも可能です。
で、今回のRedoのショートカットを増やす拡張がこちら。

単純なので説明するまでもないですね。メニューにRedoが追加されちゃいますけど、まあ気にならないと思います。
これで明日から快適なUnityライフを送れますね!

【Unity】リッチテキストを使うためのstring型の拡張メソッドを書きました

Unityで表示される文字(ConsoleログやuGUIのテキストなど)はリッチテキストに対応しています。
タグを付けると、色を変えたりサイズを変えたり出来るんですね。

f:id:atori708:20180304201234p:plain

ちなみに対応してるのは色・サイズ変更、ボールド、イタリックの4種類みたいです。
いちいちタグを着けるのは面倒くさいので、拡張メソッドを書きました。

100%車輪の再発明だけど気にしない。

【Unity】トランジションするシェーダを作りました

テクスチャ一枚を差し替えるだけでトランジションの仕方を変えられるシェーダを作りました。

f:id:atori708:20180303001548g:plain
動画は汚いですがきれいにでてます。本当です。
何かいいGIFレコーダーないですか...

とそれは置いておいて、使い方を。

uGUIのImageに適用するシェーダとして作ってます。
トランジション用テクスチャはマテリアルにではなく、Imageにつけてください。
またテクスチャはグラデーションしてるグレイスケールの画像を用意してください。
機能は以下です。

また、ImageのColorの値が反映されるようになっています。

ソースは以下になります。

ImageEffectを使ってやる方法も出来るっぽいですが、こっちのほうが実装簡単だったのでこっちに落ち着きました。
(多分ImageEffectでの実装の方が軽くなると思います)

補足

ニーアオートマタのポーズ画面に入る時の演出はこの方法でやってるといつかのCGWorldで書いてありました。
この手法自体は昔からあるみたいですが、あんな複雑な動きが出来るテクスチャを作れるツールって何使ってるんでしょうか...

VSCodeがGitを認識しなくなったら

ある日VSCode(1.20)がGitを認識しなくなりました。
ソース管理タブに行っても「有効なソース管理プロバイダーがありません」と表示され何もできなくなります。
(言語が英語だと"There is no active source control providers."と表示される)

色々調べると以下のページが参考になりました。
stackoverflow.com


どうやら設定の"git.path"をgit.exeがあるディレクトリパスに設定してやると行けるみたいです。
これで解決??

私はしませんでした。VSCodeを再起動しても表示は変わらず。

しかし上記ページの下のほうで、「git.pathに設定したのを環境変数にも設定すると行けるよ」的な事が書いてありました。
環境変数のPathに設定してからPCを再起動すると... 行けました!
f:id:atori708:20180224142545p:plain

突然認識されなくなったので原因はわかりませんが、とりあえず解決して良かったです。
メモ代わりに記事にしました。

【Unity】InputManagerを作るエディタ拡張を作りました

Unityで入力を取得しようと思うと、InputManagerをいじる必要があります。
しかし単純にリストで定義されているため、

  • 順番の入れ替えが出来ない
  • 不必要な設定を消す時に後半部分も一緒に消す必要がある

また、様々な入力に対応するために設定項目がたくさんあります。その為パッと見でわかりづらく、必要ない値を入れてしまったりと、設定がしやすいとはとても言えない仕様になっています。
それを少し楽に出来るエディタ拡張を作りました。

github.com


InputManagerからの値取得、設定はこちらを参考にしました。
wordpress.notargs.com

使い方、導入方法はGitHubのReadmeに書いてあります。
上に上げた欠点を完全には解消できていないんですが、少しは設定しやすくなる思います。

また、エディタではなくスクリプトからも作れるようにメソッドを用意してあるので、そちらを使用、拡張するのも有効です。

エディタ拡張の勉強の意味も含めて作ったので、使いづらいところがあるかもしれません。
要望やバグなどありましたらGitHubかコメントでお願いします。

VisualStudioのビルド時間を簡単に早くする

この記事は2015年にQiitaで執筆したものです。情報が古い可能性があります。

目的

プログラマにとって一番時間の無駄になっているであろう「ビルド時間」を短縮できないかと考えていました。
調べていると、簡単に短縮出来る方法があったので紹介します。
筆者はVisual Studio 2013 Communityで検証しました。

プロパティをいじる

これは非常に簡単で、その割に効果の高い方法です。

1. まずはプロジェクト→プロパティ→構成プロパティ→C/C++
複数プロセッサによるコンパイルを「はい」にする。

2. 構成プロパティ→C/C++→コード生成の最小ビルドを有効にするを「いいえ」にする。

たったこれだけです。
試しに、自分が今作っているプロジェクトのビルド時間を測定してみました。

設定前 設定後
Debug 33222ms 22252ms
Release 33578ms 20123ms


見れば分かる通り、10秒以上短縮しています。
この2つの設定だけでかなり変わるみたいなので、試してみてください。