【Unity】【Rider】RiderのT4テンプレートでlinePragmas="false"が効かないのでAssetPostProcessorで削除する

RiderのT4テンプレートでlinePragmas="false"が効かない話とUnityのAssetPostProcessorで削除する方法です。

Rider 2021.3.3
Unity2020.1.17

はじめに

この記事ではRiderのT4テンプレートにおいてlinePragmas="false"が効かない件と、
UnityのAssetPostProcessorを使ってそれを解決する方法についてまとめます。

T4テンプレートの基礎知識については以下の記事にまとめていますので必要に応じて参照してください。

light11.hatenadiary.com

RiderにおけるT4テンプレートの使い方は以下の記事にまとめています。

light11.hatenadiary.com

またAssetPostProcessorについては以下の記事にまとめていますので、こちらも必要に応じて参照してください。

light11.hatenadiary.com

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);
            }
        }
    }
}

以上で、実行時デザインテンプレートをインポートする際に不要な行が削除されるようになりました。

関連

light11.hatenadiary.com

light11.hatenadiary.com

light11.hatenadiary.com