Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
11
Help us understand the problem. What is going on with this article?
@toRisouP

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;
    }
}
11
Help us understand the problem. What is going on with this article?
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
toRisouP
virtualcast
VRシステム(バーチャルキャスト)の開発、運営、企画

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
11
Help us understand the problem. What is going on with this article?