/**
* Editor Wizard for easily managing global defines in Unity
* Place in Assets/Editor folder, or if you choose to place elsewhere
* be sure to also modify the DEF_MANAGER_PATH constant.
* @khenkel
*/

using UnityEngine;
using UnityEditor;
using System.IO;
using System.Collections;
using System.Collections.Generic;
using System.Text;

public class DefineManager : EditorWindow
{
const string DEF_MANAGER_PATH = "Assets/Editor/DefineManager.cs";

enum Compiler
{
CSharp,
Editor,
UnityScript,
Boo
}
Compiler compiler = Compiler.Editor;

// http://forum.unity3d.com/threads/93901-global-define/page2
// Do not modify these paths
const int COMPILER_COUNT = 4;
const string CSHARP_PATH = "Assets/smcs.rsp";
const string EDITOR_PATH = "Assets/gmcs.rsp";
const string UNITYSCRIPT_PATH = "Assets/us.rsp";
const string BOO_PATH = "Assets/boo.rsp";

List<string> csDefines = new List<string>();
List<string> booDefines = new List<string>();
List<string> usDefines = new List<string>();
List<string> editorDefines = new List<string>();

[MenuItem("Window/Define Manager")]
public static void OpenDefManager()
{
EditorWindow.GetWindow<DefineManager>(true, "Global Define Manager", true);
}

void OnEnable()
{
csDefines = ParseRspFile(CSHARP_PATH);
usDefines = ParseRspFile(UNITYSCRIPT_PATH);
booDefines = ParseRspFile(BOO_PATH);
editorDefines = ParseRspFile(EDITOR_PATH);
}

List<string> defs;
Vector2 scroll = Vector2.zero;
void OnGUI()
{
Color oldColor = GUI.backgroundColor;

GUILayout.BeginHorizontal();
for(int i = 0; i < COMPILER_COUNT; i++)
{
if(i == (int)compiler)
GUI.backgroundColor = Color.gray;

GUIStyle st;
switch(i)
{
case 0:
st = EditorStyles.miniButtonLeft;
break;
case COMPILER_COUNT-1:
st = EditorStyles.miniButtonRight;
break;
default:
st = EditorStyles.miniButtonMid;
break;
}

if(GUILayout.Button( ((Compiler)i).ToString(), st))
compiler = (Compiler)i;

GUI.backgroundColor = oldColor;
}
GUILayout.EndHorizontal();

switch(compiler)
{
case Compiler.CSharp:
defs = csDefines;
break;

case Compiler.Editor:
defs = editorDefines;
break;

case Compiler.UnityScript:
defs = usDefines;
break;

case Compiler.Boo:
defs = booDefines;
break;
}

GUILayout.Label(compiler.ToString() + " User Defines");

scroll = GUILayout.BeginScrollView(scroll);
for(int i = 0; i < defs.Count; i++)
{
GUILayout.BeginHorizontal();

defs[i] = EditorGUILayout.TextField(defs[i]);

GUI.backgroundColor = Color.red;
if(GUILayout.Button("x", GUIStyle.none, GUILayout.MaxWidth(18)))
defs.RemoveAt(i);
GUI.backgroundColor = oldColor;

GUILayout.EndHorizontal();

}

GUILayout.Space(4);

GUI.backgroundColor = Color.cyan;
if(GUILayout.Button("Add"))
defs.Add("NEW_DEFINE");

GUILayout.EndScrollView();

GUILayout.BeginHorizontal();
GUI.backgroundColor = Color.green;
if( GUILayout.Button("Apply") )
{
SetDefines(compiler, defs);
AssetDatabase.ImportAsset(DEF_MANAGER_PATH, ImportAssetOptions.ForceUpdate);
OnEnable();
}

GUI.backgroundColor = Color.red;
if(GUILayout.Button("Apply All", GUILayout.MaxWidth(64)))
for(int i = 0; i < COMPILER_COUNT; i++)
{
SetDefines((Compiler)i, defs);
AssetDatabase.ImportAsset(DEF_MANAGER_PATH, ImportAssetOptions.ForceUpdate);
OnEnable();
}

GUILayout.EndHorizontal();
GUI.backgroundColor = oldColor;
}

void SetDefines(Compiler compiler, List<string> defs)
{
switch(compiler)
{
case Compiler.CSharp:
WriteDefines(CSHARP_PATH, defs);
break;

case Compiler.UnityScript:
WriteDefines(UNITYSCRIPT_PATH, defs);
break;

case Compiler.Boo:
WriteDefines(BOO_PATH, defs);
break;

case Compiler.Editor:
WriteDefines(EDITOR_PATH, defs);
break;
}
}

List<string> ParseRspFile(string path)
{
if(!File.Exists(path))
return new List<string>();

string[] lines = File.ReadAllLines(path);
List<string> defs = new List<string>();

foreach(string cheese in lines)
{
if(cheese.StartsWith("-define:"))
{
defs.AddRange( cheese.Replace("-define:", "").Split(';') );
}
}

return defs;
}

void WriteDefines(string path, List<string> defs)
{
if(defs.Count < 1 && File.Exists(path))
{
File.Delete(path);

if(File.Exists(path + ".meta"))
File.Delete(path + ".meta");

AssetDatabase.Refresh();
return;
}

StringBuilder sb = new StringBuilder();
sb.Append("-define:");

for(int i = 0; i < defs.Count; i++)
{
sb.Append(defs[i]);
if(i < defs.Count-1) sb.Append(";");
}

using (StreamWriter writer = new StreamWriter(path, false))
{
writer.Write(sb.ToString());
}
}
}

