unity3d DefineManager 全局宏定义
/**
* 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 全局宏定义的更多相关文章
- SW4STM32 全局宏定义
/************************************************************************************ * SW4STM32 全局宏 ...
- android C/C++ source files 全局宏定义 .
\system\core\include\arch\linux-arm AndroidConfig.h * ============================================== ...
- 项目中常用的全局宏定义#define
一 关于屏幕大小 #pragma mark - 屏幕宽高 #define SCREEN_BOUNDS ([UIScreen mainScreen].bounds) #define SCREEN_WID ...
- Qt全局宏和变量
1. Qt 全局宏定义 Qt版本号: QT_VERSION : (major << 16) + (minor << 8) + patch 检测版本号: QT_VERSION ...
- Object_C 定义全局宏的颜色时,报“Expected identifier”的错误
在定义全局颜色宏的时候,为了整齐把空格删了,写在了同一行里,调用的时候,出错提示“Expected identifier”,如下: 如果宏定义如上那样的话,在调用的时候,会出现如下的问题: 百思不得解 ...
- 如何为Swift进行宏定义
这阵子一直在自学Swift, 因为之前iOS的开发一直用Objective-C, 所以习惯了C语言那种宏定义方式, Swift作为一款更加安全的语言, 放弃了C语言中的宏定义, 有效的防止预编译时代码 ...
- App开发流程之通用宏定义及头文件
工欲善其事,必先利其器. 在正式实现各种炫酷的功能和UI前,做好准备工作是提高后续开发效率的必经之路. 所以,这个系列,我不是在各种堆技术,更关注的是“兵马动”之前的“粮草行”,有些繁琐,但当清晰理出 ...
- Obective-C之宏定义
优(dan)美(teng)的前奏 宏定义这个东东,估计大家在代码中应该天天用吧. 在我刚刚做的一个项目中,各种往代码里码“#define”这种预处理指令. 什么动画时长啊,cell高度啊,cell的个 ...
- Swift开发之 ---- Swift宏定义
swift中没有了#Define这种宏定义了,可以用let来声明常量来取代,判断当前系统版本 let IS_IOS7 = (UIDevice.currentDevice().systemVersion ...
随机推荐
- C语言 结构体中的成员域偏移量
//C语言中结构体中的成员域偏移量 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> # ...
- C#属性有什么作用
1,主要作用:将读,写权限分开.如果不使用属性,仅使用public, protected, private,这几个限制都是读,写属性一起的,可读就可写,不可读同时也不可写.不能实现只读不可写,只写不可 ...
- LinkedList方法总结 ListIterator和Iterator的区别
LinkedList也像ArrayList一样实现了基本的接口,但是它执行某些从操作时比ArrayList更高效,但在随机访问方面要逊色一些.LinkedList中有一些方法虽然名字不同,但可以完成相 ...
- JS实现星级评价
说明: 本方法采用了Jquery库,暂时检测兼容IE8版本.本示例的2种颜色的星星都是放入了一张png图片当中,当然还有其他的一些实现思路.本示例展示的情况是当前页面只有一个星级评价的情况. 思路: ...
- 用 CNTK 搞深度学习 (一) 入门
Computational Network Toolkit (CNTK) 是微软出品的开源深度学习工具包.本文介绍CNTK的基本内容,如何写CNTK的网络定义语言,以及跑通一个简单的例子. 根据微软开 ...
- 自己写的一个关于Linq to Entity 动态查询的例子
这两天一直想写一个动态查询的方式,先是晚上查询了一下,发现大家写的差不多都是一样的[如:http://www.cnblogs.com/ASPNET2008/archive/2012/10/28/274 ...
- JavaScript split() 方法
split() 方法用于把一个字符串分割成字符串数组.
- .net 开发人员如何自处
关于N家还是J家,谁家更阔绰有前途的问题,每年都要讨论一会,当然和各位兄弟在岗位上迷茫,不知位置在哪有关系,不过这个问题基本算是伪问题,这种东西放到更高的维度,真的什么都不是. 但是为什么J家好像是不 ...
- 【BZOJ1008】【HNOI2008】越狱(数学排列组合题)
1008: [HNOI2008]越狱 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 3140 Solved: 1317[Submit][Status] ...
- WCF 入门(29)
前言 最近工作比较忙,加了会班就不想再写东西了,就想洗洗睡. 但是这个视频真的不能断,不能像过去一样写了几集就停了. 现在公司在做一个MVC框架的项目,话说已经一年没有写MVC了,重新上手的感觉还可以 ...