Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

やりたいこと

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;
    }
}
toRisouP
virtualcast
VRシステム(バーチャルキャスト)の開発、運営、企画
https://virtualcast.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした