RiderのT4テンプレートでlinePragmas="false"が効かない話とUnityのAssetPostProcessorで削除する方法です。
Rider 2021.3.3
Unity2020.1.17
はじめに
この記事ではRiderのT4テンプレートにおいてlinePragmas="false"が効かない件と、
UnityのAssetPostProcessorを使ってそれを解決する方法についてまとめます。
T4テンプレートの基礎知識については以下の記事にまとめていますので必要に応じて参照してください。
RiderにおけるT4テンプレートの使い方は以下の記事にまとめています。
またAssetPostProcessorについては以下の記事にまとめていますので、こちらも必要に応じて参照してください。
RiderのT4テンプレートでlinePragmas="false"が効かない
T4テンプレートで実行時テキストテンプレートを作成すると、以下のように絶対パスの入った行がいくつも出力されます。
#line 2 "C:\Projects\Unity....
絶対パスが入ってしまうと他人と共有するようなプロジェクトでは不都合が生じます。
そこでT4テンプレートの仕様として、以下のように記述することでこの行を削除することができます。
<#@ template language="C#" linePragmas="false"#>
ところがRiderのT4テンプレートはこれに対応していないようで、記述しても当該行が消えません。
以下のようにissueが上がっているものの、まだ修正されていません。
https://youtrack.jetbrains.com/issue/RIDER-55555
AssetPostProcessorで削除する
これでは上述の理由で困ってしまいます。
しかし幸いにもUnityには、AssetPostProcessorがあるため、これでインポート時に当該行を削除してしまいます。
ソースコードはこんな感じです。
using System.IO; using System.Text.RegularExpressions; using UnityEditor; namespace Example { public sealed class RuntimeTemplatePostProcessor : AssetPostprocessor { private static readonly Regex _linePragmaRegex = new Regex("^.*#line.*\n", RegexOptions.Multiline); private static void OnPostprocessAllAssets(string[] importedAssetPaths, string[] deletedAssetPaths, string[] movedAssetPaths, string[] movedFromAssetPaths) { foreach (var assetPath in importedAssetPaths) { // 処理しなくてもいいパスを適当に弾く if (!assetPath.EndsWith(".cs")) continue; if (!assetPath.Contains("/Templates/")) continue; var script = File.ReadAllText(assetPath); script = _linePragmaRegex.Replace(script, string.Empty); File.WriteAllText(assetPath, script); } } } }
以上で、実行時デザインテンプレートをインポートする際に不要な行が削除されるようになりました。