うどんてっくメモ

技術的なメモをまったりと

【C#】開発を加速させる便利な定義済みRiderライブテンプレートの紹介【Unity】

Riderのライブテンプレート機能、みなさんは使っていますでしょうか?
自分はUnityの開発においてかなり活用していて、これなしでは生きていけない体になっているのですが、職場で思ったより活用されてなかったので紹介記事を書きました。
本記事はライブテンプレートの中でも予めRiderが用意してくれている定義済みのライブテンプレートを紹介します。

ライブテンプレートとは

ライブテンプレートはいわゆるコードスニペットのようなコードの定型を生成する機能になります。
ifやforといったおなじみの定型構文やプロパティの定義などの同じようなコードを量産する上でそれらを事前に定義したテンプレートにしたがって生成してくれます。 ライブテンプレートが強力なのが、テンプレート内の変数の扱いです。テンプレートの一部を変数にして定義することができるのですが、その変数について生成するタイミングでコードの文脈から任意の値を挿入したり、入力カーソルの位置をよしなに合わせたりすることができます。どういうことかよくわからないという方はこの後紹介しているライブテンプレートの挙動を見てもらうとわかりやすいです。

ライブテンプレートの定義はPreferencesのEditor -> Live Templatesで確認できます。

f:id:myudon:20210311223828p:plain

ここでテンプレートの追加や削除、編集が行えます。テンプレートごとにDescriptionが設定されており、ライブテンプレートを使ってコードを挿入したい時にはそのDescriptionを入力するとRider側から提示されます。

f:id:myudon:20210311224042p:plain

そして、ライブテンプレートには汎用的に使えるものとしてあらかじめRider側に標準で定義されているものがあります。今回はその一部で筆者が使っているものを紹介します。

C#の定義済みライブテンプレート

まずはUnity問わず使えるC#のライブテンプレートについて紹介します。基本文法に関するものが多いです。

for

シンプルながらも便利度が高いのがfor文のライブテンプレートです。

f:id:myudon:20210311215406g:plain

for文のスコープがささっと生成され、中身もいい感じに定義しちゃえます。

forr

逆順のforループが必要なことがあったりしますが、その時にはrを一つ多くつけると逆順のfor文を生成してくれます。

f:id:myudon:20210311215406g:plain

foreach

foreachでループを書きたい場合はこちらです。

f:id:myudon:20210311221752g:plain

prop

プロパティをささっと作れるのがpropというライブテンプレートです。getterとsetterを含めた定義部分を生成してくれます。

f:id:myudon:20210316145322g:plain

prppg

プロパティの定義でsetterだけprivateにしたいというのもよくあるパターンです。その際にはpropの後ろにgをつけてあげます。

f:id:myudon:20210316145903g:plain

個人的にはこっちの方がよく使うかなという印象です。

if

コード内の任意の要素を用いてif文を書くというのは何回でもあるケースですが、そんな時の実装の手間を少し抑えてくれるのがifのライブテンプレートです。

f:id:myudon:20210311224910g:plain

Unity用の定義済みライブテンプレート

Riderの強みと言えばUnityの開発に対する手厚いサポートです。ライブテンプレートについてもUnity用のものがいくつか存在します。

sfield

SerializeFieldでインスペクターから依存メンバをアタッチしたい!というのはよくあるケースです。sfieldは[SerializeField]のアトリビュート付きのprivateメンバを量産するのに活躍します。

f:id:myudon:20210311224801g:plain

log

Unityのデバッグ出力でおなじみ、Debug.Logを生成してくれます。Debug.Logで何かを囲みたいあなたにうってつけのライブテンプレートです。

f:id:myudon:20210311223257g:plain

logerr

Debug.LogErrorで囲みたい時はこちら

f:id:myudon:20210311223130g:plain

おわりに

いかがでしたでしょうか。普段繰り返しで書いているようなコードをパパッと生成できるので、積み重ねていくとそこそこの時間短縮になります。Riderを使っててライブテンプレートに触れたことない人はぜひとも触って欲しい機能です。この記事で紹介は定義済みのものの中でも一部しか抜粋していないので、全部確認したい方はPreferencesの設定か、この公式のリンクを参考にしてください。

pleiades.io

