Posted at

VSTUを使わずに、Unityから生成されたsln / csprojファイルをスクリプトから変更する


やりたいこと

Unityが生成するslnファイルは、手動で外部のcsprojを足しても勝手に巻き戻されてしまいます。

そこで、スクリプトからslnファイルにcsprojを追加するようにします。

既存のやり方としてVSTUのイベントにHookさせる方法がありますが、この方法はIDEにRiderを使っている場合は利用できませんでした。


やり方

AssetPostprocessorOnGeneratedSlnSolutionを使います。

(ドキュメントには書いてないですが、2018.2からこのイベント関数が追加されています。)

そこで、次のようなエディタ拡張を配置すれば自動的にslnファイルにcsprojが追加されるようになります。

using UnityEditor;

public class SolutionFileFixer : AssetPostprocessor
{
private static string OnGeneratedSlnSolution(string path, string content)
{
var solutionGuid = "solutionのGUID";
var projectGuid = "projectのGUID";
var projectName = "プロジェクト名";
var projectPath = "csprojへのパス";
var add =
$"Project(\"{solutionGuid}\") = \"{projectName}\", \"{projectPath}\", \"{projectGuid}\",\"{Environment.NewLine}EndProject";

// 最後に追加
var newContent = content.Replace($"EndProject{Environment.NewLine}Global",
$"EndProject{Environment.NewLine}{add}{Environment.NewLine}Global");
return newContent;
}

}


おまけ

を参考に、Boo.Langも消し去るようにしてみます。

使うものはOnGeneratedCSProjectイベントです。

using UnityEditor;

public class SolutionFileFixer : AssetPostprocessor
{
private static string OnGeneratedSlnSolution(string path, string content)
{
var solutionGuid = "solutionのGUID";
var projectGuid = "projectのGUID";
var projectName = "プロジェクト名";
var projectPath = "csprojへのパス";
var add =
$"Project(\"{solutionGuid}\") = \"{projectName}\", \"{projectPath}\", \"{projectGuid}\",\"{Environment.NewLine}EndProject";

// 最後に追加
var newContent = content.Replace($"EndProject{Environment.NewLine}Global",
$"EndProject{Environment.NewLine}{add}{Environment.NewLine}Global");
return newContent;
}

private static string OnGeneratedCSProject(string path, string content)
{
var document = XDocument.Parse(content);
document.Root.Descendants()
.Where(x => x.Name.LocalName == "Reference")
.Where(x => (string) x.Attribute("Include") == "Boo.Lang")
.Remove();
return document.Declaration + Environment.NewLine + document.Root;
}
}