UnityのエディタからDefineシンボルを定義する

C#のシンボル定義ってあんまり個人的には多用したくない部類の機能ではあるのですが、簡単なのでUnityだとまま使います。
で、Unityのエディタ側から定義をいじれると便利なのでそれの操作クラス作りました。

使い方は
Symbol.Addで追加
Symbol.Removeで削除
Symbol.Setで上書きです

面倒くさいので全部params string[]の引数になっているので複数指定できます。

ところで全く関係ないですけどそろそろUnityがC#6.0に対応するので
String.Join(";", currentSymbols.ToArray())
が
String.Join(";", currentSymbols)
こうできるようになりますね。


```csharp:Symbol.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using UnityEditor;

namespace Assets.Editor
{
    static class Symbol
    {
        private static IEnumerable<string> currentSymbols;

        private static readonly BuildTargetGroup[] buildTargetGroup = new[]
        {
            BuildTargetGroup.Android, 
            BuildTargetGroup.Standalone, 
            /*...必要なものを...*/
        };

        public static string CurrentSymbols
        {
            get { return String.Join(";", currentSymbols.ToArray()); }
        }

        static Symbol()
        {
            //インスペクタ上では;区切り
            currentSymbols = PlayerSettings.GetScriptingDefineSymbolsForGroup(BuildTargetGroup.Standalone).Split(';');
        }

        private static void SaveSymbol()
        {
            var symbols = CurrentSymbols;
            foreach (var target in buildTargetGroup)
            {
                PlayerSettings.SetScriptingDefineSymbolsForGroup(target, symbols);
            }
            
        }



        public static void Add(params string[] symbols)
        {
            currentSymbols = currentSymbols.Concat(symbols).Distinct().ToArray();
            SaveSymbol();
        }

        public static void Remove(params string[] symbols)
        {
            currentSymbols = currentSymbols.Except(symbols).ToArray();

            SaveSymbol();
        }

        public static void Set(params string[] symbols)
        {
            currentSymbols = symbols;
            SaveSymbol();
        }

    }
}

```

以下のテストを通過します

```csharp:SymbolTest
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NUnit.Framework;
using UnityEditor;

namespace Assets.Editor.Test
{
    [TestFixture]
    class SymbolTest
    {
        string startSymbols;

        [SetUp]
        public void SetUp()
        {
            startSymbols = PlayerSettings.GetScriptingDefineSymbolsForGroup(BuildTargetGroup.Standalone);
        }

        [TearDown]
        public void TearDown()
        {
            Symbol.Set(startSymbols.Split(';'));
        }

        [Test]
        public void SetTest()
        {
            Symbol.Set("A","B");
            AssertSymbol("A", "B");
            Symbol.Set();
            AssertSymbol();

        }

        [Test]
        public void AddTest()
        {
            Symbol.Set();
            Symbol.Add("A");
            AssertSymbol("A");
            Symbol.Add("B");
            AssertSymbol("A","B");
            Symbol.Add("C","D");
            AssertSymbol("A","B","C","D");

            Symbol.Add("A","B","E");
            AssertSymbol("A", "B", "C", "D","E");
        }

        [Test]
        public void RemoveTest()
        {
            Symbol.Set("A", "B", "C", "D");
            Symbol.Remove("C", "D");
            AssertSymbol("A", "B"); 
            Symbol.Remove("A");
            AssertSymbol("B");
            Symbol.Remove("D");
            AssertSymbol("B");
            Symbol.Add("A");
            AssertSymbol("B","A");
            Symbol.Remove("B","C","D");
            AssertSymbol("A");
            Symbol.Remove("A");
            AssertSymbol();
        }

        void AssertSymbol(params string[] symbols)
        {
            Assert.AreEqual(string.Join(";", symbols),
                PlayerSettings.GetScriptingDefineSymbolsForGroup(BuildTargetGroup.Standalone));
        }
    }
}

```