ちなみに今回はライブテンプレートについてRider側で定義済みのものを紹介しましたが、当然自分で定義することもできます。自分もUnityの開発およびプロジェクトの開発に便利なライブテンプレートをいくつか作成して活用しています。時間があった時にはこのオリジナルのライブテンプレートの作成についても記事を書きたいです。

【Unity】新しいInputSystemのEnhancedTouchで端末のタッチ入力を処理する

Unityの新しいInputSystemの機能であるEnhancedTouchという機能を使って手軽に端末のタッチ入力が処理できたのでメモです。

はじめに

本記事では新しいInputSystemの機能の説明や、導入手順などは省略します。
以下のリンク先が大変参考になりましたので、確認していただけると幸いです。(一番下のリンク先が公式ドキュメントになりますので、情報が多いです。)

【Unity】新しいInput System入門 - 従来のUnityEngine.Inputに代わる高機能な入力管理システム - LIGHT11

Unityの新しい入力システムInputSystemを使ってみる | Unityを使った3Dゲームの作り方(かめくめ)

Namespace UnityEngine.InputSystem | Input System | 1.0.2

検証しているツールとパッケージのバージョンは以下の通りです。

  • Unity 2021.1.0b1
  • Input System 1.0.2

バージョンによっては挙動が違うことがありますので、ご注意ください。

EnhancedTouch

EnhancedTouchは新しいInputSystemで端末のタッチ入力周りの情報の参照やイベント処理を行うための機能です。
EnhancedTouch.Touchを使うにはEnhancedTouchSupportを有効にする必要があります。

// UnityEngine.Touchではないので注意
using UnityEngine.InputSystem.EnhancedTouch;

// EnhancedTouchの有効化
EnhancedTouchSupport.Enable();
// いろいろな機能を持つEnhancedTouch.Touch
var touch = Touch;

一点注意なのですが、EnhancedTouchはInputSystemで入力のイベント処理を実装するための機能であるInputActionと併用ができないそうです。
本記事では紹介していない機能ですが、こちらを使う場合も多いと思いますのでお気をつけください。

さて、Touchはタッチ情報を格納しているstructで、タッチ入力について管理されている情報を参照できます。

void DebugTouch(Touch touch)
{
    // タッチの状況(BeganとかMoveとか)
    TouchPhase phase = touch.phase;
    // タッチの座標
    Vector2 screenPosition = touch.screenPosition;
    // タッチを始めた座標
    Vector2 startScreenPosition = touch.startScreenPosition;
}

ゲーム内のタッチ入力はTouchのstaticなメンバとして管理されています。こちらは読み取り用のpublicなプロパティが用意されています。

// 端末の処理できる長さのタッチ入力情報の配列
// 過去のタッチ入力の座標などがキャッシュされている
ReadOnlyArray<Finger> fingerList = Touch.fingers;
// 現在のタッチ入力情報
ReadOnlyArray<Finger> activeFingerList = Touch.activeFingers;


// イベント処理
// 指を離した時
Touch.onFingerUp += OnFingerUp;
// 指が触れた時
Touch.onFingerDown += OnFingerDown;
// 指を動かした(ドラッグ)時
Touch.onFingerMove += OnFingerMove;

void OnFingerUp(Finger finger)
{
   Debug.Log(finger.screenPosition);
}
        
void OnFingerDown(Finger finger)
{
    Debug.Log(finger.screenPosition);
}
        
void OnFingerMove(Finger finger)
{
    Debug.Log(finger.screenPosition);
}

ここで出てきたFingerはTouchの情報をまとめているclassです。座標や状態などの情報を保持しており、更新処理もよしなにやってくれます。

// 一番最後に触れたタッチ入力の情報を保持するFingerインスタンス
Finger finger = Touch.activeFingers.Last();

// 現在のタッチ入力の中での順番
int index = finger.index;
// タッチ入力の座標
Vector2 screenPosition = finger.screenPosition;
// 現在タッチされているかどうか
bool isActive = finger.isActive;
// 現在のタッチ入力情報(座標や状態は更新される)
Touch currentTouch = finger.currentTouch;
// タッチ入力の履歴(IReadOnlyList<Touch>)
TouchHistory touchHistory = finger.touchHistory;

