search
LoginSignup
11

More than 3 years have passed since last update.

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
11