【Unity】STYLY VRでフェードイン・フェードアウトをつくる【STYLY】

#はじめに
[STYLYアドベントカレンダー](https://qiita.com/advent-calendar/2021/styly)3日目の記事になります！

VR/AR/MRクリエイティブプラットフォーム「STYLY」VRでフェードイン・フェードアウトを作ります。
STYLYでは**C#が使えないため、ロジックの部分は「PlayMaker」というAssetを使っての実装**になります。

こんな感じです↓
![Videotogif (2).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293639/8a3b0810-3977-cbc1-5d00-3ffde69af5c6.gif)



#この記事で作るもの
今回作るのは数秒ごとに画面がフェードイン・フェードアウトするサンプルです。
まずはサンプルを見てみましょう。

[Web版](https://gallery.styly.cc/scene/4c84bfd8-c7ce-4d52-9cd3-6fc78e716ab7)
[![1na4stDP.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293639/ec490a5c-ae02-8c31-91bc-2d089bdf12ec.png)](https://gallery.styly.cc/scene/4c84bfd8-c7ce-4d52-9cd3-6fc78e716ab7)

Web版ではカメラ追従がうまくいかないため、フェード用の板がワールドに配置してあるだけになります。

[VR版](https://gallery.styly.cc/scene/e4eea17c-3dd5-4979-9d00-5a95bae07fe0)
VRで見るとフェードイン・フェードアウトしてくれます。

全体の構成として、フェード用の板を作りカメラに追従させることで実現させています。

#フェードイン・フェードアウトの作成
###フェード用Quadの作成
はじめに画面を隠す用のオブジェクトを作成します。
Hierarchyで右クリック。「3D Object-> Quad」を選択します。
そうすると四角い板のようなGameObjectが作成されるのでPositionを(0, 0, 0.5)。Scaleを(3, 3, 1)に設定してください。
![スクリーンショット 2021-12-01 235640.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293639/5248b8b2-644d-7e9f-f867-92f59a025651.png)

###フェード用Materialの作成
このままではQuadのalpha値が使えないのでMaterialというものを作成します。
Projectで右クリック。「Create -> Material」を選択します。名前は「FadeMaterial」にしておきましょう。
選択するとInspectorに「Standard」と書いてあるタブが存在するのでクリック。「UI -> Default」を選択してColorを(0, 0, 0, 255)にしてください。
![スクリーンショット 2021-12-02 000234.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293639/361ef759-0687-5d18-d15a-3173d9c4545b.png)

###Materialのアタッチ
さきほど作ったFadeMaterialをQuadに適用します。
Projectにある「FadeMaterial」をQuadにドラッグ＆ドロップします。
SceneのQuadがグレーからブラックに変わればOKです。
![スクリーンショット 2021-12-02 024329.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293639/eca17b68-cc1e-6846-4d5c-18b8b3e778ff.png)

##PlayMakerFSMの作成
ここからはPlayMakerを使ったロジックの作成をしていきます。

###PlayMakerのアタッチ
HierarchyにあるQuadを選択後、InspectorからAddComponentをクリック。
「PlayMakerFSM」で検索をかけて追加します。名前は「CameraFadeFSM」にしましょう。
![スクリーンショット 2021-12-02 030750.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293639/5f4e617d-5b64-69f7-e71f-27607b283a90.png)

##Initializeステートの作成
追加したPlayMakerFSMのEditをクリックするとこんな画面が現れます。
この画面でロジックの設計をしていくことになります。
![スクリーンショット 2021-12-02 031240.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293639/d85348be-ed15-1c4d-d0f4-45203953e5a3.png)

では、「State 1」を選択して「Initialize」という名前にリネーム。
右下の「ActionBrowser」から「GetMainCamera・GetMaterial・SetParent」の3つを追加しましょう。

GetMainCameraの「StoreGameObject -> NewVariable...」を選択し「MainCamera」と入力。
GetMaterialの「StoreGameObject -> NewVariable...」を選択し「FadeMaterial」と入力。
SetParentのParentから「MainCamera」を選択。チェックボックスは「ResetLocalRotation」にだけチェックをつけておきましょう。
![スクリーンショット 2021-12-02 032556.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293639/1cbc972c-b379-249c-68ee-ec469fd6e20f.png)

##Idleステートの作成
それでは新規ステートを作成してみましょう。
何もないところで右クリック。「AddState」を選択するとステートが作成されます。

「Idle」にリネーム後、「Wait」アクションを追加し、Timeを「5」にしておきます。
赤いエラーはいったん無視で良いです。
![スクリーンショット 2021-12-03 120605.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293639/a67730dd-fc91-66b6-0d77-0919bf56a4bd.png)


##InitializeとIdleをつなぐ
Initializeを選択後右クリックし、「AddTransition -> FINISHED」を選択。
FINISHEDを右クリック長押しで矢印が伸びるようになるのでIdleとつないであげます。
![スクリーンショット 2021-12-03 120730.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293639/d32e9151-4ccb-f465-5b30-af2e75e7af7b.png)

こうして繋いでいくことでイベントが遷移していきます！
さきほど赤エラーはTransitionが追加されてないことが原因なので、このタイミングでIdleにも「FINISHED」を追加しておきましょう。

##StartFadeOutステートの作成
「StartFadeOut」という名前のステートを新規作成後、ActionBrowserから「ColorInterpolate・SetMaterialColor」を追加しましょう。

ColorInterpolateのColorには「2」と入力。Element0には(0,0,0,0)、Element1には(0,0,0,255)を入力。
Timeは「5」、StoreColorは「StoreGameObject -> NewVariable...」を選択し「FadeColor」と入力。
FinisiEventは「FINISHED」を選択。RealTimeにチェックを入れます。

SetMaterialColorのMetarialIndexは「0」。Materialは「FadeMaterial」を選択。
Colorは「FadeColor」を選択しEveryFlameにはチェックを入れます。

これで5秒間かけて透明から黒に変化するようになりました！
![スクリーンショット 2021-12-03 124133.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293639/ed28be1d-3016-8f1f-1017-0d904141c2ce.png)

##Waitステートの作成
「Wait」という名前のステートを新規作成後、ActionBrowserから「Wait」を追加しTimeに「1」と入力します。
このステートを挟むことによってフェードアウトの状態を1秒間保持することができます。
![スクリーンショット 2021-12-03 124515.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293639/b4d02dcf-bb5a-646d-23bf-c30869cb0c4b.png)

##StartFadeInステートの作成
StartFadeOutを選択後「Ctrl + D」または「コピー＆ペースト」で複製します。
名前は「StartFadeIn」に変更しておきましょう。

カラー情報を反転させたいので、Element0には(0,0,0,255)、Element1には(0,0,0,)を入力。
最後にIdleに矢印をつないでループできるようにしたら完成です！
![スクリーンショット 2021-12-03 130034.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293639/52b902ad-eb0e-6e38-da2b-27ddcc097268.png)

#アップロード前に
##動作チェック
完成したものを動かしてみましょう。
ゲームシーンを再生するとQuadがMainCameraの子要素に入るはずです。
これはInitializeステートの「SetParent」Actionの効果です。

そしてフェードインアウトしていればロジック部分は問題ありません！
![Videotogif (3).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293639/e1774e11-6225-a480-4f3e-d04abf976dd4.gif)

###Materialの再設定
気づいた方もいるかもしれませんが、このままだとゲームシーン再生直後のQuadが真っ黒な状態です。
序盤に作成した「FadeMaterial」のカラーが(0,0,0,255)となっているためです。(0,0,0,0)に変えておきましょう。

#最後に
長くなりましたがお疲れさまでした！
今回作ったロジックを応用して好きなタイミングで実行したり、真っ暗な状態でワールドに変化を起こしたりできると作品作りの幅が広がると思います！
例として僕が作った作品のリンクを張っておきますので参考にしてみてください～～～。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">ルーペをつかい世界の断片をさがしだす体験型VR作品「World Fragments」を作成しました！<br><br>現実にレイヤーを付与する技術である「AR」について考えてきた僕が、「レイヤー」をテーマにした人生初のVR作品です。<br><br>体験方法はリプ欄に続けます↓<a href="https://twitter.com/hashtag/NEWVIEWAWARDS2021?src=hash&amp;ref_src=twsrc%5Etfw">#NEWVIEWAWARDS2021</a> <a href="https://twitter.com/hashtag/VR?src=hash&amp;ref_src=twsrc%5Etfw">#VR</a> <a href="https://twitter.com/hashtag/XR?src=hash&amp;ref_src=twsrc%5Etfw">#XR</a> <a href="https://twitter.com/hashtag/STYLY?src=hash&amp;ref_src=twsrc%5Etfw">#STYLY</a> <a href="https://twitter.com/hashtag/NEWVIEW?src=hash&amp;ref_src=twsrc%5Etfw">#NEWVIEW</a> <a href="https://t.co/IdUbIJoC20">pic.twitter.com/IdUbIJoC20</a></p>&mdash; ふぉーみ (@Four4_mm) <a href="https://twitter.com/Four4_mm/status/1455159330462842880?ref_src=twsrc%5Etfw">November 1, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>