タッチした座標や入力の数などに基づいて処理を行いたい時にFingerを通して情報を参照します。EnhancedTouchだとこういった情報をまとめて管理してくれるのでお手軽です。
入力情報の履歴の参照など、他にもいくつか機能があるので使う方は最初に紹介した公式のドキュメントを参考にしてみてください。

終わりに

とりあえずシンプルに画面をタップしたときの挙動を定義したい時にEnhancedTouchを使うとさくっと実装ができそうです。
まだまだ情報の浅い新しいInputSystemですが、いろいろな機能を探っていきたいです。

UI Builderを活用したUnityのUI構築

Unityでは最近UI Toolkitと呼ばれる新しいUIシステムの開発が進んでいます。
今日はそのUI Toolkitの一つであるUI Builderの説明とその使い方について紹介します。

UI Toolkitの構成要素

UI ToolkitではUIの要素を分解したいくつかのファイルによって構成します。見た目をUSS、レイアウト構造をUXML、ロジックをUQueryとC#、といった形で責務を分解して実装を行うのが特徴です。 名前からもそれとなくわかるのですが、USSがCSS、UXMLがXMLやHTML、UQueryがJQueryから着想を得ており、Webライクな設計となっています。 責務が分かれていることによって、従来のエディタ拡張で使われていたIMGUIの難点だったロジックとUI構成が一つのC#に入り混じって煩雑になってしまうという点が解決されました。 現在はエディタ上のUI実装でのみ正式リリースとなっていますが、将来的にはランタイムのUIの実装にもUI Toolkitを使うことが公式の展望として発表されています。

UI Builderによる要素の構成

UI Toolkitの要素の中でもUSSとUXMLは見た目の部分であり、C#とは別に実装を行います。もちろん自前でコードを書いてもいいのですが、そこで便利なのがUI Builderです。 UI BuilderはUI Toolkitにおける見た目の部分をGUI操作で作成することができるオーサリングツールになります。 Unity2020まではpreviewの機能でPackage Managerで提供されていましたが、Unity2021からは標準で使えるようになっています。 Package Managerから導入する場合はpreviewのpackageを有効にして以下の画像のpackageを入れてください。

f:id:myudon:20210107215102p:plain

導入するとメニューのWindow -> UI Toolkit -> UI BuilderからUI Builderの画面が開きます。

f:id:myudon:20210105005155p:plain
UI Builder

左のメニューでUIの要素の追加や選択をGUI操作で行い、右のインスペクターで選択したUIの編集を行います。 中央のプレビューは即座に更新が反映されるようになっており、Prefabの編集のような感覚で扱うことが可能です。 順にUI Builderの使い方について説明します。

UIの要素と階層構造(UXML)の作成

まずは要素の追加です。使うのは左下のLibraryです。

f:id:myudon:20210107003323p:plain

Libraryから追加したい要素を選んでクリック、または任意の追加したい場所にドラッグを行います。 試しにButtonを追加します。選択してクリックします。

f:id:myudon:20210107003348p:plain

真ん中のプレビューを確認すると画像のようにButtonの要素が追加されます。

f:id:myudon:20210107003553p:plain

そして左のHierarchyにも追加した要素が反映されます。 Hierarchyはその名の通りでUXML上で定義される階層構造を調整できます。

f:id:myudon:20210107004341p:plain

基本的にはLibraryからContainerに分類されている親となる要素を敷いて、その子にControlsと分類されている要素を追加していくのがよくある工程かなと思います。 また、Libraryには自分の作成したUIもひとつのパーツとして扱うことが可能です。LibraryのタブをProjectにするとAssets配下にあるUXMLを参照することができます。

f:id:myudon:20210107004851p:plain

似たようなUIや派生系のUIを量産したい時に、パーツごとにUXMLを制作してLibraryから参照することで制作の手間を省くことができるのはかなり嬉しい機能です。 また、UIを選択すると右のInspectorで名前といったパラメータや使うUSSの編集を行うこともできます。インラインで埋め込む装飾もここで編集してプレビューで確認できるのでとても便利な機能です。

f:id:myudon:20210107013222p:plain

こうして制作したUIの階層構造はUXMLに変換されます。下のプレビュー表示で確認が可能です。

f:id:myudon:20210107005129p:plain

