UnityでFMODを使おう!【後編】

こんにちは、やまだたいし( やまだ たいし (@OrotiYamatano) | Twitter )です。
FMODの使い方を探した時に日本語記事がなかったので本記事を作成しました。
他の人の取っ掛かりになればなと思います。

前編はコチラ
orotiyamatano.hatenablog.com

目次


FMODをUnityで使う


前回はFMOD Studioのクイックチュートリアルを行ったので、今回は実際にUnityで再生して確認していきたいと思います。

使用するUnityバージョンは2018.4以降とのことですが、私は2019.4を使っていこうと思います。
さっそくFMODのプラグインをダウンロードして行こうと思います。

FMODはアセットストアからダウンロード出来ます。(お目当てのバージョンではない場合、 こちら からダウンロード可能)

assetstore.unity.com

早速、パッケージマネージャーを使って、ダウンロード、インポートします。
(ダウンロードするバージョンは、FMOD Studioと同じであることを確認してください)

今回は単純な翻訳記事ではなく、前回クイックチュートリアルで作ったプロジェクトを鳴らすようにしてみたいと思います。
正式なチュートリアルをやりたい方は コチラ もしくは コチラ の英語のチュートリアルを参考にしてみてください。

UnityでFMODを使う


1.FMODのプラグインアセットのインストール完了後、パッケージのインポートが終わったら、[FMOD]>[Edit Settings]を選択

f:id:OrotiYamatano:20210402015405p:plain

InspectorにFMODStudioSettingsが開かれます。
2.[Browse] をクリック。

f:id:OrotiYamatano:20210403050801p:plain

3.前編で作成したFMODStudioプロジェクトフォルダー内の* .fsproを選択します。(私はNewProjectという名前で作成したのでNewProject.fsproを選択)

f:id:OrotiYamatano:20210403051056p:plain

正しく完了すると、いくつかの追加設定が表示されます。

今回FMODを使うのでUnityの標準のサウンドは使えなくなります。
Aoudio関連のComponentを削除する必要があります。
消していきましょう。

4.SampleSceneを開き、HierachyのMainCameraを選択、InspectorよりAudioListenerをRemoveComponentで削除

f:id:OrotiYamatano:20210403051613p:plain

5.代わりに[AddComponent]で[FMOD Studio]>[FMOD Studio Listener]を追加

f:id:OrotiYamatano:20210403051822p:plain

エラーが出なければOKです。
推奨
後、完全にUnityのオーディオを使えなくして少しでも処理を軽くしたい方は、
Project Settings>Audio>Disable Unity Audioにチェックを入れると良いでしょう

f:id:OrotiYamatano:20210404013837p:plain

さて、聞く側は出来たので次は鳴らす側です。

6.Hierachyに適当なGameObjectを追加し、カメラから近い位置に設置、Inspectorより[AddComponent]で[FMOD Studio]>[FMOD Studio Event Emitter]を追加

f:id:OrotiYamatano:20210403052338p:plain

7.PlayEventの項目をObjectStartに変更し、Eventの虫眼鏡のマークをクリックしてEvent>NewEvent(前編で作ったEvent)を選択

f:id:OrotiYamatano:20210403052729p:plain

ちなみに今回はparameterの値は入れないで再生しようと思います。
前回入れたparameterの値を使いたい方は自分で調べてください。

8.再生ボタンを押して、今回設定した音が再生されることを確認しましょう

これで以上です!

Q.音がならない

実装したのに音が鳴らない方もいるかも知れません。
いくつか原因となりそうなことを列挙したので確認してみてください。

原因1
FMOD StudioとUnityにインポートしたバージョンが違う場合、音がならないことがあるようです。
FMOD Studioと同じバージョンを使用しているか確認しましょう。
FMODのバージョンは[Help]>[About FMOD Studio]より確認が出来る。
f:id:OrotiYamatano:20210404013257p:plain

原因2
Unityのバージョンが対応しているか確認する。
FMODのプラグインのバージョンによっては対応していないことがあるようです。
確認しましょう。

原因3
うっかりやってしまうのが、単純ですが、Unity側のMute AudioがOnになっている場合です。
もちろん聞こえないのでOnになっていないか確認しましょう。

f:id:OrotiYamatano:20210404013548p:plain

原因4
オブジェクトがカメラから遠すぎる。
FMODで作った音は減衰機能が標準で入っています。
FMOD Studio ListenerをAddComponentしたカメラから遠すぎる場合、音が聞こえなくなってしまいます。
気をつけましょう。

これで一通り完了です


これでFMODが使えるようになりました。
具体的な制御やフェードなど、FMODの使い方が知りたい方は、コチラチュートリアルやドキュメントを参考にしてみてください。
また、海外では結構頻繁に使われるようなので、英語でYoutubeを検索すると、減衰機能を生かした実装のやり方などを紹介している方が出てきます。
Youtubeの英語翻訳字幕機能は自動でも割と精度がいいので、日本語に翻訳してみれば大体理解できます。
ドキュメントがどうしてもわからない方は動画を参考にしてみると良いかも知れません。

まとめ


以上、UnityでFMODを使おうでした。
日本では使う人はまだまだ少ないですが、WEBGL形式でも使うことが出来るのでUnity1WeekJamなどで試しに使ってみても良いかも知れません。
今後私も使っていきたいので、いろいろな方々が日本語記事を書いてわかりやすくなっていいったら、嬉しいです。
また要望があったら、ダッキングなどの処理なども書こうと思います。
皆、FMOD使ってみようぜ!以上、やまだたいしでした。

UnityでFMODを使おう!【前編】

こんにちは、やまだたいし( やまだ たいし (@OrotiYamatano) | Twitter )です。
FMODの使い方を探した時に日本語記事がなかったので本記事を作成しました。
他の人の取っ掛かりになればなと思います。

後編はコチラ
orotiyamatano.hatenablog.com

目次


そもそもミドルウェア・オーディオエンジンが使えると何が嬉しいのか


  • サウンドミキサー機能がUnity標準以外も使えるようになる!

バーブとか色々

ゼルダやオクトパストラベラーとかにも使われてましたよね note.com

BGMが再生されているときにSEやキャラクターの音声が埋もれてしまったり、音割れしてしまうことはありませんか?
BGM側の音をリアルタイムに小さくなるように音量調整する機能をダッキングと言います。

studio-sunny-side.hatenablog.com

  • 負荷が小さい

サウンドレイテンシー、メモリ消費、ストリーム負荷、圧縮音声のデコード負荷等、ミドルウェア側でやってくれる。

  • ランダム再生などが楽

ランダム再生させるときはUnityの標準機能で行う場合自分でロジックをプログラミングすることになるが、ミドルウェア側で設定すればロジックを組むことなく再生できる。

他にも使う理由はあると思いますが、このあたりが主に皆さんが使う理由の中心だと思います。

FMODとは


ミドルウェア・オーディオエンジンです。
ゲームなどで使われ、音声の管理や再生をやりやすくするするミドルウェアです。
類似のサウンドエンジンとしてCRI(ADX等),Wwiseなどが存在します。

ちなみにUnityのオーディオ機能の内部ではFMODが使われてるらしい。
(なので相性は良いかも?)

サウンドエンジンと比較してみる


