【Unity】【Rider】RiderでT4テキストテンプレートを使う

Unity x RiderでT4テンプレートを使う方法をまとめました。

Unity 2019.4.0
Rider 2020.1.3

T4テンプレートの基本的な使い方はこちら

T4テンプレートの基本的な使い方は以下の記事にまとめています。

light11.hatenadiary.com

Visual Studioによる使い方の記事になりますが文法などは変わらないのでこちらを参照してください。
本記事ではT4テンプレートをRiderで使う際にVisual Studioと異なる部分についてまとめます。

Visual Studioとの相性の悪さ~RiderのT4テンプレートサポート

上述の記事のようにT4テンプレートはVisual Studioで使用することができます。
しかし少なくとも今のバージョンのUnityは、VisualStudioのテキストテンプレートと相性が悪いです。
ためしにソリューションエクスプローラーからAssets直下にテキストテンプレートを作成してみます。

f:id:halya_11:20200721223019p:plain
テンプレートを追加

この時点ではテンプレートを書き換えて保存するとその結果がtxtファイルに書き出され、問題なく動作しているように見えます。
しかし、一度UnityエディタとVisual Studiowを立ち上げなおすと以下のようにttファイルとtxtファイルの親子関係が解消されてしまっています。

f:id:halya_11:20200721222925p:plain
親子関係がなくなる

この状態だとテンプレートを更新して保存してもtxtファイルが更新されません。 もちろん別のソリューションとして作る分には正常に動きます。

さてこのようなVisual Studioの事情に対して、Riderでは2019.3からT4テンプレートがサポートされました。

blog.jetbrains.com

この記事ではRiderを使ってUnity上でT4テンプレートを使う方法についてまとめます。

C# Project Generationにttを加える

まずC# Project Generationにテンプレートファイルの拡張子であるttを追加します。
Project Settings > Editor > C# Project Generation > Additional extensions to includeにttを追加します。

f:id:halya_11:20200721231847p:plain
ttを加える

またttファイルをUnityからダブルクリックした際にRiderが開くようにするため、
Preferences > External Tools > Extensions handled にttを加えます。

f:id:halya_11:20200908213836p:plain
ttを加える

テンプレートファイルを作る

それでは実際にテンプレートファイルを作っていきます。
テンプレートファイルを作るにはExplorerで右クリック > Add > T4 Fileを選択します。

f:id:halya_11:20200721232515p:plain
テンプレートを作成

するとファイル名入力ウィンドウが表示されます。
ここでT4 Fileを選択するとttファイルが、T4 Includeを選択するとttincludeファイルが生成されます。

f:id:halya_11:20200721232544p:plain
ファイル名入力画面

今回は以下のようなttファイルを作成しました。

<#@ template language="C#" #>
<#@ import namespace="System.Text" #>
<#@ import namespace="System.Collections.Generic" #>
public class Example
{
}

テキストを生成する

次にテンプレートからテキストを作成します。
テキストを生成するにはttファイルを右クリック > Run Templateを選択します。
ここでPreprocess Templateを選択すると実行時テンプレートが作成されます。

f:id:halya_11:20200721234012p:plain
テキストを生成

以下のようにttファイルの子としてcsファイルが生成されていれば成功です。

f:id:halya_11:20200721234213p:plain
テキストが生成された

csファイルの中身を見るときちんとクラスが生成されていることが確認できました(デザイン時テンプレートの場合の結果)。

public class Example
{
}

実行時テンプレートでコンパイルエラー?

さて実行時テンプレートを生成した際に、System.CodeDom.Compilerが見つからない旨のコンパイルエラーが出ることがあります。

これに関してはEditorフォルダやエディタ用のアセンブリに入れることで解決できます。
また、API Compatibility Levelを.NET 4.xにすることでも解決できます。

関連

light11.hatenadiary.com

参考

blog.jetbrains.com