後はUXMLとして作ったUIを保存します。上部にあるFileメニューのsaveからもできますし、ctrl + sやcmd + sといったショートカットキーでも可能です。 UXMLの名前と保存場所を入力して保存しましょう。以上でUIの要素および階層構造の定義となるUXMLが作成できます。

UIの見た目(USS)の作成

次にUIの装飾となるUSSの作り方を説明します。基本的には参照するUSSの設定と、Inspectorによる要素ごとの見た目の操作になります。 使用するUSSの設定は左上のStyleSheetsのメニューで行います。

f:id:myudon:20210107010514p:plain

左上の+ボタンから新しくUSSを作成したり、Assets配下にあるUSSを読み込むことができます。 USSの記述として装飾の効果の対象を表すセレクタの追加もGUIで行えます。 対象のUSSを選択して右のInspectorからセレクタの名前を入力してボタン一つで追加されます。

f:id:myudon:20210107011530p:plain

追加したセレクタはStyleSheetのメニューに反映されます。それぞれのUSSの下に表示されるので分かりやすいです。 セレクタごとの効果はInspectorで設定します。プレビューに即座に反映されるので見た目の試行錯誤はかなり捗ります。

f:id:myudon:20210107011950p:plain

そして、UXMLと同様に設定に合わせてUSSに変換されます。下のプレビュー表示で確認が可能です。

f:id:myudon:20210107220111p:plain

後はUXMLの時と同様に保存を行うとUSSが保存されます。 以上がUI BuilderでUI構築を行う手順になります。

最後に

UI ToolkitによってUIの見た目とロジックの実装を分離できるようになり、UI Builderを活用することでその見た目をGUIベースで構築できるようになりました。 まだまだUI Builderは発展途上なところもありますが、中規模な開発でUIの再利用や量産が必要な時には活躍する時もくるツールじゃないかなーと感じています。 UI ToolkitはUnityは力を入れて開発を進めている部分の一つでもあるので、今後の動きにも注目していきたいですね。

2020年の振り返りと2021年の抱負

あけましておめでとうございます。2020年は仕事にリアルにいろいろなことがありました。 2020年にやったことを振り返りつつ、2021年頑張ることを書いていきます。

2020年やったこと

Qiita投稿 1本

Unity Game SimulationによるUnityアプリケーションの高速シミュレーション - Qiita

Qiita投稿はこの1本のみでした。ちょっと怠けてしまったなー、という感じです。 ただ、この記事自体は結構自信があった内容で、記事を投稿した後にUnity公式の方からメールでお話をいただいたりしました。 Unity Game Simulationは結構可能性を感じる機能なので今後も注目していきたいと思います。

会社ブログ 2本

creator.game.cyberagent.co.jp

creator.game.cyberagent.co.jp

SGE(CyberAgentのゲーム・エンタメ系の子会社のグループ)の公式ブログにて2本記事を書かせていただきました。 今年はこの社内ブログの寄稿を結構頑張っていて、所属する子会社の技術ブログがなかったのを立ち上げたりしてました。 2本とも記事としてはなかなかガッツリとしたものが書けたのではないかなと思っております。

技術書典への執筆 2回

技術書典で「UniTips」というUnityの技術書を定期的に会社で出しているのですが、2020年も2冊執筆に参加しました。

creator.game.cyberagent.co.jp

creator.game.cyberagent.co.jp

Airtestによる自動テスト、UPRによるプロファイリングといったちょっとニッチな内容について執筆しました。 技術書典には「UniTips」立ち上げから本を出させてもらっており、昔に比べて技術を文章化する速度や精度も上がっているのを感じています。 今後も「UniTips」の執筆は続けていく予定です。後述していますが、個人的な本の執筆も予定しています。

CEDEC公募に挑戦

業務で色々と技術的に挑戦していることがあって、せっかくならこれを元に公募チャレンジしたい!と思って頑張ってました。 結果的には通らなかったのですが、公募の感触や社内で登壇経験がある人のヒアリングなど、得るものは多かったです。 もちろん全然諦めていないので、挑戦し続けていきたいです。

Rustを始める

