Alt(Opt) + Enter だけじゃもったいない！　Rider小テク

※本記事は、[Unityゲーム開発者ギルド Advent Calendar 2022](https://adventar.org/calendars/7428) 16日目の記事となります。

みなさん、Rider使ってますか。 良いエディタですよね。
僕の周りにも「Riderはイイゾ」おじさんが沢山います。
（学生さんなら無料で使えるらしいので、使ってないかたは是非）

RiderおよびJetBrains社の生い立ちや、Alt(Opt)+Enterなどの基本情報については他の方々におまかせして

今日は**あまり語られる事の無い「ピリオド機能」についてご紹介したいと思います。**

# What's ピリオド機能
そもそも「ピリオド機能」という名前ではないと思います。
（僕が勝手につけました。）

これは、何かしらの構文に対して、後ろに「．（ピリオド、ドット）」を付けると候補が出てくる例のやつです。
（いわゆるコード補完。VSで言うIntellisense）
もちろん

```cs
public class Test{
    public int value;
}

public class Hoge{
    Hoge(){
        var t = new Test();
        t.
    }
}
```

ここまで打てば
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37184/cd158803-7400-dcc3-31cd-5c91bcc3de73.png)
が候補に出てくるのはご存知の通り。
しかし、よくよく見ると他にも出てきてますよね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37184/e97b3391-1641-6dd0-b8de-0e062c0e0b70.png)

実はこれらが便利なんですよ奥さん。

# 変数格納系
## .var
このように
![var.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37184/55386811-8629-3f20-2561-98fdbbf853f2.gif)
ローカル変数に格納してくれます（もちろん、変数名は値から推論されたええ感じの変数名）

また、
![var2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37184/94924daf-9d2a-f5b5-8ff4-32936f537d4c.gif)

このように括弧の中にも使えますし、複数で使われている場合は、「＊＊個かあるけどどうする？それらも一括でローカル変数に入れちゃう？」と聞いてくれます。気が効きすぎかよ。

## .field
前述の .var で一回ローカル変数に入れてから、リファクタ(環境によりますが、 Ctrl(Command)+Shift+R とか）でフィールドに昇格してもいいんですが、
![field.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37184/f35aaa31-41c0-d06d-4d57-231e1223e8cf.gif)


このように一発でフィールド変数を宣言してくれます。

## .prop
同じくこれはプロパティを作ってくれます。
![prop.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37184/41913b01-2a71-7034-90ae-c9cce71a2b71.gif)

# 条件判定系
## .if
これは「.」の前がboolの時のみ使用可能で
![if.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37184/a5dad39e-0d26-83dd-e820-7b4d0a16b9ec.gif)

このように、if文を作成してくれます。

## .else
これは `.if` の亜種で、elseブロックを作る・・・　のではなく、条件を反転させたif文を作ってくれます。
![else.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37184/19d49a7b-bdf7-8034-e022-e897968bca5a.gif)

if文の後に `invert if` 使ってもいいけどね

## .not
![not.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37184/2eb5533f-6d38-3fcd-4643-724532f2d68d.gif)

あんまり出番無いですが、boolの判定を反転させてくれます。　↑の `.else` は実は `.not` → `.if` をやってくれている感じなんですかね。

<!--
ド・モルガンの法則
```math
\overline{A \cap B} = \overline{A} \cup \overline{B}
```
-->

## .null
これは「nullだった場合if文」を作ってくれます。
![null.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37184/64707507-73cf-370e-c47a-5f920897289c.gif)

 `a == null` まで打ってから `.if` って書いてももちろん良いんですが `a.null` でもOK
`?.` や `??` が使える今となってもUnityにおいてはnullと比較することは大きな意味があるので結構つかうんじゃないでしょうか。

## .notnull
同じく、「nullじゃない場合if文」を作ってくれます。
![notnull.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37184/aeef908f-2ca6-82e0-6671-74e1e52deb2c.gif)

とっさに出てくるかどうかはキミ次第だ！

## .while
ifがあるなら、whileもあります。
![while.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37184/6c5195be-8599-823e-79db-21cdff5bc5cd.gif)

untilは無いので。　.not .while　って打ちましょう。　そんなやつおるか？

# 列挙系
## .for
配列などのindexアクセス可能な構文に対して使えます。
![for.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37184/12ed7ea5-c4ab-0700-f72a-74ce401b3f90.gif)
Listだとちゃんと、`.Count()` 使ってくれます。気が利いてるぅ。

## .forr
末尾からアクセスしたいこと。ありますよね？
![forr.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37184/2d6a948f-4d8f-a2c2-bd69-18b37b5b7957.gif)


はいそこ！ .for した後に 「Reverse 'for' loop」でも良いとか言わない！

## .foreach
自動でforeachブロックを作成してくれる君です。IEnumerable な構文に対して使えます。
![foreach.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37184/420d6e32-5fec-1e8a-d287-a13ce9894546.gif)

個人的には .foreach でforeachブロック作ったあと、Alt(Opt)+Enter で 「Convert for」ってやったほうが、配列のローカル変数への代入もやってくれるので便利だな。とは思いますよ。ええ（趣旨が崩れる・・・）

# その他
## .switch
指定した構文を対象としたswitchブロックを作ってくれます。
![switchcase.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37184/8b7a39f7-feec-df6d-d591-6ce1afaee7ce.gif)


Alt(Opt)+Enterでもちろん対象がenumだったりすれば、case を全部用意してくれるのではい、便利ー。（もうAlt+Enter使い始めちゃった）

## .new
new が正しい位置に移動します。
![new.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37184/1dda4dc3-32a8-5208-d550-15ed74c08026.gif)

これだけ見ると使わなそうですが、カーソル位置がそのまま末尾なのでさらに `.var` や `.field` 等使って変数に格納することが多いです。

が、
実はクラスに対して `.var`や`.field` とすると、勝手にnewしつつ変数代入してくれるので、そっちつかってもOK。
![newvar.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37184/cb48bca8-f45e-e16d-5d80-31a8520bf5f0.gif)


## .await
`async` なメソッド内であればTask(UniTask)に対して `.await` で、await を正しい場所に入れてくれます。
![await.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37184/294224b5-165c-a7b4-1029-72af1f62ee91.gif)

いらなくない？　と思うかもしれませんが。
プログラマーの思考的に「待ち受けよう = await」が先ではなくて「＊＊の処理を非同期で」と、「したいこと = Task」が先にあるもんなんです。

加えて気が利いているのが、これまたカーソルの位置がそのままなんですよ。

なので、 `.await` → `.var` で、awaitした結果をローカル変数に代入。　までがさらっとできちゃいます。

![awaitvar.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37184/638e6d3f-26d6-1d01-b8cf-479f3c9eec7c.gif)

うーん。あわせ技一本。

# まとめ
以上、僕が知っている（そして使ったり使わなかったりする）Rider小テクでした。
題名には「Alt(Opt)+Enterだけじゃもったいない」とは書きましたが、上記テク＋Alt(Opt)+Enter で もっともっと効率化していくので各自仲良く！

では。　良きUnity＋Riderライフを。