unity3d DefineManager 全局宏定义的更多相关文章

  1. SW4STM32 全局宏定义

    /************************************************************************************ * SW4STM32 全局宏 ...

  2. android C/C++ source files 全局宏定义 .

    \system\core\include\arch\linux-arm AndroidConfig.h * ============================================== ...

  3. 项目中常用的全局宏定义#define

    一 关于屏幕大小 #pragma mark - 屏幕宽高 #define SCREEN_BOUNDS ([UIScreen mainScreen].bounds) #define SCREEN_WID ...

  4. Qt全局宏和变量

    1.  Qt 全局宏定义 Qt版本号: QT_VERSION :  (major << 16) + (minor << 8) + patch 检测版本号: QT_VERSION ...

  5. Object_C 定义全局宏的颜色时,报“Expected identifier”的错误

    在定义全局颜色宏的时候,为了整齐把空格删了,写在了同一行里,调用的时候,出错提示“Expected identifier”,如下: 如果宏定义如上那样的话,在调用的时候,会出现如下的问题: 百思不得解 ...

  6. 如何为Swift进行宏定义

    这阵子一直在自学Swift, 因为之前iOS的开发一直用Objective-C, 所以习惯了C语言那种宏定义方式, Swift作为一款更加安全的语言, 放弃了C语言中的宏定义, 有效的防止预编译时代码 ...

  7. App开发流程之通用宏定义及头文件

    工欲善其事,必先利其器. 在正式实现各种炫酷的功能和UI前,做好准备工作是提高后续开发效率的必经之路. 所以,这个系列,我不是在各种堆技术,更关注的是“兵马动”之前的“粮草行”,有些繁琐,但当清晰理出 ...

  8. Obective-C之宏定义

    优(dan)美(teng)的前奏 宏定义这个东东,估计大家在代码中应该天天用吧. 在我刚刚做的一个项目中,各种往代码里码“#define”这种预处理指令. 什么动画时长啊,cell高度啊,cell的个 ...

  9. Swift开发之 ---- Swift宏定义

    swift中没有了#Define这种宏定义了,可以用let来声明常量来取代,判断当前系统版本 let IS_IOS7 = (UIDevice.currentDevice().systemVersion ...

随机推荐

  1. [tools] Sublime text 3 神器

    同事给了一个Sublime text 3 增强优化版.<---神器   问题:中文文件名乱码:[因为我电脑调整了dpi] 解决: 在sublime text 3中,Preference, Set ...

  2. Android-MediaProvider数据库模式

    原文地址:http://www.otechu.me/zh/2011/10/schema-of-android-mediaprovider-database/ 摘要: Android MediaProv ...

  3. hp_jetdirect 9100漏洞检测

    #-*-coding=utf8-*- import socket import sys def main(): if len(sys.argv)<=1: print('Parameters er ...

  4. Caffe学习系列(14):初识数据可视化

    //   首先将caffe的根目录作为当前目录,然后加载caffe程序自带的小猫图片,并显示. 图片大小为360x480,三通道 In [1]: import numpy as np import m ...

  5. swift第一季基础语法

    同: 一.基础 同: 1常量和变量 2数据类型和数据类型转换 3别名 不同: 1可选类型optional 2BOOL类型 3元组类型 4断言Assertion 二.基本操作符 同: 1赋值和算术运算及 ...

  6. openssl实践总结

    openssl实验总结 OPENSSL简介 OpenSSL项目是一个协作开发一个健壮的,商业级的,全功能的,并且开放源代码工具包,它实现了安全套接字层(SSL v2/v3)和传输层安全(TLS v1) ...

  7. 『方案』《女友十年精华》 ORC 图片 文字识别 详解

    目的需求: 2008年,遇到一本电子书 <女友十年精华> 觉得很美,想 私藏 这些文章: >网络搜索文章 —— 没有找到: >反编译程序 —— 所有文字 都是图片格式(部分文章 ...

  8. Mediator Pattern --中介者模式原理及实现(C++)

    主要参考<大话设计模式>和<设计模式:可复用面向对象软件的基础>两本书.本文介绍中介者模式的实现. 中介者模式:What it is:Define an object that ...

  9. [codevs 1503]愚蠢的宠物(特殊的LCA)

    题目:http://codevs.cn/problem/1503/ 分析:一道裸的LCA,但是由于询问只有一次,所以可以简单打打……可以从a,b向父节点推直到1节点,然后比较两个序列,后面一段肯定相同 ...

  10. 百度地图 api 功能封装类 (ZMap.js) 本地搜索,范围查找实例 [源码下载]

    相关说明 1. 界面查看: 吐槽贴:百度地图 api 封装 的实用功能 [源码下载] 2. 功能说明: 百度地图整合功能分享修正版[ZMap.js] 实例源码! ZMap.js 本类方法功能大多使用 ...