色々と技術的に手広くなりたいなと思って、前々から興味のあったRustを始めました。 公式のチュートリアルから始めて、bitFlyercliを実装してみたり、簡単なAPIサーバーを実装してみたり、ゲームを実装してみたり、と実際に物を作りながら学んでいます。 特にゲーム作りで今は勉強を進めており、AmethystというRust製のゲームエンジンをよく触っています。

amethyst.rs

まだまだ初心者ですが、GitHubにもこっそり成果物を上げています。

github.com

2021年の抱負

アウトプット強化

これまでもQiita投稿、技術書典参加、会社ブログの執筆など色々とアウトプットを続けてきましたが、以下の点を2021年は頑張ろうと思います。

  • 技術書典への「UniTips」の執筆継続
  • 技術書典で個人的にRustの本を出す
  • 個人ブログ蘇生、技術記事のアウトプットを2020年よりも増やす

大きいのは個人的に本を出したいという点です。「UniTips」の執筆を通じて得たノウハウを個人的な研鑽にもつなげたいと思ってRustの本を出してみよう!となりました。 技術書を出すことで知識精度をより高めたり、技術的な名刺になったりなどのさまざまなメリットがあるため、個人的にはおすすめなアウトプットの一つです。

また、この2018年から2年ほど更新が止まっていた技術ブログを蘇生したのも思い切った点です。 2020年色々な方のアウトプットを見たり、社内で活発にアウトプットされている方と話す機会があったりして、自分のアウトプットが定点的で見直さないとなと感じることが多かったです。 そこで、今年から技術ブログを蘇生して自分の名刺としてもアウトプットを積み重ねていくことにしました。記事も増やしつつ、より有益な情報をお届けできるよう頑張ります。

技術領域を広げる

自分は学生の頃から2019年までずっとUnity中心の勉強と業務を続けていました。 2020年になって社会人3年目ともなると仕事の幅も広くなり、Jenkinsおじさんになったり、自動のUIテスト環境を構築したりなど、Unity以外の知識を多く使うようになりました。 結果として自分の技術領域が狭く、もっといろいろな技術に触れた方がいいなーと感じる機会がかなり増えました。そこで、2021年には技術でやれることを増やす、という意識をしっかり持っていきたいです。 直近ではAirtestでの自動テストだったり、Rustの習得だったり黙々と勉強中です。アウトプットと絡めていきたいですね。

最後に

2020年は業務の幅も広がり、色々なエンジニアの方のアウトプットを目にしたりするようになって、色々と自分の活動を見直すいい年でした。 まだまだひよっこエンジニアですが、少しでも技術で世の中に貢献できるよう頑張っていきます。 今年もよろしくお願いいたします!

会社の有志の方と技術書典に本を出してきました

執筆日でもある10月8日にに技術書典5が開催されました!
参加者も出展サークルもぐんぐん増えて、会場が秋葉原UDXから池袋サンシャインシティ文化会館にお引越し、来場者1万人出展サークルの人数も800人越えと今までに無い大きな規模での開催となりました。

f:id:myudon:20181008231806j:plain

ありがたいことに自分は会社のエンジニアの有志の方々と共著を出せる機会があったため、出展サークル側として参加してきました。
UniTipsというUnityの開発にまつわるTips集の執筆と、サークルとしての運営及び進行をさせていただきました。

当日は多くの方が自分たちのブースに来てくれました!前回のUniTipsについての感想などをくださる方もいて、運営としてとても嬉しかったです!

f:id:myudon:20181008231638j:plain

会社として本を出すということで、せっかくなら仕事で学んだ知見をアウトプットしたいなと考え、以前自分が参加していたプロダクトで使用していたZenjectについての章を執筆しました。

現在のプロダクトでのタスクが忙しい時期ということもあり、切羽詰まったりもしましたが、早い時期から書き溜めていた結果何とか執筆を完了することが出来ました。
この技術書典を通して良かった点と反省点があったので少し書きとめようと思います。


まず1つ良かった点は、アウトプットを通した学びが出来たことです。

何かをアウトプットすることは、自分がインプットしたことをアウトプットできる形にする工程を通すことで初めて出来ることです。
そのアウトプットの成型の過程で、自分の理解の中で何が曖昧かを見つけることが出来ます。そして曖昧である部分を丁寧にインプットしなおすことで理解を深めることにつながります。自分もこの執筆を通してZenjectに対する理解をより深めることが出来ました。

