# Unity + Rider でIDEの圧倒的支援を受けよう!! # はじめに みなさんUnityでRiderを使っていますか? 使ってないあなたも!既に使っているあなたも!これを読んで効率的な開発を! # 目次 - [誰向け記事なんだこれは](#誰向け記事なんだこれは) - [Rider とは](#Riderとは) - [Rider は何が凄いの?](#Riderは何が凄いの?) - [using を自動で追加してくれる](#using-を自動で追加してくれる) - [Adjust Namespaces](#Adjust-Namespaces) - [実装に飛ぶ](#実装に飛ぶ) - [Search Everywhere](#Search-Everywhere) - [Find Usages](#Find-Usages) - [Find Unity Usages](#Find-Unity-Usages) - [SerializeFieldの中身が表示される](#SerializeFieldの中身が表示される) - [Code Inspections](#Code-Inspections) - [Code Inspections とは](#Code-Inspections-とは) - [タイポの検出](#タイポの検出) - [foreach to LINQ](#foreach-to-LINQ) - [コード補完](#コード補完) - [private修飾子 & 変数名 の補完](#private修飾子-&-変数名-の補完) - [Unityで設定した文字列の補完](#Unity-で設定した文字列の補完) - [コード生成](#コード生成) - [コンストラクタ](#コンストラクタ) - [読み取り専用プロパティ](#読み取り専用プロパティ) - [Unityイベントの補完、生成](#Unityイベントの補完、生成) - [リネーム](#リネーム) - [コードの自動保存](#コードの自動保存) - [LiveTemplate](#LiveTemplate) - [自作LiveTemplate](#自作LiveTemplate) - [あとがき](#あとがき) # 誰向け記事なんだこれは .NETで開発してる人向けです。 初心者でも熟練者でも読める内容だと思います。 今回はUnityに絡めていろいろ紹介していきます。 # Riderとは RiderはJetBrains社が開発する.NET向けのクロスプラットフォームIDEです。 同社が開発しているReSharperというVisualStudio向けアドオンに、IntelliJというプラットフォームを合わせたものになります。 WindowsだけでなくMacでもLinuxでも使えます。 ちなみに名前の由来は「ReSharper」+「IDE」→「R + IDE + r」でRiderです。 また、通常は使うのにお金がかかりますが、学生であれば無償で利用可能です。 [公式サイト](https://www.jetbrains.com/ja-jp/rider/)からダウンロードできます # Riderは何が凄いの? とにかくIDE、ReSharperの支援が凄い!!! これを使ったらもうVSには戻れない!!! ということでこの記事ではRiderの機能のごくごく一部を紹介していきます。 この記事を読んだあなたはきっとRiderを即DLするくらい興味を持ってくれるはず……! ちなみに私はVSを全然使っていないのでVSと被る機能を紹介することもありますが悪しからず。 また、ショートカットキーを多用しますが、環境によって異なる場合があるのでご了承ください。 # using を自動で追加してくれる ![4.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260914/4bb6be35-0e99-d2bf-8590-306141beb89e.gif) 画像の通りです。usingを追加しないと使えない型もらくらく使えます。 あのクラスってどの名前空間だっけ?ってことがなくなります。 **** ![5.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260914/7e6eef6b-465a-9cfa-fba5-20e1701c2c4a.gif) 既に書いてあるコードの型の補完にも使えます。どっかからコードをコピペしてきても、わざわざ名前空間を調べる必要はありません。 **「Alt + Enter」** で勝手にusingを追加してくれます。 「Alt + Enter」はこれ以外にも色んなとこで使えます!**とりあえず押しとけばOK!!** # Adjust Namespaces **Namespaceをフォルダ名から取って付けてくれる** 機能です。 例えば、「Asset\Scrips」に以下のようなフォルダとC#ファイルが入っているとします。 ``` Scripts │ ├── Enemy │ ├── Boss │ │ ├── BossBase.cs │ │ └── NormalBoss.cs │ ├── EnemyBase.cs │ └── NormalEnemy.cs │ ├── Player │ ├── PlayerJump.cs │ └── PlayerMove.cs │ └── UI ├── ResultUI.cs ├── TimerUI.cs └── Title ├── Exit.cs ├── Menu.cs └── Setting.cs ``` ![30.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260914/46e37484-fd0d-4827-9966-8d1882bde5ef.gif) **「Refactor this...」** → **「Adjust Namespaces」** でウィンドウが出てきます。 Nextボタンを押せば、チェックがついたcsファイルまとめて全部Namespaceを付けてくれます。 Namespaceは以下のように自動で設定されます ``` Scripts │ ├── Enemy │ ├── Boss │ │ ├── BossBase.cs #Enemy.Boss │ │ └── NormalBoss.cs #Enemy.Boss │ ├── EnemyBase.cs #Enemy │ └── NormalEnemy.cs #Enemy │ ├── Player │ ├── PlayerJump.cs #Player │ └── PlayerMove.cs #Player │ └── UI ├── ResultUI.cs #UI ├── TimerUI.cs #UI └── Title ├── Exit.cs #UI.Title ├── Menu.cs #UI.Title └── Setting.cs #UI.Title ``` **** もちろん単独での追加も可能です。 ![31.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260914/4a74ef7f-6073-25f3-5a31-2550f168e1bb.gif) **「Alt + Enter」** で楽々。 # 実装に飛ぶ ![7.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260914/8f572f04-a97b-4e63-a7ac-d5ff9c7ac9ef.gif) これはメソッドの実装に飛ぶ例です。メソッドだけじゃなくクラスでもなんでもOK **「Ctrl + 左クリック」** または **「Ctrl + B」** でできます。 # Search Everywhere なんでもかんでも検索してくれます。 クラス名やメソッド名やフィールドはもちろんファイル名や設定までなんでもかんでもです。 コードを書いてるときにあのクラスってどういう役割だっけ?とか、エクスプローラーからファイル探すのだるい、とか、あれのショートカットキーってなんだっけ?とか、いろいろ使えます。 ![6.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260914/133aa071-b8a5-57eb-3586-6a93aa2ec06f.gif) **「Shift」を2回**押すと検索フォームがでてきます。 # Find Usages メソッドやプロパティなどが、どこで使用されているかを調べることができます。 ![22.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260914/0a97fcd4-3023-ef87-ad20-445e29aa4701.gif) **「n usage」** をクリックすると使われている一覧が表示されます。 **「Alt + F7」** でもできます。 # Find Unity Usages コンポーネントがUnityのどこで使われているか調べることができます。 ![23.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260914/00cd4d8a-1577-93e6-19d3-a4cb9098505b.gif) **「n asset usage」** をクリックすると、そのクラスをアタッチしてるオブジェクトが一覧で表示されます。選ぶとUnityにフォーカスが移りハイライトしてくれて、さらに一覧のウィンドウも表示されます。 **** メソッドも探すことができます。 ![24.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260914/7597be25-d4dc-7965-88f8-9b5d256a813f.gif) ボタンのOnClickに使用されているメソッドを探してみました。 こっちも使い方は同じです。 # SerializeFieldの中身が表示される ![12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260914/03162b39-698e-15fc-203b-a84e86d3727d.png) 画像の通りです。 SerializeField属性のフィールドにUnityエディタ上から値を入力していると、それを表示してくれます。 ![32.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260914/ddff5b4b-910c-a127-18da-828930bae8be.gif) 複数アタッチされている場合は、どのオブジェクトにフォーカスするかを選択できます。 # Code Inspections ## Code Inspections とは Code Inspectionsは **コードの問題を検出してくれる機能** のことです。 ランプのマークや下線で教えてくれます。 ![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260914/301cb38e-ec79-2b45-f242-b75fdc1709f2.png) このコードはStart関数とUpdate関数それぞれでGetComponentを呼んだ時のスクショです。 初心者がやりがちなUpdateでGetComponentを呼ぶという大罪です。RiderはUpdateの時だけ線を引いて教えてくれます。これはコストのかかるメソッドだよ~~と。 ![12.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260914/7a1e8f3a-1e97-8d03-4796-b51dbc643cd7.gif) これも **「Alt + Enter」** でバーンと直してくれます! ビフォー ```C# public class Sample : MonoBehaviour{ private void Update(){ GetComponent<Hoge>(); } } ``` アフター ```C# public class Sample : MonoBehaviour{ private Hoge hoge; private void Start(){ hoge = GetComponent<Hoge>(); } private void Update(){} } ``` private変数を作ってStartでキャッシュするよう修正をかけてくれました。 **** ![2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260914/546180fc-2113-5a0e-0543-537dfedcb8d0.png) 他にもこんな感じ。 タグを比較するときはCompareTagを使え、と教えてくれていますね。 ![3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260914/b546dca5-eadd-8b0c-6358-69a6ef1d025a.gif) そしてこれも **「Alt + Enter」** で「こう直せばいいんじゃない?」と教えてくれます。 ## タイポの検出 ![3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260914/c34029a3-d70f-dfc2-d962-999567a85047.png) 変数名やクラス名はもちろん、文字列の中のタイポまで緑のにょろにょろで教えてくれます。 ## foreach to LINQ 冗長なforaechをLINQに変えてくれます。 ![25.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260914/385f6780-ac04-89f6-3344-de3a11632ced.gif) ```C# var array = new[]{1, 2, 3, 4, 5, 6, 7, 8, 9}; // ビフォー var total = 0; foreach(var item in array){ total += item; } // アフター var total = array.Sum(); ``` ![26.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260914/7a733a95-9849-8e04-8d15-283ca991b34b.gif) ```C# var array = new[]{1, 2, 3, 4, 5, 6, 7, 8, 9}; // ビフォー var total = 0; foreach(var item in array){ if(item % 2 == 0){ total += item * 2; } } // アフター var total = array.Where(item => item % 2 == 0) .Sum(item => item * 2); ``` # コード補完 ![8.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260914/32fb316a-9471-f353-4c09-a57345c41453.gif) なにか打ったら何か候補を教えてくれます。良いですね~~ ## private修飾子 & 変数名 の補完 ![9.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260914/ce4ddb56-111d-2604-3430-372949cf312f.gif) C#のクラスのメンバはデフォルトでprivateとして扱われます。それも勝手に補完してくれます。 そして、型名から変数名も考えてくれます。 ## Unity で設定した文字列の補完 Riderでは、タイポを防ぐためにこんな機能もついています ![9.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260914/89856906-93bb-838b-27ff-7117a4557892.png) これは、InputManagerに登録されているキーを候補に出してくれます。 これでもう間違えようもないですね。 ![8.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260914/d0774783-84a6-2df8-115a-a9893319cc8e.png) もし存在しないキーを入力してしまっても、ないよ~~~って教えてくれます。 ![10.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260914/3dc1d849-447c-2b41-34c0-9583f00ec425.png) ![11.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260914/bde42f95-cbf6-a647-2a80-3aa917e214be.png) タグ、レイヤー、シーン名、のときも同じです。 # コード生成 **「Alt + Insert」** でコード生成をすることができます。 ## コンストラクタ ![10.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260914/aa637006-cb56-40af-40e6-30c26723ba8c.gif) ## 読み取り専用プロパティ ![11.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260914/c63e0ac5-5d3f-29cc-561f-40b527587f7d.gif) これは、既に宣言しているフィールドを参照するプロパティを自動で宣言してくれます。 ## Unityイベントの補完、生成 ![13.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260914/bd4f378d-5cda-463d-60a6-0f128c89f943.gif) 途中まで打てば、シグネチャを含めイベント関数を補完してくれます。 イベント関数を使うときは返り値なんて気にしないでしょう。関数名だけ知っていればいいのです。 ![14.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260914/2ca12ff5-b814-75bd-d322-a0940d7fecbc.gif) こっちは、イベント関数一覧からチェックボックスでポチポチしてくと生成してくれます。 他にもいろいろなものを補完、生成できます。 # リネーム ![27.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260914/84ab986a-1f72-0e95-bf5b-2cf01d50e7d4.gif) 変数名や関数名はもちろん、クラス名やファイル名などを簡単にリネームできます。リネーム機能を使うと、他の行やファイルでも一括で変えてくれます。 **「F2」** を押すとウィンドウが出るので入力して終わり。簡単! また、文字列やコメントも含めて変換することもできます。 ![28.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260914/83c45b60-eb80-cefe-cc9f-15b888979545.gif) リネームのときに「Search in comments and string literals」にチェックを入れるだけです。 ![29.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260914/b948832b-3071-e47b-a467-dda8c576c23b.gif) また、バッキングフィールドは参照元も一緒に変えてくれます。この例では、プロパティ名を自動でアッパーキャメルにしてくれました。 # コードの自動保存 Riderはデフォルトだと「Ctrl + S」でいちいち保存をかける必要がありません!!!自動で保存してくれます。ありがたや…… # LiveTemplate めちゃくちゃ強力です。 LiveTemplateは、ある単語を入力するとコードに自動変換してくれる機能です。 Riderにはデフォルトでも沢山のLiveTemplateが用意されています。 foreachやwhileといった基本的なものから、コルーチンやSerializeField属性フィールドを生成したりなど、めちゃくちゃ便利な機能です。 既存のLiveTemplateは公式サイトやGithubで公開されていますが、使い方なども含め、個人的によく使うやつをいくつか紹介します。 ## cor IEnumeratorを返り値とするメソッドを作ってくれます ![15.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260914/470d9374-ece0-7eea-0f30-c6777ea0b6ec.gif) ## sfield Serializefield属性のフィールドを作ってくれます ![16.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260914/8effbd07-a6ce-14c1-76bb-4811158de9d7.gif) ## reqcomp RequireComponentを付与するやつです ![17.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260914/13bb23b2-503c-41eb-7cd1-061e9cb8cf97.gif) ## log ![18.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260914/f08a2fa3-a4d0-cf27-fbad-7efc010cb721.gif) とりあえずこんな感じです!すごいでしょう???? # 自作LiveTemplate とても便利なLiveTemplate 実は、自作できちゃうんです!! デフォルトに「sprop」というLiveTemplateがあります。SerializeField属性をつけたprivateなフィールドをバッキングフィールドとして持つプロパティを作ることができます。 ![19.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260914/d0d29a48-51bc-ed66-3e9e-7734716577e2.gif) ```C# [SerializeField] private int hoge; public int Hoge{ get{return this.hoge;} } ``` こんなのができるわけですが、でもこれって今風の書き方じゃないですよね。 C#6.0からは以下のような書き方ができます。 ```C# [SerializeField] private int hoge; public int Hoge => hoge ``` いつも書いてるのはこっちじゃん!ということでLiveTemplateを作っちゃいましょう。 ## 1. LiveTemplateの編集画面を開く 「File」→「Setting」→「Editor」→「LiveTemplate」で編集画面を開きます。 ![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260914/ef02802e-13f4-fdcd-a143-fabf56e60663.png) ## 2. 編集する ![5.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260914/fb001651-0f38-281a-7d2f-8899dfd37732.gif) 編集画面の右上にある「New Template」をクリックすると新しいLiveTemplateが作れるようになります。 ![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260914/a7dee910-006b-e54d-a6ea-3c489cda14f2.png) そしてspropから適当にパクってきて補完内容とショートカット名を書く!! readonly propertyということで「rprop」で設定してみました。 ```C# [UnityEngine.SerializeField] private $type$ $fieldName$; public $type$ $propertyName$ => $fieldName$; $END$ ``` ![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260914/15aac84a-68cd-7fb8-c679-b0fa7d72287a.png) 最後にAvailabilityをメンバに制限する設定にしたら完成!!めっちゃ楽!!! ## 使ってみる ![20.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260914/3a1ae26e-f07b-9351-1280-e71882a36df9.gif) めっちゃ良いですね!!!!!!!!最高!!!!!!!!! ## おまけ ついでにUniRx御用達のこの文句もやってみました。 ![21.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260914/8be88e6a-d79e-f904-fdfa-704402192c6b.gif) ```C# private readonly Subject<$type$> $fieldName$ = new Subject<$type$>(); public IObservable<$type$> $propertyName$ => $fieldName$;$END$ ``` めっちゃ良いですね………。 $で囲まれているのはLiveTemplate変数ですが、マクロを設定することができます。この例ではtype変数のデフォルトをUnitにしてみました。 そして、propertyNameはfieldNameのアッパーキャメルに設定しフォーカスをスキップする設定にしました。とても快適です。 # あとがき Riderの記事はいかかでしたでしょうか?使う気になってくれましたか?!??! Riderは初心者から熟練者まで誰でも使えるツールです!是非愛用してください!! 今回いろいろ紹介しましたが、Riderの機能はこんなもんではありません。まだまだ沢山の機能が盛りだくさんです。 是非使ってください!!