CRI Wwise FMOD
小規模開発環境の価格 個人/小規模向け(前年度年商が1,000万円以下)ADX2 LEなら無料。
その売上以上はADX2に移行。
開発予算$150k以下なら無料。
現在$150kは日本円だと1600万くらい?
開発予算$500k規模まで無料、
1ゲームあたり$2000(年間売上$200k以下なら無料。
現在$200kは日本円だと2100万くらい?)
商用の価格 ADX2なら初期費用Androidなら35万、月間250万以上超えると更に増えていく?
詳しくは知らない
プロジェクトごとの料金。$1500k以下なら$7200 ベーシックなら開発予算$500k~1500kだったら1ゲームあたり$5000
ロゴ表記 ADX2 LE は必要なし。ADX2は25万払えばロゴ表記破棄できる 必要なし? インディー版なら必須、ベーシックなら$5000払えばロゴ表記を破棄できる
機能制限 LEはブラウザや家庭ゲーム機未対応。暗号化機能もなし。 無料版だとサウンドファイル、メディアアセット数が500まで インディー版でも、機能には制限なし
対応プラットフォーム
(エンジン側が対応していないのもあるので注意)
Swich,PSVita,PS4/PS5,
iOS,Android,Webブラウザ(WebGL),Xbox Series,Stadia,
アーケード,macOS,Windows,Xbox One(ADX2の一覧。他自動車向けのソフトウェアなどもあるみたい?)
Android,Linux,iOS,maxOS,Windows,
PS4/PS5,Swich,Xbox One,Xbox Series, Stadia,tvOS,Universal Windows Platform,android tv
Windows,macOS,Linux,iOS,Android,
HTML5(WebGL),PS5/PS4,Xbox,Xbox Series,Switch
未対応プラットフォームについて
(公式ではVR機器対応と書いてないものもあったが基本的にはどれもOculusは動きそう)
ADX2LEの場合はWebGLや家庭ゲーム機未対応 WebGL未対応 Stadia未対応
対応エンジン Unity,UE4,Cocos2d-x Unity,UE4(推してるのはUnityとUE4だが、Cocosなどでも使えるっぽい?) Unity,UE4,CryEngine
使っている作品(画像を右クリックして別タブで開けば大きな画像がみれます)
スマホ以外にもタイトルはあるが、スマホ推し?

他にもいっぱいタイトルがあった。表示してるものは現在最新

価格の面からかインディータイトルが多め?
特徴 日本企業。リップシンクなどCRI独自の多彩な機能がある。
日本語資料が多いので、日本でよく使われる。
カナダ企業。世界で最も利用されているっぽい。日本語の説明もある。 オーストラリア企業。競合と比べ安い。少し機能は少なめ。
UXが良い。日本語対応は今は無し

詳細に関してはコチラ。

https://www.fmod.com/licensing#premium

  • FMODの採用タイトル

https://www.fmod.com/games

どうしてFMODを使うのか


価格が良心的で、UXが良くて、WebGLプラットフォーム対応無料で使えるものがFMODしか無いから!

今までFMODが日本で話題にならなかった理由


  • 日本語に一切対応していない
  • インディー版が無料になったのが2020年12月頃に発表と、割と最近

jp.gamesindustry.biz

FMODの使い方


英語が使える方ならFMODの使い方を覚えるのは容易だと思います。
ラーニング用の教材も豊富でドキュメントもしっかりある。

https://www.fmod.com/learn

とはいえ、私を含め英語が達者ではない人も多いと思います。
なので今回はクイックチュートリアルとUnityに組み込むまでを簡単にではありますが、日本語訳してみようと思います。
本記事ではクイックチュートリアルのみ翻訳します。Unityへの組み込みは後編にて取り扱います。

FMOD Studio - クイックスタートチュートリアル


始める前に


ダウンロードはコチラから。
https://www.fmod.com/download

(FMODのサイトへの登録が必須)

本編


補足しながら、ざっくり翻訳(というか意訳)していきます。
↓翻訳元ページ
https://www.fmod.com/resources/documentation-studio?version=2.1&page=quick-start-tutorial.html

本記事はWindowsベースで記述しますが、多分Macでも、ほぼ同じだと思います。