また、先輩エンジニアと共著する形をとることで、自分の技術的な知見を言語化する良い経験をすることが出来ました。

今回は執筆フローとして全体のリポジトリgithubで管理し、各々が記事を執筆してPRを出し、全員のレビューを経てからマージするという形を取りました。 自分は技術的な部分を言語化し相手に伝えることに苦手意識があったため、先輩エンジニアの方々に自分の文章にレビューをいただくのはとてもいい勉強の機会になりました。

反省点は、イベント運営としての立ち回りです。

今回は執筆と合わせて、運営もやらせていただいたのですが、自分の至らない点が多く、先輩のエンジニアの方々に手間を取らせてしまうようなことがありました。
自分はエンジニア寄りのクリエイターを目指しており、こういったアウトプットをする場での運営や進行などはしっかりこなせないとなあと目指す自分に足りない部分をしみじみと自覚しました。
こういったことで割としょげがちなのですが、次のこういったイベントで経験を活かして行きたいです。

今後もこういったアウトプットの機会には積極的に参加していきますし、自分も会社の技術活性化のためにいろんな施策を提示したり運営出来るよう頑張っていこうと思います。
次の技術書典もこういった形で参加したい!と画策中です。エンジニアとしての経験が足りないからこそ、どうしたら少しでも早く経験値を得られるかを模索していきます。
とりあえず今日は1日中立っててへとへとなので、買った本を読みながら寝ようと思います。

ShaderGraphを使って頂点シェーダーで遊ぶ

この記事はUnityゆるふわサマーアドベントカレンダー 2018の22日目の記事になります
21日目の記事は@am1tanakaさんのNavMeshAgentでよい感じにキャラクターを歩かせるでした!

qiita.com

Unity2018.2に付随するShaderGraphのアップデートとしてついにvertex shaderの適応が可能になり、頂点情報がいじれるようになりました
今回は早速その機能を使い、簡単な頂点シェーダーをShaderGraphで作って遊んでみたいと思います


ShaderGraph

もうすでに多くの人が知っているかと思いますがShaderGraphはUnity2018から導入されたノードベースのシェーダーエディタです
従来のUnityではシェーダーを実装するにあたってShaderLabによるコーディングが必要でしたが、これによってビジュアルベースでシェーダーを構築できるようになりました
UEは勿論のこと、MayaやSubstanceBlenderなどのDCCツールを活用していた方などにとっては喜びの声が大きいものでした。最初はノードの種類も少なく表現の幅や使い心地に難があったのですが、様々な改修があり、Unity2018.2ではバージョンは3.0となりました。今後も期待ができる機能の一つです

使ってみる

f:id:myudon:20180822002929p:plain

使い方は簡単で、マスターノードに追加されたPositionに頂点情報となるVectorをつなぐだけです

f:id:myudon:20180822002202p:plain

まずは簡単な例です、ワールド座標に対して時間変数の正弦余弦を加算させてぐるぐるさせます

f:id:myudon:20180822020604g:plain

ボールがぐるぐる動いてますね、もうちょっと遊んでみます

qiita.com

上記のサイトにかなり簡易的な草の動きを実装した頂点シェーダーがあるので、ShaderGraphで組んでみます

f:id:myudon:20180822015303p:plain

草が風でそよそよする感じの動きですね
頂点情報について、UV座標で重みをつけたアニメーションを行います
頂点情報をいじっている部分をピックアップしてみましょう

f:id:myudon:20180822223821p:plain

ノードとしてはUVからパラメータを引っ張ってきて、定義したプロパティノードから各種必要な定数を引っ張ってくる感じです
UVから引っ張ってきたy値と定数パラメータを用いて頂点のx成分の移動値を作成し、座標に加算しています

これを適当な板に貼り付けて動かしてみるとこうなります、寂しいので3つぐらい並べてみました

f:id:myudon:20180822020625g:plain

時間に合わせて草が揺れるようになりました
手軽にササっと作れて、動きとしてアウトプットを確認できるので学びとして楽しいですね
今回は単純な動きを作成しましたが、物理挙動に紐づく波の動きだったり動的な凹み表現だったり遊べるものは多いので興味が湧いた方は遊んでみてください


