├── .gitignore ├── Assets ├── Editor.meta ├── Editor │ ├── ConstantsClassCreator.cs │ ├── ConstantsClassCreator.cs.meta │ ├── SymbolEditor.meta │ └── SymbolEditor │ │ ├── DefineSymbol.cs │ │ ├── DefineSymbol.cs.meta │ │ ├── SymbolEditor.cs │ │ ├── SymbolEditor.cs.meta │ │ ├── SymbolEditorWindow.cs │ │ └── SymbolEditorWindow.cs.meta ├── Scripts.meta ├── Scripts │ ├── Constants.meta │ └── Constants │ │ ├── DefineValue.cs │ │ └── DefineValue.cs.meta ├── Untitled.unity └── Untitled.unity.meta ├── LICENSE.txt ├── ProjectSettings ├── AudioManager.asset ├── DynamicsManager.asset ├── EditorBuildSettings.asset ├── EditorSettings.asset ├── GraphicsSettings.asset ├── InputManager.asset ├── NavMeshAreas.asset ├── NetworkManager.asset ├── Physics2DSettings.asset ├── ProjectSettings.asset ├── ProjectVersion.txt ├── QualitySettings.asset ├── TagManager.asset ├── TimeManager.asset ├── UnityAdsSettings.asset └── UnityAnalyticsManager.asset └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | # ---------------[ original ]------------------ # 2 | 3 | # ---------------[ Folder ]------------------ # 4 | 5 | 6 | 7 | # ---------------[ Unity generated ]------------------ # 8 | [Ll]ibrary/ 9 | [Tt]emp/ 10 | [Oo]bj/ 11 | UnityGenerated/ 12 | 13 | 14 | # ----[ Visual Studio / MonoDevelop generated ]------- # 15 | 16 | ExportedObj/ 17 | *.svd 18 | *.userprefs 19 | *.csproj 20 | *.pidb 21 | *.suo 22 | *.sln 23 | *.user 24 | *.unityproj 25 | *.booproj 26 | 27 | # -------------[ OS generated ]------------------------ # 28 | .DS_Store 29 | .DS_Store? 30 | ._* 31 | .Spotlight-V100 32 | .Trashes 33 | Icon? 34 | ehthumbs.db 35 | Thumbs.db 36 | LocalCache/ 37 | # -------------[ Build ]------------------------ # 38 | *.html 39 | *.unity3d 40 | -------------------------------------------------------------------------------- /Assets/Editor.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: a08867e8a4a01485ca988c898094424b 3 | folderAsset: yes 4 | timeCreated: 1448945203 5 | licenseType: Free 6 | DefaultImporter: 7 | userData: 8 | assetBundleName: 9 | assetBundleVariant: 10 | -------------------------------------------------------------------------------- /Assets/Editor/ConstantsClassCreator.cs: -------------------------------------------------------------------------------- 1 | // ConstantsClassCreator.cs 2 | // http://kan-kikuchi.hatenablog.com/entry/ScriptingDefineSymbolsEditor 3 | // 4 | // Created by kan kikuchi on 2015.09.30. 5 | 6 | using System; 7 | using System.IO; 8 | using System.Text; 9 | using UnityEngine; 10 | using System.Collections; 11 | using System.Collections.Generic; 12 | using UnityEditor; 13 | using System.Linq; 14 | 15 | /// 16 | /// 定数を管理するクラスを生成するクラス 17 | /// 18 | public static class ConstantsClassCreator{ 19 | 20 | //無効な文字を管理する配列 21 | private static readonly string[] INVALUD_CHARS = { 22 | " ", "!", "\"", "#", "$", 23 | "%", "&", "\'", "(", ")", 24 | "-", "=", "^", "~", "\\", 25 | "|", "[", "{", "@", "`", 26 | "]", "}", ":", "*", ";", 27 | "+", "/", "?", ".", ">", 28 | ",", "<" 29 | }; 30 | 31 | //定数の区切り文字 32 | private const char DELIMITER = '_'; 33 | 34 | //スクリプトの拡張子 35 | private const string SCRIPT_EXTENSION = ".cs"; 36 | 37 | //作成したスクリプトを書き出す先 38 | private const string EXPORT_DIRECTORY_PATH = "Assets/Scripts/Constants/"; 39 | 40 | //型名 41 | private const string STRING_NAME = "string"; 42 | private const string INT_NAME = "int"; 43 | private const string FLOAT_NAME = "float"; 44 | 45 | /// 46 | /// 定数を管理するクラスを自動生成する 47 | /// 48 | /// クラスの名前 49 | /// なんのクラスか説明するコメント文 50 | /// 定数名とその値をセットで登録したDictionary 51 | /// 定数の型、stringかintかfloat 52 | public static void Create (string className, string classInfo, Dictionary valueDict){ 53 | //入力された型の判定 54 | string typeName = null; 55 | 56 | if(typeof(T) == typeof(string)){ 57 | typeName = STRING_NAME; 58 | } 59 | else if(typeof(T) == typeof(int)){ 60 | typeName = INT_NAME; 61 | } 62 | else if(typeof(T) == typeof(float)){ 63 | typeName = FLOAT_NAME; 64 | } 65 | else{ 66 | Debug.Log (className + SCRIPT_EXTENSION +"の作成に失敗しました.想定外の型" + typeof(T).Name + "が入力されました"); 67 | return; 68 | } 69 | 70 | //ディクショナリーをソートしたものに 71 | SortedDictionary sortDict = new SortedDictionary (valueDict); 72 | 73 | //入力された辞書のkeyから無効な文字列を削除して、大文字に_を設定した定数名と同じものに変更し新たな辞書に登録 74 | //次の定数の最大長求めるところで、_を含めたものを取得したいので、先に実行 75 | Dictionary newValueDict = new Dictionary (); 76 | 77 | foreach (KeyValuePair valuePair in sortDict) { 78 | string newKey = RemoveInvalidChars(valuePair.Key); 79 | newKey = SetDelimiterBeforeUppercase(newKey); 80 | newValueDict [newKey] = valuePair.Value; 81 | } 82 | 83 | //定数名の最大長を取得し、空白数を決定 84 | int keyLengthMax = 0; 85 | if(newValueDict.Count > 0){ 86 | keyLengthMax = 1 + newValueDict.Keys.Select (key => key.Length).Max (); 87 | } 88 | 89 | //コメント文とクラス名を入力 90 | StringBuilder builder = new StringBuilder (); 91 | 92 | builder.AppendLine ("/// "); 93 | builder.AppendFormat ("/// {0}", classInfo).AppendLine (); 94 | builder.AppendLine ("/// "); 95 | builder.AppendFormat ("public static class {0}", className).AppendLine ("{").AppendLine (); 96 | 97 | //入力された定数とその値のペアを書き出していく 98 | string[] keyArray = newValueDict.Keys.ToArray(); 99 | foreach (string key in keyArray) { 100 | 101 | if (string.IsNullOrEmpty (key)) { 102 | continue; 103 | } 104 | //数字だけのkeyだったらスルー 105 | else if (System.Text.RegularExpressions.Regex.IsMatch(key ,@"^[0-9]+$")){ 106 | continue; 107 | } 108 | //keyに半英数字と_以外が含まれていたらスルー 109 | else if (!System.Text.RegularExpressions.Regex.IsMatch(key, @"^[_a-zA-Z0-9]+$")){ 110 | continue; 111 | } 112 | 113 | //イコールが並ぶ用に空白を調整する 114 | string EqualStr = String.Format("{0, " + (keyLengthMax - key.Length).ToString() + "}", "="); 115 | 116 | //上記で判定した型と定数名を入力 117 | builder.Append ("\t").AppendFormat (@"public const {0} {1} {2} ", typeName, key, EqualStr); 118 | 119 | //Tがstringの場合は値の前後に"を付ける 120 | if (typeName == STRING_NAME) { 121 | builder.AppendFormat (@"""{0}"";", newValueDict[key]).AppendLine (); 122 | } 123 | 124 | //Tがfloatの場合は値の後にfを付ける 125 | else if (typeName == FLOAT_NAME) { 126 | builder.AppendFormat (@"{0}f;", newValueDict[key]).AppendLine (); 127 | } 128 | 129 | else { 130 | builder.AppendFormat (@"{0};", newValueDict[key]).AppendLine (); 131 | } 132 | 133 | } 134 | 135 | builder.AppendLine().AppendLine ("}"); 136 | 137 | //書き出し、ファイル名はクラス名.cs 138 | string exportPath = EXPORT_DIRECTORY_PATH + className + SCRIPT_EXTENSION; 139 | 140 | //書き出し先のディレクトリが無ければ作成 141 | string directoryName = Path.GetDirectoryName (exportPath); 142 | if (!Directory.Exists (directoryName)) { 143 | Directory.CreateDirectory(directoryName); 144 | } 145 | 146 | File.WriteAllText (exportPath, builder.ToString (), Encoding.UTF8); 147 | AssetDatabase.Refresh (ImportAssetOptions.ImportRecursive); 148 | 149 | Debug.Log (className + SCRIPT_EXTENSION + "の作成が完了しました"); 150 | } 151 | 152 | 153 | /// 154 | /// 無効な文字を削除します 155 | /// 156 | private static string RemoveInvalidChars(string str){ 157 | Array.ForEach(INVALUD_CHARS, c => str = str.Replace(c, string.Empty)); 158 | return str; 159 | } 160 | 161 | /// 162 | /// 区切り文字を大文字の前に設定する 163 | /// 164 | private static string SetDelimiterBeforeUppercase(string str){ 165 | string conversionStr = ""; 166 | 167 | for(int strNo = 0; strNo < str.Length; strNo++){ 168 | 169 | bool isSetDelimiter = true; 170 | 171 | //最初には設定しない 172 | if(strNo == 0){ 173 | isSetDelimiter = false; 174 | } 175 | //小文字か数字なら設定しない 176 | else if(char.IsLower(str[strNo]) || char.IsNumber(str[strNo])){ 177 | isSetDelimiter = false; 178 | } 179 | //判定してるの前が大文字なら設定しない(連続大文字の時) 180 | else if(char.IsUpper(str[strNo - 1]) && !char.IsNumber(str[strNo])){ 181 | isSetDelimiter = false; 182 | } 183 | //判定してる文字かその文字の前が区切り文字なら設定しない 184 | else if(str[strNo] == DELIMITER || str[strNo - 1] == DELIMITER){ 185 | isSetDelimiter = false; 186 | } 187 | 188 | //文字設定 189 | if(isSetDelimiter){ 190 | conversionStr += DELIMITER.ToString(); 191 | } 192 | conversionStr += str.ToUpper() [strNo]; 193 | 194 | } 195 | 196 | return conversionStr; 197 | } 198 | 199 | } -------------------------------------------------------------------------------- /Assets/Editor/ConstantsClassCreator.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 01fbe01852a964c72a01f5eb9e8ba6cb 3 | timeCreated: 1448847713 4 | licenseType: Free 5 | MonoImporter: 6 | serializedVersion: 2 7 | defaultReferences: [] 8 | executionOrder: 0 9 | icon: {instanceID: 0} 10 | userData: 11 | assetBundleName: 12 | assetBundleVariant: 13 | -------------------------------------------------------------------------------- /Assets/Editor/SymbolEditor.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 0033b6bec2484483c8599848db9ee231 3 | folderAsset: yes 4 | timeCreated: 1448847574 5 | licenseType: Free 6 | DefaultImporter: 7 | userData: 8 | assetBundleName: 9 | assetBundleVariant: 10 | -------------------------------------------------------------------------------- /Assets/Editor/SymbolEditor/DefineSymbol.cs: -------------------------------------------------------------------------------- 1 | // DefineSymbol.cs 2 | // http://kan-kikuchi.hatenablog.com/entry/ScriptingDefineSymbolsEditor 3 | // 4 | // Created by kan kikuchi on 2015.09.30. 5 | 6 | using UnityEditor; 7 | using UnityEngine; 8 | using System.Collections; 9 | using System.Collections.Generic; 10 | using System.Text.RegularExpressions; 11 | 12 | /// 13 | /// Symbol名、対応する値、説明を持ったSymbolのクラス 14 | /// 15 | public class DefineSymbol { 16 | 17 | //シンボルのkey 18 | private string _key; 19 | public string Key{ 20 | get{return _key;} 21 | } 22 | 23 | //シンボルに対応した値 24 | private string _value = ""; 25 | public string Value{ 26 | get{return _value;} 27 | } 28 | 29 | //シンボルが有効か 30 | private bool _isEnabled = true; 31 | public bool IsEnabled{ 32 | get{return _isEnabled;} 33 | } 34 | 35 | //シンボルの説明 36 | private string _info = ""; 37 | public string Info{ 38 | get{return _info;} 39 | } 40 | 41 | //保存する時のkeyの形式 42 | private const string SYMBOL_VALUE_SAVE_KEY_FORMAT = "SymbolValueKeyFor{0}"; 43 | private const string SYMBOL_INFO_SAVE_KEY_FORMAT = "SymbolInfoKeyFor{0}"; 44 | 45 | //================================================================================= 46 | //初期化 47 | //================================================================================= 48 | 49 | /// 50 | /// keyと有効かどうか指定して初期化する 51 | /// 52 | public DefineSymbol (string key, bool isEnabled){ 53 | 54 | _key = key; 55 | _isEnabled = isEnabled; 56 | 57 | //シンボルに対応した値を取得 58 | _value = EditorUserSettings.GetConfigValue (GetSymbolValueSaveKey(_key)); 59 | if(string.IsNullOrEmpty(_value)){ 60 | _value = ""; 61 | } 62 | 63 | //シンボルの説明を取得 64 | _info = EditorUserSettings.GetConfigValue (GetSymbolInfoSaveKey(_key)); 65 | if(string.IsNullOrEmpty(_info)){ 66 | _info = ""; 67 | } 68 | } 69 | 70 | //================================================================================= 71 | //内部 72 | //================================================================================= 73 | 74 | //シンボルに対応した値を保存する時に使うkeyを取得 75 | private string GetSymbolValueSaveKey(string symbol){ 76 | return string.Format (SYMBOL_VALUE_SAVE_KEY_FORMAT, symbol); 77 | } 78 | 79 | //シンボルの説明を保存する時に使うkeyを取得 80 | private string GetSymbolInfoSaveKey(string symbol){ 81 | return string.Format (SYMBOL_INFO_SAVE_KEY_FORMAT, symbol); 82 | } 83 | 84 | //シンボル名を半角英数字+アンダースコア以外を除き、大文字で設定 85 | private static string ModifyKey(string symbol){ 86 | Regex regex = new Regex(@"[^_a-zA-Z0-9]"); 87 | symbol = regex.Replace(symbol, ""); 88 | return symbol.ToUpper (); 89 | } 90 | 91 | //================================================================================= 92 | //変更 93 | //================================================================================= 94 | 95 | /// 96 | /// シンボルに対応した値と情報を削除する 97 | /// 98 | public void DeleteValueAndInfo(){ 99 | //シンボルに対応する値を削除 100 | _value = ""; 101 | EditorUserSettings.SetConfigValue (GetSymbolValueSaveKey(_key), ""); 102 | 103 | //シンボルの説明を削除 104 | _info = ""; 105 | EditorUserSettings.SetConfigValue (GetSymbolInfoSaveKey(_key), ""); 106 | } 107 | 108 | /// 109 | /// シンボルの設定を編集する 110 | /// 111 | public void Edit(string key, string symbolValue, string symbolInfo, bool isEnabled){ 112 | _key = ModifyKey (key); 113 | _value = symbolValue; 114 | _info = symbolInfo; 115 | _isEnabled = isEnabled; 116 | } 117 | 118 | /// 119 | /// シンボルの設定を編集する 120 | /// 121 | public void Edit(bool isEnabled){ 122 | _isEnabled = isEnabled; 123 | } 124 | 125 | //================================================================================= 126 | //保存 127 | //================================================================================= 128 | 129 | /// 130 | /// シンボルの設定を保存する 131 | /// 132 | public void Save(){ 133 | //シンボルに対応する値を保存 134 | EditorUserSettings.SetConfigValue (GetSymbolValueSaveKey(_key), _value); 135 | 136 | //シンボルの説明を保存 137 | EditorUserSettings.SetConfigValue (GetSymbolInfoSaveKey(_key), _info); 138 | } 139 | 140 | } 141 | -------------------------------------------------------------------------------- /Assets/Editor/SymbolEditor/DefineSymbol.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 536f21a28bd0449498c6ee295b5752fc 3 | MonoImporter: 4 | serializedVersion: 2 5 | defaultReferences: [] 6 | executionOrder: 0 7 | icon: {instanceID: 0} 8 | userData: 9 | -------------------------------------------------------------------------------- /Assets/Editor/SymbolEditor/SymbolEditor.cs: -------------------------------------------------------------------------------- 1 | // SymbolEditor.cs 2 | // http://kan-kikuchi.hatenablog.com/entry/ScriptingDefineSymbolsEditor 3 | // 4 | // Created by kan kikuchi on 2015.09.30. 5 | 6 | using UnityEditor; 7 | using UnityEngine; 8 | using System; 9 | using System.Linq; 10 | using System.Collections; 11 | using System.Collections.Generic; 12 | 13 | /// 14 | /// DefineSymbolを操作するクラス 15 | /// 16 | public static class SymbolEditor { 17 | 18 | //シンボルを区切る文字 19 | private const string SYMBOL_SEPARATOR = ";"; 20 | 21 | //シンボル名一覧を保存する時のkey 22 | private const string SYMBOL_KEY_LIST_SAVE_KEY = "SymbolKeyListKey"; 23 | 24 | //シンボル一覧 25 | private static List _symbolList; 26 | public static List SymbolList{ 27 | get{ 28 | if(_symbolList == null){ 29 | Init (); 30 | } 31 | return _symbolList; 32 | } 33 | } 34 | 35 | //現在選ばれてるプラットフォーム 36 | private static BuildTargetGroup _targetGroup; 37 | public static BuildTargetGroup TargetGroup{ 38 | get{return _targetGroup;} 39 | } 40 | 41 | //シンボルを編集したか 42 | private static bool _isEdited = false; 43 | public static bool IsEdited{ 44 | get{return _isEdited;} 45 | } 46 | 47 | //重複したシンボルのkeyがあるか 48 | public static bool IsDuplicateSymbolKey{ 49 | get{return _symbolList.Select (symbol => symbol.Key).Distinct().Count() != _symbolList.Count;} 50 | } 51 | 52 | //================================================================================= 53 | //初期化 54 | //================================================================================= 55 | 56 | //メニューからウィンドウを表示 57 | [MenuItem("Tools/Open/SymbolEditorWindow")] 58 | public static void Open (){ 59 | SymbolEditorWindow.GetWindow (typeof(SymbolEditorWindow)); 60 | } 61 | 62 | /// 63 | /// 初期化 64 | /// 65 | public static void Init(){ 66 | _isEdited = false; 67 | 68 | //現在選ばれてるプラットフォームを取得 69 | _targetGroup = EditorUserBuildSettings.selectedBuildTargetGroup; 70 | 71 | //シンボルのkeyをまとめるリスト作成 72 | List symbolKeyList = new List(); 73 | 74 | //現在のプラットフォームに設定されてるシンボル名を取得し、リストに追加 75 | string[] settingSymbols = PlayerSettings.GetScriptingDefineSymbolsForGroup (_targetGroup).Split(new []{SYMBOL_SEPARATOR}, StringSplitOptions.None); 76 | symbolKeyList.AddRange (settingSymbols.ToList()); 77 | 78 | //EditorUserSettingsに保存されているシンボル名一覧があれば、リストに追加 79 | string savingSymbolKeys = EditorUserSettings.GetConfigValue (SYMBOL_KEY_LIST_SAVE_KEY); 80 | 81 | List savingSymbolKeyList = new List ();; 82 | if(!string.IsNullOrEmpty(savingSymbolKeys)){ 83 | savingSymbolKeyList = new List (savingSymbolKeys.Split(new []{SYMBOL_SEPARATOR}, StringSplitOptions.None)); 84 | } 85 | 86 | symbolKeyList.AddRange (savingSymbolKeyList); 87 | 88 | //空白及び重複しているシンボル名を除き、アルファベット順にソート 89 | symbolKeyList = symbolKeyList.Where(symbolKey => !string.IsNullOrEmpty(symbolKey)).Distinct().ToList(); 90 | symbolKeyList.Sort (); 91 | 92 | //各シンボルkeyからシンボルを作成 93 | _symbolList = new List (); 94 | foreach (string symbolKey in symbolKeyList) { 95 | 96 | bool isEnabled = settingSymbols.Contains (symbolKey); 97 | DefineSymbol symbol = new DefineSymbol (symbolKey, isEnabled); 98 | 99 | //EditorUserSettingsに保存されていなかったkeyは前のValueとInfoが残っている可能性があるので削除 100 | if(!savingSymbolKeyList.Contains(symbolKey)){ 101 | symbol.DeleteValueAndInfo (); 102 | } 103 | 104 | _symbolList.Add (symbol); 105 | } 106 | 107 | //有効になっているシンボルを上に表示するように 108 | _symbolList = _symbolList.OrderBy (symbol => symbol.IsEnabled ? 0 : 1).ToList(); 109 | 110 | } 111 | 112 | //================================================================================= 113 | //シンボル修正 114 | //================================================================================= 115 | 116 | /// 117 | /// シンボルを修正 118 | /// 119 | public static void EditSymbol(int symbolNo, string symbolKey, string symbolValue, string symbolInfo, bool isEnabled){ 120 | _isEdited = true; 121 | 122 | //新たなシンボル作成 123 | if(symbolNo >= _symbolList.Count){ 124 | DefineSymbol newSymbol = new DefineSymbol (symbolKey, isEnabled); 125 | _symbolList.Add (newSymbol); 126 | } 127 | 128 | DefineSymbol symbol = _symbolList[symbolNo]; 129 | symbol.Edit (symbolKey, symbolValue, symbolInfo, isEnabled); 130 | } 131 | 132 | /// 133 | /// 全てのシンボルを有効or無効にする 134 | /// 135 | public static void SetAllEnabled(bool isEnabled){ 136 | _isEdited = true; 137 | 138 | foreach (DefineSymbol symbol in _symbolList) { 139 | symbol.Edit (isEnabled); 140 | } 141 | } 142 | 143 | /// 144 | /// 全てのシンボルを削除する 145 | /// 146 | public static void AllDelete(){ 147 | _isEdited = true; 148 | 149 | _symbolList.Clear (); 150 | } 151 | 152 | /// 153 | /// シンボルを削除する 154 | /// 155 | public static void Delete(int symbolNo){ 156 | if(symbolNo >= _symbolList.Count){ 157 | return; 158 | } 159 | _isEdited = true; 160 | 161 | _symbolList [symbolNo].DeleteValueAndInfo (); 162 | _symbolList.RemoveAt (symbolNo); 163 | } 164 | 165 | //================================================================================= 166 | //シンボルの保存 167 | //================================================================================= 168 | 169 | /// 170 | /// 指定したプラットフォームにシンボルを保存 171 | /// 172 | public static void Save(BuildTargetGroup targetGroup, bool needToCreateDefineValue = true){ 173 | _isEdited = false; 174 | 175 | //シンボルのkeyを空白を無視かつ重複しないようにに取得 176 | List symbolKeyList = _symbolList 177 | .Select(symbol => symbol.Key).Where (symbolKey => !string.IsNullOrEmpty(symbolKey)) 178 | .Distinct().ToList (); 179 | 180 | //シンボルを一つの文字列にまとめ、EditorUserSettingsに保存 181 | EditorUserSettings.SetConfigValue (SYMBOL_KEY_LIST_SAVE_KEY, string.Join(SYMBOL_SEPARATOR ,symbolKeyList.ToArray())); 182 | 183 | //各シンボルの対応した設定を保存 184 | string enabledSymbols = ""; 185 | Dictionary _defineValueDic = new Dictionary(); 186 | 187 | foreach (DefineSymbol symbol in _symbolList) { 188 | 189 | symbol.Save (); 190 | 191 | //valueが設定されている場合は定数クラスに書き出すためにDictにまとめる 192 | if(needToCreateDefineValue && !string.IsNullOrEmpty(symbol.Value)){ 193 | _defineValueDic[symbol.Key] = symbol.Value; 194 | } 195 | 196 | //有効になっているシンボルは設定するように;区切りでenabledSymbolsにまとめる 197 | if(symbol.IsEnabled){ 198 | 199 | if(!string.IsNullOrEmpty(enabledSymbols)){ 200 | enabledSymbols += SYMBOL_SEPARATOR; 201 | } 202 | enabledSymbols += symbol.Key; 203 | } 204 | 205 | } 206 | 207 | //設定するグループが不明だとエラーがでるので設定しないように 208 | if(targetGroup != BuildTargetGroup.Unknown){ 209 | PlayerSettings.SetScriptingDefineSymbolsForGroup (targetGroup, enabledSymbols); 210 | } 211 | 212 | //Symbolに対応した値を定数クラス、DefineValueを書き出す 213 | if(needToCreateDefineValue){ 214 | ConstantsClassCreator.Create("DefineValue", "Symbolに対応した値を定数で管理するクラス", _defineValueDic); 215 | } 216 | 217 | } 218 | 219 | /// 220 | /// 全プラットフォームに同じシンボルを保存 221 | /// 222 | public static void SaveAll(){ 223 | 224 | //Symbolに対応した値をまとめたDefineValueを作成するかのフラグ 225 | bool needToCreateDefineValue = true; 226 | 227 | foreach (BuildTargetGroup buildTarget in Enum.GetValues(typeof(BuildTargetGroup))){ 228 | 229 | if (!IsObsolete(buildTarget)){ 230 | Save(buildTarget, needToCreateDefineValue); 231 | 232 | //一度書き出したら、DefineValueを再度書き出さないように 233 | needToCreateDefineValue = false; 234 | } 235 | } 236 | } 237 | 238 | public static bool IsObsolete(Enum value){ 239 | var fi = value.GetType().GetField(value.ToString()); 240 | var attributes = (ObsoleteAttribute[]) 241 | fi.GetCustomAttributes(typeof(ObsoleteAttribute), false); 242 | return (attributes != null && attributes.Length > 0); 243 | } 244 | } 245 | -------------------------------------------------------------------------------- /Assets/Editor/SymbolEditor/SymbolEditor.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 5c46da96187d542168098162b650db70 3 | MonoImporter: 4 | serializedVersion: 2 5 | defaultReferences: [] 6 | executionOrder: 0 7 | icon: {instanceID: 0} 8 | userData: 9 | -------------------------------------------------------------------------------- /Assets/Editor/SymbolEditor/SymbolEditorWindow.cs: -------------------------------------------------------------------------------- 1 | // DefineSymbolController.cs 2 | // http://kan-kikuchi.hatenablog.com/entry/ScriptingDefineSymbolsEditor 3 | // 4 | // Created by kan kikuchi on 2015.09.30. 5 | 6 | using UnityEditor; 7 | using UnityEngine; 8 | using System; 9 | using System.Collections; 10 | using System.Collections.Generic; 11 | 12 | /// 13 | /// DefineSymbolを操作する時に使うウィンドウ 14 | /// 15 | public class SymbolEditorWindow : EditorWindow { 16 | 17 | private Vector2 _scrollPosition = Vector2.zero; 18 | 19 | //================================================================================= 20 | //初期化 21 | //================================================================================= 22 | 23 | private void OnEnable (){ 24 | SymbolEditor.Init (); 25 | } 26 | 27 | //================================================================================= 28 | //表示するGUIの設定 29 | //================================================================================= 30 | 31 | private void OnGUI(){ 32 | 33 | if(EditorApplication.isPlaying || Application.isPlaying || EditorApplication.isCompiling){ 34 | EditorGUILayout.HelpBox("コンパイル中、実行中は変更できません", MessageType.Warning); 35 | return; 36 | } 37 | 38 | //変更があり、セーブしていない時は上に注意を表示 39 | if(SymbolEditor.IsEdited){ 40 | EditorGUILayout.HelpBox("保存されていない情報があります", MessageType.Warning); 41 | } 42 | else{ 43 | EditorGUILayout.HelpBox ("保存済みです", MessageType.Info); 44 | } 45 | 46 | _scrollPosition = EditorGUILayout.BeginScrollView(_scrollPosition, GUI.skin.scrollView); 47 | EditorGUILayout.PrefixLabel("Current Target : " + SymbolEditor.TargetGroup.ToString()); 48 | 49 | //シンボル一覧表示 50 | EditorGUILayout.BeginVertical( GUI.skin.box ); 51 | { 52 | EditorGUILayout.PrefixLabel("Scripting Define Symbols"); 53 | CreateSymbolMenu (); 54 | } 55 | EditorGUILayout.EndVertical(); 56 | 57 | GUILayout.Space (20); 58 | 59 | //Saveメニューを並べる 60 | EditorGUILayout.BeginVertical( GUI.skin.box ); 61 | { 62 | EditorGUILayout.PrefixLabel("Save"); 63 | CreateSaveMenu (); 64 | } 65 | EditorGUILayout.EndVertical(); 66 | 67 | EditorGUILayout.EndScrollView(); 68 | } 69 | 70 | //シンボルのメニューを作成 71 | private void CreateSymbolMenu(){ 72 | 73 | //シンボル分メニュー作成 74 | List symbolList = SymbolEditor.SymbolList; 75 | for (int i = 0; i < symbolList.Count; i++) { 76 | CreateSymbolMenuParts (symbolList [i], i); 77 | GUILayout.Space (5); 78 | } 79 | 80 | //新規に追加できるよう、空白のメニューを追加 81 | DefineSymbol newSymbol = new DefineSymbol ("", false); 82 | CreateSymbolMenuParts (newSymbol, symbolList.Count); 83 | 84 | GUILayout.Space (10); 85 | 86 | //保存されている状態に戻すボタン 87 | if(GUILayout.Button ("Reset")){ 88 | SymbolEditor.Init(); 89 | } 90 | 91 | GUILayout.Space (10); 92 | 93 | //全部無効にするボタン 94 | if(GUILayout.Button ("All Invalid")){ 95 | SymbolEditor.SetAllEnabled(false); 96 | } 97 | 98 | //全部有効にするボタン 99 | if(GUILayout.Button ("All Valid")){ 100 | SymbolEditor.SetAllEnabled(true); 101 | } 102 | 103 | GUILayout.Space (10); 104 | 105 | //全部削除するボタン 106 | if(GUILayout.Button ("All Delete")){ 107 | SymbolEditor.AllDelete(); 108 | } 109 | } 110 | 111 | //各シンボルのメニューを作成 112 | private void CreateSymbolMenuParts(DefineSymbol symbol, int symbolNo){ 113 | 114 | //有効になっているかどうかでスキンを変える 115 | EditorGUILayout.BeginVertical(symbol.IsEnabled ? GUI.skin.button : GUI.skin.textField); 116 | { 117 | 118 | //内容の変更チェック開始 119 | EditorGUI.BeginChangeCheck (); 120 | 121 | string symbolKey = symbol.Key; 122 | bool isEnabled = symbol.IsEnabled; 123 | 124 | EditorGUILayout.BeginHorizontal (); 125 | { 126 | //内容の変更チェック開始 127 | EditorGUI.BeginChangeCheck (); 128 | 129 | //チェックボックス作成 130 | isEnabled = EditorGUILayout.Toggle (isEnabled, GUILayout.Width(15)); 131 | 132 | //シンボル名 133 | EditorGUILayout.LabelField("Symbol", GUILayout.Width(45)); 134 | symbolKey = GUILayout.TextField(symbolKey); 135 | 136 | //最後の新規入力欄以外は削除ボタンを表示 137 | if(symbolNo < SymbolEditor.SymbolList.Count){ 138 | if (GUILayout.Button("X", GUILayout.Width(20), GUILayout.Height(14))){ 139 | SymbolEditor.Delete (symbolNo); 140 | return; 141 | } 142 | } 143 | 144 | } 145 | EditorGUILayout.EndHorizontal(); 146 | 147 | EditorGUI.indentLevel = 2; 148 | 149 | //シンボルに対応する値 150 | string symbolValue = symbol.Value; 151 | EditorGUILayout.BeginHorizontal (); 152 | { 153 | EditorGUILayout.LabelField("Value", GUILayout.Width(64)); 154 | symbolValue = GUILayout.TextField(symbolValue); 155 | } 156 | EditorGUILayout.EndHorizontal(); 157 | 158 | //シンボルの説明 159 | string symbolInfo = symbol.Info; 160 | EditorGUILayout.BeginHorizontal (); 161 | { 162 | EditorGUILayout.LabelField("Info", GUILayout.Width(64)); 163 | symbolInfo = GUILayout.TextField(symbolInfo); 164 | } 165 | EditorGUILayout.EndHorizontal(); 166 | 167 | //内容が変更されていれば、シンボルを編集 168 | if (EditorGUI.EndChangeCheck ()){ 169 | SymbolEditor.EditSymbol (symbolNo, symbolKey, symbolValue, symbolInfo, isEnabled); 170 | } 171 | 172 | } 173 | EditorGUILayout.EndVertical(); 174 | 175 | EditorGUI.indentLevel = 0; 176 | } 177 | 178 | //セーブメニュー作成 179 | private void CreateSaveMenu(){ 180 | if(SymbolEditor.IsDuplicateSymbolKey){ 181 | EditorGUILayout.HelpBox("Symbolが重複しているので保存できません。", MessageType.Warning); 182 | return; 183 | } 184 | 185 | if(GUILayout.Button ("Current Target")){ 186 | SymbolEditor.Save (SymbolEditor.TargetGroup); 187 | } 188 | if(GUILayout.Button ("All Target")){ 189 | SymbolEditor.SaveAll(); 190 | } 191 | } 192 | 193 | } 194 | -------------------------------------------------------------------------------- /Assets/Editor/SymbolEditor/SymbolEditorWindow.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 8f245a14c9fd4457a9b75eb6f6888109 3 | MonoImporter: 4 | serializedVersion: 2 5 | defaultReferences: [] 6 | executionOrder: 0 7 | icon: {instanceID: 0} 8 | userData: 9 | -------------------------------------------------------------------------------- /Assets/Scripts.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 88028938d3ec04c3fa8455b98831a18e 3 | folderAsset: yes 4 | timeCreated: 1448945203 5 | licenseType: Free 6 | DefaultImporter: 7 | userData: 8 | assetBundleName: 9 | assetBundleVariant: 10 | -------------------------------------------------------------------------------- /Assets/Scripts/Constants.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 800ea0f19bd2f402b9fa9e25508820f6 3 | folderAsset: yes 4 | timeCreated: 1448848658 5 | licenseType: Free 6 | DefaultImporter: 7 | userData: 8 | assetBundleName: 9 | assetBundleVariant: 10 | -------------------------------------------------------------------------------- /Assets/Scripts/Constants/DefineValue.cs: -------------------------------------------------------------------------------- 1 | /// 2 | /// Symbolに対応した値を定数で管理するクラス 3 | /// 4 | public static class DefineValue{ 5 | 6 | 7 | } 8 | -------------------------------------------------------------------------------- /Assets/Scripts/Constants/DefineValue.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: eb9800d0c012a4fe8a4e3cbf10c0ba01 3 | timeCreated: 1448848658 4 | licenseType: Free 5 | MonoImporter: 6 | serializedVersion: 2 7 | defaultReferences: [] 8 | executionOrder: 0 9 | icon: {instanceID: 0} 10 | userData: 11 | assetBundleName: 12 | assetBundleVariant: 13 | -------------------------------------------------------------------------------- /Assets/Untitled.unity: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kankikuchi/ScriptingDefineSymbolsEditor/bfa80c97c5d54b0b21fb27abdd7ef04dd980d21c/Assets/Untitled.unity -------------------------------------------------------------------------------- /Assets/Untitled.unity.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 0cccaee6baf254a4894f5c6bb283d127 3 | timeCreated: 1448945206 4 | licenseType: Free 5 | DefaultImporter: 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015 Kan Kikuchi 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /ProjectSettings/AudioManager.asset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kankikuchi/ScriptingDefineSymbolsEditor/bfa80c97c5d54b0b21fb27abdd7ef04dd980d21c/ProjectSettings/AudioManager.asset -------------------------------------------------------------------------------- /ProjectSettings/DynamicsManager.asset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kankikuchi/ScriptingDefineSymbolsEditor/bfa80c97c5d54b0b21fb27abdd7ef04dd980d21c/ProjectSettings/DynamicsManager.asset -------------------------------------------------------------------------------- /ProjectSettings/EditorBuildSettings.asset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kankikuchi/ScriptingDefineSymbolsEditor/bfa80c97c5d54b0b21fb27abdd7ef04dd980d21c/ProjectSettings/EditorBuildSettings.asset -------------------------------------------------------------------------------- /ProjectSettings/EditorSettings.asset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kankikuchi/ScriptingDefineSymbolsEditor/bfa80c97c5d54b0b21fb27abdd7ef04dd980d21c/ProjectSettings/EditorSettings.asset -------------------------------------------------------------------------------- /ProjectSettings/GraphicsSettings.asset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kankikuchi/ScriptingDefineSymbolsEditor/bfa80c97c5d54b0b21fb27abdd7ef04dd980d21c/ProjectSettings/GraphicsSettings.asset -------------------------------------------------------------------------------- /ProjectSettings/InputManager.asset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kankikuchi/ScriptingDefineSymbolsEditor/bfa80c97c5d54b0b21fb27abdd7ef04dd980d21c/ProjectSettings/InputManager.asset -------------------------------------------------------------------------------- /ProjectSettings/NavMeshAreas.asset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kankikuchi/ScriptingDefineSymbolsEditor/bfa80c97c5d54b0b21fb27abdd7ef04dd980d21c/ProjectSettings/NavMeshAreas.asset -------------------------------------------------------------------------------- /ProjectSettings/NetworkManager.asset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kankikuchi/ScriptingDefineSymbolsEditor/bfa80c97c5d54b0b21fb27abdd7ef04dd980d21c/ProjectSettings/NetworkManager.asset -------------------------------------------------------------------------------- /ProjectSettings/Physics2DSettings.asset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kankikuchi/ScriptingDefineSymbolsEditor/bfa80c97c5d54b0b21fb27abdd7ef04dd980d21c/ProjectSettings/Physics2DSettings.asset -------------------------------------------------------------------------------- /ProjectSettings/ProjectSettings.asset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kankikuchi/ScriptingDefineSymbolsEditor/bfa80c97c5d54b0b21fb27abdd7ef04dd980d21c/ProjectSettings/ProjectSettings.asset -------------------------------------------------------------------------------- /ProjectSettings/ProjectVersion.txt: -------------------------------------------------------------------------------- 1 | m_EditorVersion: 5.2.2f1 2 | m_StandardAssetsVersion: 0 3 | -------------------------------------------------------------------------------- /ProjectSettings/QualitySettings.asset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kankikuchi/ScriptingDefineSymbolsEditor/bfa80c97c5d54b0b21fb27abdd7ef04dd980d21c/ProjectSettings/QualitySettings.asset -------------------------------------------------------------------------------- /ProjectSettings/TagManager.asset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kankikuchi/ScriptingDefineSymbolsEditor/bfa80c97c5d54b0b21fb27abdd7ef04dd980d21c/ProjectSettings/TagManager.asset -------------------------------------------------------------------------------- /ProjectSettings/TimeManager.asset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kankikuchi/ScriptingDefineSymbolsEditor/bfa80c97c5d54b0b21fb27abdd7ef04dd980d21c/ProjectSettings/TimeManager.asset -------------------------------------------------------------------------------- /ProjectSettings/UnityAdsSettings.asset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kankikuchi/ScriptingDefineSymbolsEditor/bfa80c97c5d54b0b21fb27abdd7ef04dd980d21c/ProjectSettings/UnityAdsSettings.asset -------------------------------------------------------------------------------- /ProjectSettings/UnityAnalyticsManager.asset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kankikuchi/ScriptingDefineSymbolsEditor/bfa80c97c5d54b0b21fb27abdd7ef04dd980d21c/ProjectSettings/UnityAnalyticsManager.asset -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | UnityのScripting Define Symbolsを使いやすくするエディタ拡張。 2 | 3 |
4 | 使用例(YouTube)
5 | [![](http://img.youtube.com/vi/PKWK7rxI9ds/0.jpg)](https://www.youtube.com/watch?v=PKWK7rxI9ds) 6 |


7 | 8 | これを使うと以下のよう事が可能になります。 9 | 10 | - シンボルの確認、作成、削除、編集が簡単に 11 | - シンボルを消さずに有効、無効の切り替え 12 | - なんのシンボルか説明が書けるように 13 | - 全プラットフォーム一括設定(個別も可) 14 | - defineによる定数宣言の代替(主にデバッグ用) 15 | 16 |

17 | 以下、導入&解説記事 18 |

19 | [Scripting Define Symbolsを劇的に使いやすくするエディタ拡張【Unity】【エディタ拡張】](http://kan-kikuchi.hatenablog.com/entry/ScriptingDefineSymbolsEditor) 20 | 21 |

22 | This software is released under the MIT License, see LICENSE.txt. --------------------------------------------------------------------------------