チュートリアルは概念を学んでから本チュートリアルを読むのがオススメします。
(概念についてはこちら。今回は飛ばします https://www.fmod.com/resources/documentation-studio?version=2.1&page=fmod-studio-concepts.html )

1.FMOD Studioの起動

ダイアログが表示されます。
f:id:OrotiYamatano:20210330224850p:plain

2.チュートリアルでは新規プロジェクトが必要なので、右下の[New Project]をクリック

最初のダイアログが消え、「EventEditerWindow(イベントエディタウィンドウ)」に[Untitled]という名前で新規のプロジェクトが表示されます。

(EventEditerWindowとは→ https://www.fmod.com/resources/documentation-studio?version=2.1&page=glossary.html#event-editor-window )

f:id:OrotiYamatano:20210330225113p:plain

このまま作業開始することも出来ますが、最初にプロジェクトを保存しておくのをオススメします。

3.左上の[File]を開き、[Save]を選択

4.場所を選択し、覚えやすいプロジェクト名を命名して[保存(S)]ボタンをクリック

(私はNewProjectという名前で今回は保存します)
これでプロジェクトをいつでも保存、ロード可能になりました。

早速、コンテンツの作成をしていきます。
FMOD Studioのコンテンツの基本単位は、「Event(イベント)」と呼ばれます。
(Eventとは→ https://www.fmod.com/resources/documentation-studio?version=2.1&page=glossary.html#event )
EventはEventEditerWindowの左側にある、「EventBrowser(イベントブラウザ)」で作成、編集します。
(EventBrowserとは→ https://www.fmod.com/resources/documentation-studio?version=2.1&page=glossary.html#events-browser )

f:id:OrotiYamatano:20210330231313p:plain

5.EventBrowserを右クリックし、「ContextMenu(コンテキストメニュー)」から[New Event]>[New 3D Event Timeline]を選択、[Enter]キーを押して名前を確定

(ContextMenuとは→ https://www.fmod.com/resources/documentation-studio?version=2.1&page=glossary.html#context-menu )

f:id:OrotiYamatano:20210331000852p:plain

すると、[New Event]という名前のEventが作成されます。
[New Event]の「Timeline(タイムライン)」と「ParameterSheet(パラメーターシート)」のプロパティが
EventBrowserの右側の「Editor(エディタ)」と「OverView(オーバービュー)」と「Deck(デッキ)」に表示されます。

(Timelineとは→ https://www.fmod.com/resources/documentation-studio?version=2.1&page=glossary.html#timeline )
(ParameterSheetとは→ https://www.fmod.com/resources/documentation-studio?version=2.1&page=glossary.html#parameter-sheet )
(Editorとは→ https://www.fmod.com/resources/documentation-studio?version=2.1&page=glossary.html#editor )
(Deckとは→ https://www.fmod.com/resources/documentation-studio?version=2.1&page=glossary.html#deck )
(OverViewとは一番右側の概要説明ウィンドウのこと。プレビューとかが表示される)

f:id:OrotiYamatano:20210331000927p:plain

EventEditorWindowの詳細について知りたい場合は コチラ を参照ください。

[New Event]は作成したばかりのため、再生ボタンを押しても何も音が鳴りません。
音を鳴らすためにはオーディオファイルをインポートする必要があります。

6.EventBrowserのAssetsタブをクリック

「AssetsBrowser(アセットブラウザ)」が表示されます。

(AssetsBrowserとは→ https://www.fmod.com/resources/documentation-studio?version=2.1&page=glossary.html#assets-browser )

f:id:OrotiYamatano:20210330234140p:plain

AssetsBrowserにはプロジェクトにインポートされた全てのオーディオファイルが表示されます。
今はまだインポートしていないため空です。

7.[File]>[Import Assets...]をクリック

インポートするファイルが選択出来るようになります。

8.今回はサンプルとして コチラ からQuick Start Tutorial Assets(「one.ogg」「two.ogg」「three.ogg」)をダウンロードし、解凍。その3つを選択して[開く(O)]をクリック すると、アセットがインポートされAssetsBrowserに3つのアセットが表示されます。

AudioAssetsの詳細について知りたい場合は コチラ を参照ください。

9.Editerで[Audio 1]のオーディオトラックを右クリック、ContextMenuから[Add Multi instrument]をクリック

f:id:OrotiYamatano:20210331003224p:plain

オーディオトラックに青い(?)ボックスが表示されます。
コレがMulti Instrumentです。

f:id:OrotiYamatano:20210331003339p:plain

10.Multi Instrumentをクリックして選択

するとMulti InstrumentのプロパティがDeckに表示されます

f:id:OrotiYamatano:20210331003548p:plain

11.AssetsBrowserで一番上のアセットをクリックし、Shiftキーを押しながら一番下のアセットをクリックして全てのアセットを選択

12.アセットをドラックしてMulti Instrumentのプレイリストにドラッグします

f:id:OrotiYamatano:20210331003848p:plain

Multi Instrumentは実行(トリガー)されるとプレイリストの内容に応じて音声を出力します。
再生ボタンを押してEventを再生し試聴することでテストできます。

13.TransportBar(トランスポートバー)の再生ボタンをクリック

f:id:OrotiYamatano:20210331004327p:plain

TimeLineの再生位置がInstrumentまで行くと、instrumentが実行(トリガー)されると(今回の設定の場合)3つのアセットの中からランダムに再生されます。

14.TransportBarの停止ボタンをクリックしてオーディオを停止します。もう一度聴きたい場合は再生ボタンを再度クリックしてください。

Instrumentの詳細が知りたい場合は コチラ を参照ください。

現在の設定のままだと、Eventをゲーム中からパラメーターを変更する方法がありません。それを修正しましょう。
パラメーターを使用すると、パラメーターの値を変更することによってEventの動作を変更させることが出来ます。

パラメーターを元に動作するイベントを追加するには、まず最初にプリセットパラメーターをプロジェクトに追加する必要があります。

15.ツールバーの[Window]>[Preset Browser]を選択

Preset Browserが表示されます。
ここでは、プリセットパラメーターとプリセットエフェクトを作成、編集できます。

16.ParametersBrowserの空の部分を右クリックし、ContextMenuに表示される[New Parameter]をクリック

f:id:OrotiYamatano:20210331234520p:plain

[Add Parameter]ダイアログが表示されます。

f:id:OrotiYamatano:20210331234721p:plain

17.デフォルト設定で問題ないので、[OK]ボタンをクリック

パラメータの追加ウィンドウが消え、「Parameter 1」という名前のパラメータがParametersBrowserに表示されます。

パラメータとプリセットパラメータの詳細については、 パラメータパラメータリファレンス の章を参照してください。

Preset Browserはもう必要ないので閉じます。

18.Preset Browserウィンドウの☓ボタンをクリックして閉じます

このチュートリアルでは、Eventのボリューム(何故かチュートリアルとUIが違うので今回はボリュームでいきます)をパラメーターの値に依存させるようにします。

19.Event Master Trackを選択するには、Master Trackのヘッドをクリックします。

f:id:OrotiYamatano:20210331235332p:plain

トラックの シグナルチェーン がDeckに表示されます。さらに、EventのMacros DrawerがDeckの右端に表示されます。

20.ピッチナンバーボックスを右クリックし、ContextMenuから[Add Automation]を選択します

f:id:OrotiYamatano:20210331235851p:plain

「自動化および変調ドロワー」が表示され、マクロのドロワーの右側のセクションラベルは「Automation: Volume」が表示されます。

21.Volume Automationセクションの[Add Curve]ボタンをクリックし、ContextMenuから[Browse]を選択してから、[Select Parameter]ポップアップから[Parameter 1]パラメーターを選択します

f:id:OrotiYamatano:20210401001321p:plain

Volume Automationセクションに赤い破線が表示されます。
これはオートメーションカーブであり、パラメーターのすべての可能な値での自動化されたプロパティの値を示す折れ線グラフです。
現在、オートメーションカーブは完全に水平です。つまり、プロパティの値は、どんなパラメーターが渡されても同じ値です。

f:id:OrotiYamatano:20210401001825p:plain

22.赤い線をクリック

オートメーションカーブが実線になり、クリックしたポイントにオートメーションポイントが表示されます。

f:id:OrotiYamatano:20210401001915p:plain

オートメーションポイントは、オートメーションパラメーターに打った地点でのオートメーションプロパティの値を決定し、オートメーションカーブの形状を定義します。

23.オートメーションカーブの別の部分をクリックして、2番目のオートメーションポイントを追加します

24.新しいオートメーションポイントをクリックして上下にドラッグし、値を変更します

f:id:OrotiYamatano:20210401002234p:plain

このオートメーションカーブにより、パラメーターの値に応じてイベントのボリュームが変化します。

25.TransportBarの再生ボタンをクリック

Parameter 1のデフォルト値0のオートメーションによって設定されたボリュームで再生されます。

26.Eventの再生が終了したら、TransportBarの[Parameter 1]パラメーターのナンバーボックスでマウスボタンをクリックして押したままにし、パラメーターが最大値の10db(大きすぎると思うので程々に調整してください)に達するまでマウスカーソルを上にドラッグします

27.TransportBarの再生ボタンをクリック

Eventのボリュームは、タイムラインの再生位置の速度とイベントの出力のピッチに影響を与えるため、パラメーターの値が変更されたため、イベントのサウンドが異なることに気付くでしょう。

オートメーションの詳細については、オーサリングイベントの章の オートメーション セクションを参照してください。

ゲームでこのイベントを聞くには、それを Bank に割り当てて、そのBankを構築する必要があります。
ビルドは、プロジェクトをFMOD StudioAPIが使用できる形式に変換します。

28.「New Event」イベントを右クリックし、ContextMenuから「Assign to Bank>Master」を選択します

f:id:OrotiYamatano:20210401010933p:plain

EventがそのBankに割り当てられたので、Eventを作成するたびにそのBankに含まれます。

29.「File>Build」を選択します

f:id:OrotiYamatano:20210401011101p:plain

FMOD Studioは、プロジェクトのBankファイルを作成します。

30.フォルダーまたはエクスプローラーを開き、このFMODStudioプロジェクトを保存した場所に移動します

内部FMOD Studioプロジェクトフォルダには、「Build」という名前のサブフォルダを見つけることができます。

f:id:OrotiYamatano:20210401011417p:plain

このフォルダーには、「Desktop」という名前の別のサブフォルダーが含まれています。
このサブフォルダーには、「Master.bank」および「Master.strings.bank」というファイルが含まれています。
これらのファイルはプロジェクトで構築されたバンクであり、作成したイベントをプレイするためにゲームで必要になります。

ゲームでビルドされたバンクファイルのコンテンツを再生する方法については、 FMODAPIユーザーマニュアル を参照してください。

以上!


これで一通りのクイックチュートリアルは終了です。
長かった……。 分かりづらい所は極力スクリーンショットを貼り付けましたので詰まることなくクイックチュートリアルが出来ると思います。
それでもわからない方は、やはり原文を読みに行ってください。
それが結局早いです。

まとめ


FMODは良いかも!
まだ私も記事を書きながら試しているため、実際に鳴らす所まで試していませんが、
実際に使って見るのはありなんじゃないかと思い始めています。
近いうちに後編を書こうと思うので2週間以内に記事を作成したいと思っていますので、ゆっくりお待ちいただければと思います。
以上です。

後編はコチラ
orotiyamatano.hatenablog.com

ADHDの私が診断されて障害者手帳を貰うまで

こんにちは、やまだたいし( やまだ たいし (@OrotiYamatano) | Twitter )です。
今日はただの日記です。
ADHDと診断されてついに明日障害者手帳を貰うことになったので、
日記を書くことにしました。

ADHDだと思うけど、診断されたら気が楽になるのかな?
病院行くの面倒くさいなと思ってる人に参考になれば幸いです。

目次


前回、前々回の記事


orotiyamatano.hatenablog.com

orotiyamatano.hatenablog.com

診断→通院するまで


ここに関しては前々回の記事でも軽く触れたのでざっくり、話します。
元々ADHDじゃないかと疑ってはいました。
リモートワークが始まり、本格的に集中できず業務に支障が出ていたため、病院に行きました。

ADHDと診断できる医者は少ないので↓で調べてから行きましょう
(細かいことを言うならストラテラしか処方できないお医者さんもいるので、何が処方できるお医者さんなのかも調べると良さそう)
www.mental-navi.net

すると、ADHDに診断されました。

先生の判断基準としては、幼い頃からそういった傾向があるか?
具体的なエピソードがあるか?
自分だけではなく、客観的なデータが存在するか?
という3点を見ているようでした。(あくまで客観的で何を見ていたのか詳しく聞いたわけじゃないので違うかもしれませんが)

私の場合、親がADHDだったということもあり、幼い頃の通知表を見せる必要は有りませんでしたが、
人によっては通知表に落ち着きがないなど書かれていたりするのが非常に重要な判断基準となるようです。

一発で診断されたい方は持っていったほうがいいでしょう。

ぶっちゃけ診断を受ける必要ある?


あります。
薬があるのと無いのとでは雲泥の差って人もいます。
自分の症状を認知することで向き合い方がかわれるのが一番大事というか、良かったなと思うことです。
例えば、仕事とか集中できないことや、忘れ物する理由、遅刻する理由すべてをADHDのせいに出来るので気が楽になります。
「そんなADHDとか大げさすぎw」って言う人の苦労をわからない人にも薬を見せれば一発です。
管理的なことや、細かい作業(誤字脱字の確認など)が苦手なのも分かったので無理してやらなくなりました。

薬に関しては、ぶっちゃけ、ADHDが治るわけでもないし、
効き具合いが人によっても違い、
副作用が酷すぎて薬が飲めない方もいますし、
薬を飲んで性格が変わってしまう人もいるので期待はしない方が良いかもしれません。

私の場合、そこそこ自分で気付けるぐらいには薬で症状が緩和されます。
洗濯で家の鍵を洗濯しなくなったのと、万年眠気が少しはマシになったのが嬉しかったです。

6ヶ月が経つと


病院に通うようになって薬を毎月処方されると、薬の量にもよりますが、毎月約1万円程かかります。
そこで通院して6ヶ月が経つと自立支援医療受給証と障害者手帳の申請が出来るようになります。
病院から説明があると思いますが、
地域支援庁舎などに行き、申請書を貰い、
病院に数千円(5千円くらいだったかな)払って申請書を書いて貰い、
申請書を書けば申請できます。

なんと、ADHD関連の医療費に限り、登録した薬局とその病院の負担費用が1割になります(確か所得にも寄るけどそのぐらい割引される)。
自立支援医療受給証(精神病院)最高かよ!
ちなみに発行されるのは大体申請してから約2~3ヶ月後に発送されてきます。(私は3ヶ月かかった)
申請さえしてしまえば、受給社証が届くまでの間、申請書の写しで1割負担を認めてくれる病院、薬局もありますので、そこは確認しておくとお得かも。

障害者手帳の利点


障害者手帳の利点は少ないですが、人によっては就職に有利に働きます。
ちなみに障害者手帳は発行に2~3ヶ月かかります。(私の場合はぎり4ヶ月かかった)
紙とカードそれぞれ障害者手帳があるのですが、紙の場合2ヶ月、カードの場合3ヶ月発行にかかります。
私はカードを選びましたが、なぜかというと紙の障害者手帳ADHDは洗濯してしまって使い物にならなくしてしまう方が結構多いからです。
私も洗濯してしまいそうだなと思ったので多少発行に時間がかかってもカードにしたほうが利点が大きいと思いカードを申請しました。

で、障害者手帳の具体的な利点ですが、
さまざまなサービスを安く受けられることです。
交通費が安くなるところも結構あるようです。調べてみると良いかもしれません。

shogaisha-techo.com

個人的に一番嬉しいのが映画館が安くなることです。
私はエヴァを見に行くんだッ!

help.tohotheater.jp

他にも地区によっては住民税・所得税の控除があったりします。
といっても精神障害者保健福祉手帳3級の場合軽度なので控除対象じゃない可能性もあるので各地区の障害者分類を要確認です。
年金とかそのまわりも安くなったりするのかとか、そのあたりはまだ私は詳しくないので分かり次第また記載しようと思います。

後、先程就職に有利になる方もいると書きましたが、必ずしも有利になるわけじゃないです。
軽度のADHDなら隠していたほうが偏見の目で見られることもなく良いかもしれません。
しかしながら、どこを面接しても必ずと言っていいほど落ちてしまうというような人は障害者手帳をアピールしても良いかもしれません。
なぜなら、障害者雇用率制度といって「常用労働者100人超の事業主」はある一定数障害者を雇う必要があるからです。
もし雇うべき障害者の人数を下回っていた場合、障害者雇用納付金として不足1人につき月額50,000円を国に収める必要があります。
なので比較的軽度なADHDは意外と重宝されます。(手帳もらってから転職活動したことはないので詳しいことは知りませんが)就職する際に多少は役立つのでは無いでしょうか。

まとめ


以上、ADHDの私が診断されて障害者手帳を貰うまででした!
今日はADHDの薬が効きってない時に記事を書いたので、支離滅裂、誤字脱字あったらすみません!
同じADHDに苦しめられる同士に訳にたてばとおもいます!
さよなら!

【自分用】筋トレ記

こんにちは、やまだたいし( やまだ たいし (@OrotiYamatano) | Twitter )です。
最近筋トレをしているのですが、栄養のとり方など覚えておきたいことが増えたので書いておこうと思い
今回はその時の知見を忘れない用紙したいと思い記事化しました。

目次


筋トレvs有酸素


有酸素運動は脂肪を減らす効果があるが、筋肉も減らしてしまう。
厳密には速筋を減らしてしまう。
遅筋は増えるが、速筋より細いため全体的に筋肉量は減ってしまう。

ビタミンB郡


運動をしているとビタミンB群が必要になったりする。
その中でも必要なのは水溶性のビタミンB。
脂質性のビタミンBは体から減りにくいため中々なくなることはない。

基本的にはビタミンB1が減らないように気をつけていれば大丈夫だと思う。
次にビタミンB2だが、比較的毎日摂りやすい卵や乳製品に含まれるため少しだけ気をつけていれば大丈夫。
筋トレをするときはビタミンB6も減りやすいが、まぁいっぱい食べてれば大丈夫。

ビタミンB1

豚肉、レバー、豆類、もやし、そば
糖質をエネルギー化、集中力、肩こり
不足すると怠くなる、夏バテのよう。疲れやすい、脚気、脳神経に影響、アルコールの代謝を行う
不足原因、コーヒー、白米
不足兆候→イライラ、食欲低下、浮腫、朝起きるのがつらい

ビタミンB2

豚レバー、ウナギ、乳製品、鶏肉、卵、納豆、ほうれん草、魚肉ソーセージ、鯖缶
元気のビタミン
不足すると健康維持をそこなう、脂質をエネルギー化できなくなる、アルコール消費できなくなる、口内炎、疲れ、ニキビ
不足原因、ストレス、ハードワーク
不足兆候→口内炎など皮膚に出る、眼に出ることも

ビタミンB6

バナナ、カツオ、マグロ
タンパク質をエネルギー化
不足すると、口内炎、脳波異常、疲れ、精神不安定
不足原因、殆どの食材に含まれるため不足し辛い
不足兆候→見られにくく、分かりづらい

ナイアシン(ビタミンB3)

たらこ、カツオ刺し身、豚レバー、エリンギ、ピーナッツ(主に肉や魚) 脂質、糖質、タンパク質わのエネルギー化、皮膚・粘膜など炎症防ぐ 不足すると、皮膚炎、食欲不振、消化不良 不足原因→アルコール。アルコールさえ取らなければ、肉や魚で摂取され、体内でも生成されるため不足し辛い 不足兆候→食欲不振、神経衰弱、不眠症

グルタミン


グルタミン酸ではなくグルタミン。
普通の人は減りにくい栄養素だが、筋トレをする人は超必要。

体に一番存在するアミノ酸で、言ってしまえば血液の中を漂う栄養素。
筋肉の分解を防ぐのだが、筋トレをする人は年中少なくなってしまう。
筋肉の分解を防ぐとともに、免疫力向上や傷の修復にも当てられる。
つまり、不足すると風邪をひきやすくなってしまう。
とりすぎは良くないが、風邪をひきそうな時はとった方が良いかも!

cp.glico.jp

筋肉がつくタイミング


筋肉は自分の持ってる限界以上の力を使おうとしたときに筋肉がつく。
逆に言えば、自分の限界以下の力を使おうとするものは有酸素運動に変わってしまう。
有酸素運動をして筋肉痛になる人は筋トレと同じくまずは速筋がつく。

つまり、筋肉がない人は何をしても筋トレになる。
逆に筋肉がある人はどれをしても有酸素運動になるので、負荷を上げ続ける必要があるっぽい。

巷では超回復と言って一度筋肉を破壊してから栄養を摂取して筋肉を直し、筋肉を増やすと言われているが、
実はもうその認識は古い。

筋肉は破壊されながらも回復しているため、筋トレ前1時間にプロテインなどを摂取し運動し、運動後もプロテインを摂って栄養補給するのが好ましいらしい。

タンパク質と脂質と炭水化物


体重を減らすにはタンパク質を摂って脂質と炭水化物を摂るべしと言われるが半分正解。
半分間違いだ。

まず、運動をせずにタンパク質を多量に摂った場合もカロリーオーバーで太る。
大事なのはカロリー計算。
そして、バランス。

また筋肉量が増えると体を動かしたときのカロリーが増える。
俗に言う基礎代謝があがるということだ。

リバウンドしない体を手に入れるにはカロリー計算をしながらカロリーを摂取し、筋トレをして基礎代謝を上げて脂肪を減らすのが理想的だ。
カロリーのバランスはPFCバランスなどで調べれば出てくる。

とはいえ、現代人はタンパク質が不足しがちなためか、毎日3回プロテインを摂取するようにしただけで、体脂肪が減ったなどという研究結果もあるようだ。
まずはタンパク質を摂ることから初めてはいかがだろうか?

タンパク質と脂質


タンパク質を摂ろうとすると出てくるのは敵である脂質である。
動物の肉を食べたり、魚を食べると一緒に大量の脂質を摂取してしまう。
では、どうすればいいかというと、脂質の少ない箇所を食べることになるのだが、毎日鶏のササミなどでは飽きてしまう。

では、どうするか。
そこで出てくるのがプロテインだ。

悪いプロテインもあるため成分表をよく見てほしいのだが、牛乳をベースに作られたホエイ、カゼイン、大豆ベースのソイプロテインなどがある。
ホエイにも種類があるのだが、割愛。

お腹が緩くなる人はホエイでも緩くならないタイプのプロテインがあるし、ソイプロテインを飲んでも良い。
プロテインって飲んで体が悪くならないのか?大丈夫なのか?って不安になる人もいるだろう。私もしらべた。

調べる限り、腎臓病などを患って居ない限り、吐き気を催すレベルで大量に摂らない限りは大丈夫そうだ。
体に合わない人も超少数だが存在するらしい。
合わない人はそもそも普通に生活してて、プロテイン以外でも体に症状が出てしまうぐらいの人だと思うので、基本大丈夫だ。
体に合わない人の代表格としてYoutuberのぷろたんとかが、そうだった気がする。
気になる人は食事でできるだけタンパク質をとり、不足分をプロテインで補うようにすればいいと思う。
でも、計算すると、毎日1枚半ぐらいの鶏むね肉を消費する計算になる。さらに鶏むね肉にも脂質があるので脂肪がつきやすい……。ので、プロテインに頼らない生活はけっこう大変そうだ。
ちなみに筋肉を合成するには少量の脂質が必要になる。
良質なオリーブオイルやサバ缶の油などが体には良いらしい。
とはいえ普通の食生活をしていると何も意識しなくても油はとりがちなので全く摂らないぐらいの気持ちで、外食など際のみ気にせず食べるぐらいの気持ちのほうが良いと思う。
アスリートを目指したいなら別だが。

タンパク質と炭水化物


炭水化物は悪にされやすいが、PFCバランスでは30%と中々多い量を占める。
実は炭水化物は悪ではない。
悪なのは糖質だ。

どう違うのかというと、糖質は炭水化物の一種なのだ。
じゃあ、ソレ以外の炭水化物は何なのかというと食物繊維だ。

なにがどう悪いのか分かった人も居るのではないだろうか。
そう急激に血糖値が上がる食べ物が良くないのだ。
食物繊維の場合体にゆっくりと吸収されるのに対し、ただの糖質は良くない。

まぁ、とはいえ、炭水化物も取り過ぎは良くないので注意は必要。
飲み物なんかでも、野菜ジュースに含まれてたりするので注意が必要。
というか、野菜にも炭水化物は入っているからね。

筋トレ後、炭水化物とタンパク質は一緒に摂るべし。
血中に収まりきらなくなった糖(ブドウ糖)はどこに消えるかというと、一部は尿として排出されるが、一部は脂肪として蓄えられる。
しかし、このブドウ糖、筋肉が作られるときに利用される。
その必要なときに糖が足りないと筋肉になりきらない状態になってしまう。
つまり!炭水化物を摂るなら!運動前!食事で摂った炭水化物は3時間ほどで吸収されるらしい?(詳しくない)ので、運動前2時間ぐらいに摂取すると良いかもしれない。
タンパク質も一緒に摂るとなおよし。
ガリガリで普段食べれない人はマルトデキストリンというものをプロテイン一緒に運動1時間前に摂取すると良い。

マルトデキストリン


プロテインの炭水化物verである。
原材料はデンプンらしい。

まとめ


自分専用にまとめてみた。
本当はもう少し知っていることもあるが、とりあえずこの程度にしておく。
私はマッチョではないし研究者でも論文を読み切った人でも、栄養調理師免許を持ってるわけでもない。
参考にする人は、よく考え、自分で調べ、人に聞いて実践すると良いかもしれない。
私自身無責任なことを言う人は好きではないので出来る限り、自分の納得した情報のみをまとめたつもりだが、時代とともに認識は古くなることもあるし、私自身間違っている可能性もある。
だから、参考にする人には気をつけて欲しい。
特に持病がある人は医者への相談をおすすめします。

【自分用】Git,Git-Svnの使い方

こんにちは、やまだたいし( やまだ たいし (@OrotiYamatano) | Twitter )です。
Git-Svnの使い方を忘れてしまうので自分用のメモです。

目次


GitSVNの使い方


GitSVNの構築


SVNの構築をした後に

git svn clone -s https://サーバーアドレス

と入力する。

すでにコミットがある場合はでかすぎるて動かない場合があるので、
動かない時はコレを使う。 qiita.com

リポジトリを作ってからフェッチする方法もある。

GitSVNの更新


git svn rebase

でgit pullと同様の動作が行われるっぽい?

GitSVNでPush


git svn dcommit

でgit pushと同様の動作が行われるっぽい?

Gitの使い方


変更ファイルをステージングへ


git add

ステージングから取り消し


git reset HEAD

(ローカルに変更は残る)

新規追加ファイルを完全に消す


ステージングに上げてない場合、rmコマンドで消すだけ。

ローカルの変更退避


git stash

git worktreeとかいうのも使えるけど……。

コミット

git commit -m "~~~~"

コメントを別で上げる場合は、-m オプションはいらない。

前回コミット修正


(git addなどをしてから)

git commit --amend

コメントだけ修正したい場合

(git addなどをしてない状態で)

git commit --amend

git comment --amend -m "aaaa"

複数のコミットをまとめる

(履歴も消えるので要注意)

git rebase -i HEAD~4

指定したコミットをまとめる。
上記の場合、Headを含む4つ。

pick →何もしない
fixup → 上のpickコミットにまとめる
squash → 上のpickコミットにまとめるコミットメッセージの統合も行う

ログを見たい

git log

コミットする前に変更を見たい

git status

差分を見たい

git diff xxxx..yyyyy

git diff head^..head

差分ファイル名前だけみたい

git diff head^..head --name-only

ステージングとの差分を見たい

git diff --staged

Conflict時の解決


自身の変更を適用したい時

git checkout --ours ~~~~~~

相手の変更を適用したい時

git checkout --theirs ~~~~~~

マージしたい


git merge xxxx

xxxx を現在のブランチにマージする

Checkout 本当は別コマンドに慣れたい


kakakakakku.hatenablog.com

git のバージョンを調べる


git --version

gitのバージョンアップ


(windowsの場合)

2.13でコマンドが実装されてるはず……。

git update-git-for-windows

gitで認証情報を保存しておく


credential.helperで保存しておける。

(SSHの場合でGitHub,Windowsの場合)

git config --global credential.helper wincred

で保存される。
wincredという補助ツールらしい?
Windowsの認証情報を保存しておくやつを利用する

git config --global credential.helper cache

タイムアウトするまで使える。デフォでは15分?

GitLFSの認証情報を保存しておく


ssh-add /Users/user_name/.ssh/id_rsa

何か怒られたら?

eval ssh-agent

↑をしてから実行

まとめ


とりあえず、思い浮かんだものだけ。
cherrypickとかについてもいずれ書く。
今後も詰まったら追加していきたい。

社内勉強会が廃れる会社で社内勉強会主催して”いる"

こんにちは、やまだたいし( やまだ たいし (@OrotiYamatano) | Twitter )です。
社内勉強会を主催して1年経ったので振り返りをしていこうと思います。

↓去年の記事
orotiyamatano.hatenablog.com

目次


あれからどうなったのか


粛々と勉強会を続けています。
コロナで一度は途切れましたが、とりあえず1年継続できました。よかったです。

-完-

これで終わりたいですけど、これだけじゃ振り返りにならないですね。
真面目にやります。

現在やっていること


以前やっている内容はこう↓でした。
内容:読書会
小規模の勉強会:5~8人(運営合わせて)
参加募集先:社内エンジニアが集う68人のSlackグループ(+新人7名くらい)
運営:3人(+アドバイザー1人)
枠:30~45分(伸びる時がある)昼休み時間(毎週水曜日)
補足:社外端末利用不可、ノートPCを皆持ってるわけではない
場所:会社会議室
スタンス:有志

現在はこう↓です。
内容:座談会・LT会
小規模の勉強会:6~15人(運営合わせて)
参加募集先:社内全員にメール(約250人)
運営:4人(+アドバイザー1人)
枠:40分昼休み時間(2週間に1回、水曜日)
補足:夜に主催することもある
場所:オンライン,Zoomでの開催
スタンス:有志

ぶっちゃけ規模は変わっていませんが、だれでも参加しやすい内容になったことと、オンラインになったことで大分運営の仕方が変わりました。

コロナでオンライン開催に

コロナで去年3月ごろから弊社ではリモートワークになりました。
割とすぐに収束すると思っていたのですが、一向に収束しなかったため、確か5月頃からオンラインで勉強会を主催することにしました。

オンライン開催をするにあたって、人が集まるか、そもそもオンラインで主催して良いのか?
色々不安でしたが、基本的に上の役職の人達は我関せずと言った感じだったので勝手に主催していました。

オンライン開催にする時に会社に読書会の本を置いてしまっていたということもあり、読書会の再開が困難だったため、
運営に負担がかからない&コミュニケーションが活発に出来る&誰でも参加しやすいを満たす会を主催したいと思い、座談会を企画しました。
ここでいう座談会とは、何かをテーマに皆で話し合うという内容です。

具体的には、情報共有を活発化するにはどうしたら良いか、リモートワークでのコミュニケーションの取り方について、プログラマーに言ってやりたいこと等です。

テーマは都度運営側で決め、その内容についてGoogleアンケートにて集計をとり、参加者のそれぞれの意見を聞くという流れです。
話した内容は録画を行いスライド資料に貼り付けて社内に向けて共有するようにしました。

Slackの活発化

オンラインで仕事をするにあたって会社全体で運営するSlackワークスペースが立ち上がりました。
それに伴って社内勉強会運営チームは社内勉強会用のチャンネルを作って、業務知識やウェブで知り得た情報をシェアできるようにしてみました。
すると、徐々にではありますが、人が集まり現在確か22名参加してくださいました。

また社内勉強会チャンネルとは別にShader勉強部屋というチャンネルを作りShaderについてのアウトプットをするようにしたところ、
数人しか集まらないと思っていたのですが、こちらも34名の方が参加され、デザイナーやディレクター、プログラマーが集まりました。
投稿メンバーは少ないですが皆の興味の関心度が伺えます。

閲覧者の可視化

オンラインでの勉強会の主催するにあたって、
話した内容は録画を行いGoogleスライド資料に貼り付けて社内に向けて共有するようにしたことで、
閲覧者数が見れるようになりました。

それで誰がどんな話題に興味があり、皆がどんな話題に注目しているのかがなんとなくわかるようになりました。
まだ完全に活かせてはないですが、毎回の振り返りで使える有用なデータになりました。

運営チーム1人追加

追加したからって何か変わったわけじゃないですが、ローテーションで役割分担出来るようになったのはデカイ気がします。
後、新しく入った運営はデザイナーさんで、プログラマーだけで運営は構築されていたので、新しい考えを聞けるので良かったのではないかと思います。

議論の活発化

以前はファイブフィンガーを行ってようやく若手社員からお話を聞くことが出来ました。
話を引き出すために礼儀など気にせずにフランクに話しかけ、率直に意見を言うように心がけていたのですが、
今やファイブフィンガー無しでも議論が活発化しすぎて、お昼休みをオーバーしてしまうことがあるぐらいです。
(それはそれで問題なので、なんとかしないとって感じではありますが、)活発に議論が出来ているのは良いのではないかと思います。

出てきた課題

皆が話せる話題にしたところ、逆にターゲットが絞れていないという問題点や、ネタ切れが起こり始めています。
毎回運営サイドでネタを準備するのにも無理がありますし、皆が話せるネタというのも限界があります。

かといって、コアな話や会をしたい時に社員の誰がどの程度知識を持っているのか分からず、
深い話がし辛い状況になっています。

仮に深い話をしようとしても誰か社員のメンバーに頼むか、運営サイドである程度話せる人が居ないといけません。
そうなると必ずしも運営サイドで知識を深く持ってる人がいるとも限らないですし、頼むにしても話したがる人がいるのか、誰が知識を持っているのかさえ、分からないという状況です。
座談会としては中々回すのが難しくなってきます。

今後の方針


色々模索する必要がありますが、結果的に読書会に戻るのが楽なんじゃないかと思い始めています。
LT会なども企画している最中ですが、「話してくれる人が少ない」、「話す人が話すメリットが得られない」、
「運営サイドが一々登壇者にリマインドなどをしないといけないため負荷が高い」などといった理由から、LTもやるとしても頻度は低めが良さそうです。

読書会の場合、誰しもが知識を持っていなかったとしても、その場で勉強するため、最低限の知識をその場でつけることが出来ます。
誰がどの程度理解しているかを探り合う必要もなく、前提知識を持ち合わせている状態で話が出来るので議論の活発化を促しやすく進めるのが非常に楽です。
しかも、その場にいる人だけではなく後に資料を共有された人たちにも勉強になり資産になります。
そういった理由から読書会を復活させるべきじゃないかと私は考えています。

まぁ、何にしても座談会はマンネリ化してきているので新しい手を考えたいです。

勉強会を1年してきて思ったこと


めっちゃ大変

単純にお昼休みだけ使って会議などをしていましたが、資料作成や次の会の企画を考えたりなどがあり、
お昼休み中にしか作業をしなかったとしても大分負荷が大きいことに気が付きました。
(更に会の改善をしようと思ったら一筋縄ではいかない)

会社として社内勉強会に使っている時間を業務時間中に含めてもらうことさえ出来ればもう少し楽できるのですが、
案件ごとの決められた工数などもありソレは難しい状態にあります。
あー、なんとかならないかなぁ……。

社内で有名人(?)に

特に私は社内勉強会の中心人物になって動いているため、社内での私の認知度があがった気がします。
(詳しいことは知らないですが)会社のリーダー陣が集まる会議でも度々私の名前が挙がることがあったらしいです。

後、私の勘違いかも知れませんが、多少気軽にSlackでやりとりしてくれる人が増えた気がします。
動画ででも姿を共有出来れば親近感が湧くのかも知れないですね。

まとめ


なんだかんだ、1年断続的ではありますが、社内勉強会を続けることが出来ました。
もっと技術的な話をしたいですし、もっと会社にノウハウを蓄積できるような仕組みを作りたいなど
やり方が見えない課題が残っていますが、とりあえず試す、失敗する、試すというループが回るようになったように思います。
かなり大変でやる意味はあるのかもはや手応えが感じにくいのですが、
きっと私が活動し続けることで他の起爆剤と化学反応を起こし、もっとより良い勉強会になると信じて進んで行くのが大事だと思っています。
引き続き社内勉強会の主催を頑張っていきたいと思います。

読んでいただき、ありがとうございました。

後、何か弊社ではこんな風に進めているよ等、いい進め方あったら教えて下さい。
参考にします。
以上、やまだたいしでした。

Unityでルール画像を使ってフェードイン、フェードアウトさせる

こんにちは、やまだたいし( やまだ たいし (@OrotiYamatano) | Twitter )です。
前に社内勉強会があり、その際にShaderのプレゼンをしたのですが、業務にも使えそうなShaderの使い方を教えて欲しいと言われたので
今回は簡単なフェードイン、フェードアウトのリポジトリを作ったのでソレの解説です。

github.com

目次


前提


利用プラグイン

UniRxとDOTweenの無料のものを使っています。
どちらともライセンス表記が必須です。

Unityバージョン

Unity2019.4.16fで動作確認。多分DOTweenとUniRxが動けば、ほぼどのバージョンでも動くと思います。

リポジトリ


github.com

サンプル


ボタンを押すとフェードイン、フェードアウトをトグルするものを作りました。

f:id:OrotiYamatano:20210124215702g:plain

Shaderの解説


f:id:OrotiYamatano:20210124235235p:plain

Disolve(RGB)にルール画像を設定するとその設定されたルール画像の輝度に応じて、フェードされます。

edoさんのディゾルブShaderを参考にしました。

qiita.com

コードは以下の通り。

// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'

Shader "Custom/Dissolve" {
    Properties {
        _Color ("Main Color", Color) = (.5,.5,.5,1)
        _MainTex ("Base (RGB)", 2D) = "white" {}
        _DissolveTex ("Desolve (RGB)", 2D) = "white" {}
        _CutOff("Cut off", Range(0.0, 1.0)) = 0.0
    }

    SubShader {
        Tags { "RenderType"="Opaque" "Queue"="Transparent" }
        Pass {
            Name "BASE"
            Cull Off

            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            #include "UnityCG.cginc"

            sampler2D _MainTex;
            float4 _MainTex_ST;

            sampler2D _DissolveTex;
            float4 _DissolveTex_ST;

            float4 _Color;
            float _CutOff;
            struct appdata {
                float4 vertex : POSITION;
                float2 texcoord : TEXCOORD0;
                float3 normal : NORMAL;
            };

            struct v2f {
                float4 pos : SV_POSITION;
                float2 texcoord : TEXCOORD0;
                float2 dissolvecoord : TEXCOORD1;
            };

            v2f vert (appdata v)
            {
                v2f o;
                o.pos = UnityObjectToClipPos (v.vertex);
                o.texcoord = TRANSFORM_TEX(v.texcoord, _MainTex);
                o.dissolvecoord = TRANSFORM_TEX(v.texcoord, _DissolveTex);
                UNITY_TRANSFER_FOG(o,o.pos);
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                fixed4 col = _Color * tex2D(_MainTex, i.texcoord);
                fixed a = Luminance(tex2D(_DissolveTex, i.dissolvecoord).xyz);
                if (_CutOff > a) {
                    discard;
                }

                return col;
            }
            ENDCG           
        }

        Pass {
            Tags { "LightMode" = "ForwardBase" }

            Name "Add"
            Cull Off
            Blend One One

            CGPROGRAM
            #pragma vertex vert

            #include "UnityCG.cginc"

            sampler2D _MainTex;
            float4 _MainTex_ST;

            sampler2D _DissolveTex;
            float4 _DissolveTex_ST;

            float4 _Color;
            float _CutOff;
            float _Width;

            struct appdata {
                float4 vertex : POSITION;
                float2 texcoord : TEXCOORD0;
                float3 normal : NORMAL;
            };

            struct v2f {
                float4 pos : SV_POSITION;
                float2 dissolvecoord : TEXCOORD0;
            };

            v2f vert (appdata v)
            {
                v2f o;
                o.pos = UnityObjectToClipPos (v.vertex);
                o.dissolvecoord = TRANSFORM_TEX(v.texcoord, _DissolveTex);
                return o;
            }
            ENDCG           
        }

        Pass {
            Tags { "LightMode" = "ForwardBase" }

            Name "Add"
            Cull Off
            Blend One One

            CGPROGRAM
            #pragma vertex vert

            #include "UnityCG.cginc"

            sampler2D _MainTex;
            float4 _MainTex_ST;

            sampler2D _DissolveTex;
            float4 _DissolveTex_ST;

            float4 _Color;
            float _CutOff;
            float _Width;

            struct appdata {
                float4 vertex : POSITION;
                float2 texcoord : TEXCOORD0;
                float3 normal : NORMAL;
            };

            struct v2f {
                float4 pos : SV_POSITION;
                float2 dissolvecoord : TEXCOORD0;
            };

            v2f vert (appdata v)
            {
                v2f o;
                o.pos = UnityObjectToClipPos (v.vertex);
                o.dissolvecoord = TRANSFORM_TEX(v.texcoord, _DissolveTex);
                return o;
            }

            ENDCG           
        }
    } 

    Fallback "VertexLit"
}

fixed a = Luminance(tex2D(_DissolveTex, i.dissolvecoord).xyz);

の部分で_DissolveTexの輝度を計算しています。

_CutOffより小さい場合、描画せずに処理を中断しています。

トランジションの処理の解説


コード

        public class Transition : MonoBehaviour,IUtilTransition{
            [SerializeField] private Material transitionMaterial;
            public delegate void Callback();
            private Callback callbackComplete;
            private static readonly int Property = Shader.PropertyToID("_CutOff");
            private float TransitionRate { get; set; }
            private bool IsFade { get; set; }

            private void Start() {
               if (transitionMaterial == null) {
                   Debug.LogError("Transition.cs:マテリアルが設定されてない");
               }
               this.ObserveEveryValueChanged(x => TransitionRate).Subscribe(_ => {
                       transitionMaterial.SetFloat(Property, TransitionRate);
                   }
               ).AddTo(this);

            }
            
            private void OnApplicationQuit(){
                transitionMaterial.SetFloat(Property, 1.0f);
            }

            public bool IsActiveFade() {
               return IsFade;
            }

            /// <summary>
            /// カットアウトさせる
            /// </summary>
            /// <param name="startVal"></param>
            /// <param name="endVal"></param>
            /// <param name="duration"></param>
            public IUtilTransition Fade(float startVal,float endVal,float duration) {
                IsFade = true;
                TransitionRate = startVal;
                DOTween
                    .To(() => TransitionRate, (x) => TransitionRate = x, endVal, duration)
                    .SetEase(Ease.InOutSine)
                    .OnComplete(() => {
                        IsFade = false;
                        callbackComplete?.Invoke();
                    });
                return this;
            }

            /// <summary>
            /// 完了
            /// </summary>
            /// <param name="action"></param>
            /// <returns></returns>
            public IUtilTransition Complete(Callback action) {
                this.callbackComplete = action;
                return this;
            }

            /// <summary>
            /// フェードアウト
            /// </summary>
            public IUtilTransition FadeOut() {
                return Fade( 0, 1,0.2f);
            }


            /// <summary>
            /// フェードイン
            /// </summary>
            public IUtilTransition FadeIn() {
                return Fade(1, 0,0.2f);
            }
        }

TransitionRateの値が変わったらマテリアルに対して
カットオフの値を設定することで段々と透過するようにしています。

DoTweenのOnCompleteが呼ばれた際に続けてデリゲートでcallbackCompleteを呼ぶことでフェードの終了後にCompleteで処理を行うことが出来ます。

トランジション処理を呼び出す側


コード

public class PressButton : MonoBehaviour {
    [SerializeField] 
    private TransitionFade.Transition transition;
    private IUtilTransition fadeObj;   //Unityは早くインターフェースでSerializeField使えるようにして欲しい……
    private bool isDoneFade;

    private void Start() {
        Button btn = GetComponent<Button>();
        fadeObj = transition;
        
        //ボタンが押されなおかつ、フェード中ではない?
        btn.OnClickAsObservable().Where(_ =>!fadeObj.IsActiveFade()).Subscribe(_ => {
            if (isDoneFade) {   
                //フェードが完了してたら、フェードインする
                fadeObj.FadeIn().Complete(() => {
                    isDoneFade = false;
                    Debug.Log("フェードイン終了");
                });
                return;
            }

            //フェードが行われてなかったら、フェードアウトする
            fadeObj.FadeOut().Complete(() => {
                Debug.Log("フェードアウト終了");
                isDoneFade = true;
            });
        });
    }

}

別にインターフェースを使わなくても良いんですが、一応定義しておいたのでインターフェースの変数で色々処理をしています。

処理は注釈通りです。
UniRxの処理が重なって分かりづらい方も居ると思いますので念の為解説すると
ボタンが押された時にフェード処理の場合tureを返すfadeObj.IsActiveFade()という関数を見た上で
フェード中でなければフェードインもしくはフェードアウトを行う用にする処理しているというのが上記のスクリプトの内容になっています。

フェードするスピードや始まりの値を変えたい場合、FadeInやFadeOut関数を呼ばす直接Fade関数を呼んで、各値を設定してもFadeが出来ます。

まとめ


簡単なShaderのスクリプトでフェードイン・フェードアウトを実現しました。
Scene遷移時などパッと画面が変わってしまうと味気ないので、黒い画像へのフェードを挟むだけでもある程度見た目が良くなると思います。
参考になればと思います。以上です。