いかがでしたでしょうか、少し緩めの記事ですが、シェーダーって触ったことないけどShaderGraphちょっと面白そう!などちょっとしたきっかけになればいいかなと思っています
個人的にShaderGraphでかなりシェーダーの技術的な敷居は落ちたかなーと感じているので、これを機にエンジニアは勿論、クリエイターからの表現のアプローチが増えていくことを期待しています、自分もいろいろ遊んでいる最中なので面白いものがあったら共有していきたいですね

Unity新Prefabワークフロー、Prefab Variantsの紹介

この記事はUnityゆるふわサマーアドベントカレンダー 2018の13日目の記事になります
12日目の記事は@sonoichi-60さんのリフレクションについてまとめたでした!

qiita.com

Nested Prefabの標準搭載など、Unity BerlinにてPrefab周りについてのワークフローが改修が発表されました
機能としては2018.3に搭載予定らしく、プレビュービルドが公開されています

unity3d.com

今回はそのPrefabシステムの一つ、Prefab Variantsについての記事です


Prefab Variants

Prefab variantsは所謂プレハブの継承的なシステムです
あるPrefabからのパラメータ継承と、要素のオーバーライドを実現することが出来ます
ベースプレハブの変更に伴う派生先の更新や、複数のPrefab継承先なども可能で、Unityにおける開発フローで効率を上げることができます
UnityがPrefabシステムのマニュアルを公開しているので、興味がわいた方は下記のリンクから読んでみてください

docs.google.com

実践

使う場合は上記のプレビュービルドのリンクからプレビュー版を落としてきてください

まずベースプレハブを作成します、今回は適当にUIプレハブを作成しベースにします
プレハブ上で右クリックし、Create→Prefab Variantsで作成できます、作成したプレハブは矢印の模様がついたプレハブアイコンになります

f:id:myudon:20180805043806p:plain

作成したPrefab Variantsは同じようにシーン上で自由に設定ができます
ベースとの差分などはプラスアイコンなどで表示され、無論variantとしての保存ももちろんメニューからそれをベースに反映することもできます

f:id:myudon:20180805044321p:plain

ベース側が変更をかけた場合もしっかりvariantへと反映されます、上記のスクショみたいに差分でApplyを行うのですが、これまでみたいに変更を一括でインスペクタから反映させることもできます
その場合はApplyの時に変更点が出るようになったので確認しましょう

f:id:myudon:20180805045225p:plain

違う派生元からのベース修正もしっかりと反映して運用できます、逆に言えば様々なプレハブへの変更なども考慮しないといけないので使い方に注意は必要になってきます
派生先でNested Prefabなど複雑になってくると事故が起きるかもですね

また、ここまでのプレハブの編集について、シーン上でコンポーネントなどをいじることも可能ですが基本的にはPrefab Modeでの編集をすることになります
シーン上でプレハブの関係を壊すような操作は許可されていません、削除などの操作を試みようとするとUnityに怒られます

f:id:myudon:20180805051322p:plain

プレハブをOpenする操作を行えばPrefab Modeでプレハブを開いてくれます
Prefab ModeではPrefabの関係操作や更新を行うことが出来ます、Nested Prefabの場合はその個々のプレハブについて編集画面にジャンプすることが出来ます

f:id:myudon:20180805052516p:plain

Nested Prefabで差分を出した場合は反映先を選択することが出来ます、複雑化してくると管理が難しいかもですが操作の意味合いが明示化されていて便利ですね

f:id:myudon:20180805052710p:plain

また普通にオブジェクトとしてBreak Prefab Instanceして使いたいなってときはUnpack Prefabを使用しましょう
UnpackだけだとNested Prefabは無視してプレハブ接続を解除、Completelyのオプション付き操作を行うことで全てのプレハブ接続を解除します

f:id:myudon:20180805053114p:plain

ざっと現状のPrefab Variantsの機能を説明しました、詳しくは公式Manualを見ながら自分で触ってみるといいでしょう


Nested Prefabの公式導入、Prefab Variants、Prefab Modeなど触っていて大分ワークフロー変わったなぁと感じました
便利なのですが、しっかりと操作や効率化を念頭に入れて学習していかないとなって感じです
今後も変更が入っていくと考えられるのでこの先の動向に注目です