いきなり結論
Unityのバージョンが 2020.1 以降で、RiderをIDEとして使っている方は
Suppress Common Warnings の設定に気をつけたほうが良いかもしれません。
経緯
Rider 使ってますか? 言わずとしれた JetBrains社 が作った C#開発に特化したIDEです。
良いところは数え切れないほど色々あるのですが、その中でも特にコード補完機能やコードの自動生成機能が素晴らしく、Unity界隈でも使っている方が多いんじゃないでしょうか。
今日はそのRiderにまつわる一つの罠を踏み抜いたので紹介させてください。
Alt(Option) + Enter
Rider は Alt(Option) + Enter で、その時その時の状況下に応じたコード補完やコード生成の候補を出してくれます。
その中でも便利で私がよく使っていたのは以下のケース
既にコンストラクタが存在しているクラスがあり
そこにprivate
な メンバ変数を追加した際に、そのメンバ変数もコンストラクタで初期化したい時に (DI使ってるとよくある)
そのメンバ変数にカーソルを当てた状態でAlt(Option)+Enter を押し
「Initialize field from constructor
」 のクイックアクションを選択すると
既存のコンストラクタの引数が勝手に増える+既存コンストラクタ内で初期化をしてくれる
というものです。 地味ですが超便利です。
具体的には、このようなクラスがあり(この例ではVContainerを使用していて、コンストラクタインジェクションをしてもらう想定)
private MyStopWatch _stopWatch;
をメンバ変数に追加、これもコストラクタで初期化してほしい場合に、Alt(Option)+Enterを押して、クイックアクションから「Initialize field from constructor
」を選択
このように、コンストラクタで初期化されるコードが自動で生成されるというわけです。
超便利ですよね。
これだけでもRider買いたくなっちゃったんじゃないですか?(有料ですがその価値はあるはず・・・!)
ところが
そう。便利。
なんですけど、僕の環境だといつからか private メンバ変数ではこの一連の操作ができなくなってて
こんな感じで、目的の「Initialize field from constructor
」が表示されないという・・・。え。なんでですか?
しかも面白い(?)ことに、メンバ変数のアクセス就職しをpublic
にすれば「Initialize field from constructor
」の候補が出てくるんですよ。
「なんかRiderの設定でなにかやらかしちゃった?」 と当たりをつけ検索したり色々試して(キャッシュクリア・Riderのアップデート・アンインストール等・・・)ざっと数時間。
直らないねぇ〜〜〜
(※ちなみに、 ctorf
のスニペットで、フィールドを全部コンストラクタで初期化してくれるコードを自動生成もできるんですが、これだと新しくコンストラクタが生成されちゃって、オーバーロードになっちゃうので全然求めている解決法ではないのです。このあたり StakOverFlow とかでも同じようなやりとりがあり。)
はてさて、果たして何が原因なんでしょうか。
Suppress Common Warnings
そしてここで最初に戻るわけです。
原因は Unity2020.1 から導入された Suppress Common Warnings という設定でした。
これは コガネブログさまでも紹介されてますが、ざっくりいうとUnityで起きがちなWarningを無視する。という設定です。
この設定がONになることで、ほぼ無視してよいWarningが出なくなるのでそれは良いのですが、問題はこのチェックが入った状態で生成(更新)されるプロジェクト(csproj)ファイルです。
csprojファイルはテキストファイルなので中身はテキストエディタなどで見ることができるのですが、その中に
<NoWarn>0649,0169</NoWarn>
の設定を見つけることができます。 これはUnityさんが気を利かせて、csprojファイルを作る際に追加をしてくれているんだと思うんですが
実はこの2つのうちの1つ、0169
の方が今回の原因にでした。
罠を踏むまでの流れ
この、Unityの設定の Suppress Common Warnings にチェックが入っていると、 CS0169 の 「private フィールド 'XXXX' が一度も使用されませんでした」 が抑制されるようになる
↓
csproj ファイルにも NoWarn
として 0169
(と0649) が追加される
↓
理屈は不明ですが、Rider側はこの警告をトリガーにクイックアクションが選ばれるらしく、警告が抑制されることにより
「Initialize field from constructor
」が候補に出なくなる
というコンボを踏んだわけです。 一体誰が悪いんだ
補足
ちなみに、csc.rsp というファイルを作成して、中に -nowarn:0169
のように書いても同じように csproj ファイルの方にも警告の抑制が追加されるので、
(これまた コガネブログ 様参照)
Unity2020.1より前のVersionでも起きると思われます。
(お手元のRiderの補完候補おかしくない? と思ったらcsc.rspファイルの存在を一度疑ってみるとよいかもです)
そしてこの Suppress Common Warnings という設定、デフォルトでONっぽいんですよねぇ・・・。
ということで知らずにこの罠を踏み抜いている方、他にもいると思われます。
注意喚起と備忘録の意味を込めてこの記事を書きました。
おまけ
csprojファイルの作成タイミング
csprojはUnity側で作られるんですが、このcsprojファイルに更新が走らないとUnity側の設定を変えただけでは NoWarn の 0169
は消えてくれません。
csファイルを追加したり削除したりすれば更新されますが、なんならcsprojファイルを1回削除してしまうのも手だと思います。確実に更新されます。
CS0649 は抑制したい
CS0169 の方は抑制するとRiderの候補がチョットオカシクナルのはわかってもらえたと思いますが、CS0649の方も警告がなかなかウザいので、こっちは抑制したい。
という場合は
-nowarn:0649
と、0649だけを指定したファイルをAssets配下に置いておくと良いでしょう。
(ただ、この0649もRiderのどれかの候補のトリガーになっている可能性も0ではないので自己責任でよろしくお願いいたします)
よいRiderライフを。