背景
- プロジェクト全体で使える #if ~ #endif (シンボル、マクロ)が欲しい
- Scripting Define Symbols は面倒なので使いたくない
- Unityマニュアル の「グローバルのカスタム #defines」を使いたい
- 最低限の機能のみでよい(アセットストアのものは多機能すぎる)
コード例
using UnityEditor;
public class EditorMyAppMenu
{
[MenuItem(cMenu_BuildTarget_Develop)]
private static void OnBuildTarget_Develop()
{
// チェックマークを付ける
Menu.SetChecked(cMenu_BuildTarget_Develop, true);
Menu.SetChecked(cMenu_BuildTarget_Release, false);
// slnファイルを削除
deleteSln();
// rspファイルを上書き保存
createRsp("-define:DEVELOP");
}
[MenuItem(cMenu_BuildTarget_Release)]
private static void OnBuildTarget_Release()
{
// チェックマークを付ける
Menu.SetChecked(cMenu_BuildTarget_Develop, false);
Menu.SetChecked(cMenu_BuildTarget_Release, true);
// slnファイルを削除
deleteSln();
// rspファイルを上書き保存
createRsp("");
}
private static void deleteSln()
{
System.IO.FileInfo fileInfo = new System.IO.FileInfo("MyApp.sln");
fileInfo.Delete();
}
private static void createRsp(string text)
{
System.IO.StreamWriter sw = new System.IO.StreamWriter("Assets/csc.rsp", false);
sw.WriteLine(text);
sw.Flush();
sw.Close();
}
private const string cMenu_BuildTarget_Develop = "MyApp/Build Target/Develop";
private const string cMenu_BuildTarget_Release = "MyApp/Build Target/Release";
}
使用方法
- 任意のデバッグコードを #if DEVELOP ~ #endif で囲う
- Release版を確認する際は、Editorメニューから Release を選択
- VisualStudio を閉じて、Editor にて何らかのスクリプトをダブルクリックで VisualStudio を起動
- 閉じる際に sln ファイルの保存を聞かれるが、「保存しない」
- VisualStudio を再起動することで、#if DEVELOP で囲われた部分がグレーアウトされる

備考
- プロジェクト名が MyApp という場合のコード例
- csc.rsp に -define:DEVELOP と記述すると #if DEVELOP が使えるようになる
- 生成された csc.rsp はgit管理しないようにする
- 直近の Develop, Release の確認に依存するローカルファイルなので
- ちなみに、slnファイルもgit管理しない(参考ページ)
- slnファイルを削除すると、VisualStudio 再起動時に slnファイル と csproj ファイル が自動生成されることを利用している
- VisualStudio 起動状態で、更新されたcsc.rsp を参照しつつ csproj を生成する方法があればそれでもよい(が、見つからなかった)
- 本当は、Editor の Asset を右クリックの「Open C# Project」、または Preferences の「Regenerate project files」をスクリプト実行したかった(が、見つからなかった)