在网上找了好多人博客。水平有限只能尽力整理,如有雷同,请看原著。。。。。
虽然很长,对于初级的我们还是有用的,每一个方法都不大,很简单,而且很多都很实用。
程序员的新人真的很难。愿未来的路可以顺利。。。
不抱怨,未来的路会更好!!!
[SerializeFiled]
将变量强制序列化在属性面板上。
[FormerlySerializedAs]
[HideInInspector]
在变量上使用这个属性,可以让public的变量在Inspector上隐藏。
[System.NonSerialized]用法一样
[RequireComponent(typeof(componet))]
放在类上使用,将类的脚本挂在对象上时会追加所需componet可以是自定义的脚本但必须继承自monobehavior
[AddComponentMenu("fbComponent/attributeTestScr")]
制作自己的组件,可以在菜单栏的component和属性面板的addcomponent中找到。
[ContextMenu]
放在方法上,可以在Inspector的ContextMenu中增加选项
[ContextMenuItem("标签名",对应方法名)]
给字段添加右键点击功能显示一个可执行的方法。
[Tooltip]
工具提示
[DisallowMultipleComponent]
修饰脚本类,这个类只能在同一个游戏对象上挂载一次
[ExecuteInEditMode]
修饰类,让类中的函数可以在编辑模式下运行。
比如Start,Update,OnGUI等方法。
与play模式下运行不同的是 Update方法只有在Scene编辑器中有物体产生变化时,才会被调用。
OnGUI方法只在GameView接收事件时被调用。
[HeaderAttribute]
放在字段的上面可以给字段在属性面板上增加标签。
[Multiline]
修饰字符串类型字段,可以在属性面板上输入多行文字
[Multiline(8)]
这样写可以设置属性面板上显示的行数,不写时默认为3行
[TextArea(1,7)]
效果与Multiline类似,但比其效果更好可设置最大行数和最小显示行数右侧还会出现滚动轴
[Range]
将值类型字段以滚动轴的形式展示(有上限下限值)
[Space]
在属性面板上增加空格
[DrawGizmo]
将游戏对象显示自定义的Gizmo图标类似摄影机在Scence视图的显示
Gizmo的图片要放入Assets/Gizmo目录中
[ImageEffectOpaque]
在OnRenderImage方法上使用,可以让渲染顺序在非透明物体之后,透明物体之前。
这是渲染级别的问题。
ImageEffectTransformToLDR
渲染从HDR变为LDR具体使用方法不明。
[ImageEffectOpaque]
在变量上使用,可以指定该变量在build的时候,不要转换为目标平台类型
[RPC]
修饰方法,可以网络通信中对该方法进行RPC调用
[CustomPreviewAttribute]
[InitializeOnload]
修饰类 在Unity启动时运行脚本,要求这个类有静态构造函数.这个属性需要引用UnityEditor。非play模式下也可以使用
[MenuItem("myTool/Tool1")]
修饰方法可以在菜单栏中显示
MenuItem菜单的先后排序:
[MenuItem("MenuItem/MenuItem2", false, 2)]
private static void MenuItemFunc2()
{
Debug.Log("MenuItemFunc2");
}
[MenuItem("MenuItem/MenuItem1", false, 1)]
private static void MenuItemFunc1()
{
Debug.Log("MenuItemFunc1");
}
如图中所示,虽然我们在写代码的时候是 item2 在前,但是我们在设置顺序时给它设的是2,所以最后显示的时候,则是1在前,2在后
MenuItem与快捷键进行关联:
[MenuItem("MenuItem/快捷键1 _%#&_HOME")]
private static void MenuItemFunc3()
{
Debug.Log("MenuItemFunc3");
}
[MenuItem("MenuItem/快捷键2 _%#&_LEFT")]
private static void MenuItemFunc4()
{
Debug.Log("MenuItemFunc4");
}
入图所示,这2个item选项跟快捷键关联起来了,可以直接使用快捷键来调用。
规则是:
% = ctrl
# = Shift
& = Alt
LEFT/RIGHT/UP/DOWN = 上下左右
F1…F2 = F...
HOME, END, PGUP, PGDN = 键盘上的特殊功能键
特别注意的是,如果是键盘上的普通按键,比如a~z,则要写成_a ~ _z这种带_前缀的。
选中的不是指定类型的对象,菜单项会被禁掉:
[MenuItem("MenuItem/Selected GameObject")]
private static void SelectedGameObject()
{
Debug.Log("SelectedGameObject");
}
[MenuItem("MenuItem/Selected GameObject", true)]
private static bool CheckObjectType()
{
Object selectedObject = Selection.activeObject;
if(selectedObject != null &&
selectedObject.GetType() == typeof(GameObject))
{
return true;
}
return false;
}
这段的意思就是,如果你没有选中任何游戏对象,或者你选中的不是GameObject类型的对象时,MenuItem/Selected GameObject选项会是被禁用的(灰色)状态,只有选的是指定类型的选项时,才是正常的可点击状态。
可以在 project 窗口里右键到菜单:
如图:
[MenuItem("Assets/在Project目录里右键1")]
private static void Assets_right_btn1()
{
Debug.Log("在Project目录里右键1");
}
我们只需要把选项设置在Assets目录的子上,就可以在Project窗口里右键出菜单了,当然也是可以有例如Assets/Create/XXX 这样的目录存在。
在 Inspector 窗口中的指定控件身上右键到选项:
如图:
[MenuItem("CONTEXT/Rigidbody/在Rigidbody上右键")]
private static void CONTEXT_Rigidbody_right_btn()
{
Debug.Log("在Rigidbody上右键");
}
有时候,我们想在某个控件上增加一些功能菜单,做一些比如自动给控件赋值等这种功能。
思路跟上面的其实是一样的,只不过我们这次的父换成了CONTEXT而已。
通过在 GameObject/UI 选项夹里增加选项,使菜单在Hierarchy窗口中被右键到:
如图:
[MenuItem("GameObject/UI/在GameObject目录里右键")]
private static void GameObject_right_btn()
{
Debug.Log("在GameObject目录里右键");
}
思路跟前面一样,我们在 GameObject/UI/ 目录下增加了一个选项,我们发现不止在 Hierarchy 窗口中看到了它,在顶部菜单栏相同的层次下也看到了它。
但是这里有个问题就是,我们并不能够像 GameObject/XXX 这样,把选项放在 UI 的外面,这样做的话,我们只会在顶部栏的 GameObject 目录下发现那个XXX的选项,在 Hierarchy 什么也不会有,这点需要大家注意。
补充:还有一种在Hierarchy窗口设置菜单的方法,就是用编辑器的EditorUtility类。
Serializable
/// <summary>
/// Serializable 可序列化
///这个属性可以让子类(继承类)的变量属性显示在检视面板中,也能序列化它。(JS的话完全不需要这个属性。)
/// </summary>
public class SerializableScr : SerializableTest
{
public SerializableTest1 test1;
}
[System.Serializable]
public class SerializableTest:MonoBehaviour
{
public int p = 5;
public Color c = Color.white;
}
[System.Serializable]
public class SerializableTest1
{
public int p = 5;
public Color c = Color.white;
}
[Obsolete]
放在一个方法前,表示一个方法被弃用 [Obsolete("这个方法已过时,请使用newmethod"),true]提示新方法,true表示已经放弃不能被调用,false表示可以被调用
[Conditional("IsTest")]
放在方法前,没有定义字符串"IsTest"宏的方法就不会被调用,定义字符串宏的方法为 在using上方写#define IsTest//定义一个宏
static void Method([CallerFilePath]string fileName="",[CallerLineNumber] int lineNumber=0,[CallerMemberName] string methodName=""){
Debug.log(fileName); //输出调用方法的位置
Debug.log(lineNumber); //输出调用方法的行数
Debug.log(methodName); //输出调用方法的方法名
}
[AssemblylsEditorAssembly]
汇编级属性,使用该属性的class会被人为是EditorClass。用法不明。