Unity3D插件开发教程
⼀、插件开发的起因
1.⽇常开发过程中会碰到许多重复且复杂的操作过程,⽐如数据的存储,资源⽂件的管理等等,我们在做这些事情的时候会浪贵很多的时间以及精⼒。
2.⼈为操作⼀些事情的时候,或多或少会出现⼀些问题。
⼆、插件的作⽤
1.提⾼项⽬开发的效率
2.增加项⽬开发的质⾥
3.增加团队合作的⽅便
三、菜单项相关操作
1.菜单项(MenuItem)
⼀般会在 Project-->Assets底下创建⼀个Editor⽂件夹,此⽂件夹⾥⾯主要存放编辑的关于插件相关的内容(脚本),此⽂件夹⾥⾯的脚本,打包项⽬的时候不会存放到包⾥⾯,所以⼀般插件都会存放到这⾥⾯。
第⼀步:在Editor⽂件夹⾥⾯创建C#脚本:如:MenuTest
第⼆步:编写MenuTest插件脚本
引⼊命名空间:using UnityEditor;
定义的⽅法前⾯,必须使⽤static修饰,且⽅法上⾯需要添加:[MenuItem("Menu/Test")]
注明:[MenuItem("Menu/Test")] ⾥⾯的不同参数,分别代表着使⽤什么⽅式打开
1//[MenuItem("Menu/Test")]:这种写法意味着没有快捷键,需要⿏标点击
2    [MenuItem("Menu/Test")]
3public static void Test()
4    {
5        Debug.Log("Test");
6    }
7
8//_w:表⽰没有组合键,直接按住键盘"w"使⽤
9    [MenuItem("Menu/Test1 _w")]
10public static void Test1()
11    {
12        Debug.Log("Test1");
13    }
14
15//#w:表⽰按住 Shift + w 使⽤
16    [MenuItem("Menu/Test2 #w")]
17public static void Test2()
18    {
19        Debug.Log("Test2");
20    }
21
22//%w:表⽰按住 Ctrl + w 使⽤
23    [MenuItem("Menu/Test3 %w")]
24public static void Test3()
25    {
26        Debug.Log("Test3");
27    }
28
29//&w:表⽰按住 Alt + w 使⽤
30    [MenuItem("Menu/Test4 &w")]
31public static void Test4()
32    {
33        Debug.Log("Test4");
34    }
在Unity3D 中效果展⽰:多出了⼀个"Menu"菜单,和"MenuTest"脚本中定义的5个⽅法
2.组件菜单(AddComponentMenu )
⽬的:⽅便添加组件相关的操作
第⼀步:组件菜单的⽂件存放⽬录不存放在Editor 下⾯,在新建⼀个"Scripts"⽬录,并创建"ComponentDemo"脚本
第⼆步:在创建的脚本类名上⾯添加:[AddComponentMenu("Demo/Demo1")],其中"Demo/Demo1"为开发者⾃定义的路径效果如下:
除此之外,⾃定义的组建,在菜单“Component”⾥⾯也有
3.上下⽂菜单(ContextMenu )
上下⽂菜单是定义在组件类⾥⾯的⽅法。
第⼀步:我们在上⽂创建的“ComponentDemo”类⾥⾯定义⼀个"ContextMenuDemo()"⽅法,注意:不
能使⽤static 修饰,并⽤:
[ContextMenu("ContextDemo")]标注上下⽂菜单的名字为:“ContextDemo”
第⼆步:回到Unity ⾯板中,创建⼀个游戏物体,并添加“Demo1”组件,然后⿏标在此组件上右击,就可以看到多了⼀个“ContextDemo”选项
4.必要组件菜单(RequireComponent)
⽐如:我们要求给游戏物体添加“Demo1”组件的时候,必须带上“Rigidbody”组件。
效果:当你给游戏物体添加“Demo1”组件的时候,会⾃动添加“Rigidbody”组件。
如果想要移除组件,必须先移除“Demo1”,再移除“Rigidbody”。
四、⾃定义Inspector界⾯
1.属性相关标识
a.隐藏属性显⽰(HideInInspector):单纯的隐藏变量
b.不显⽰属性(NonSerialized):不但隐藏变量,并且还会防⽌该变量的序列化保存,(⽆论在Inspector⾯板中设置Int3的值是多少,只要在C#中设置Int3的属性为“NonSerialized”并且假如设置的值为 3,那么Unity编译后,Inspector⾯板中的Int3的值就是3)
c.系列化域(SerializeField):将私有变量强制显⽰在Inspector⾯板⾥⾯
d.关键字系列化(Serializable):可以让⾃定义的类(不继承⾃:MonoBehaviour的类)显⽰在Inspector⾯板⾥⾯
2.⾃定义界⾯属性
Editor:⾃定义属性⾯板的基类
CustomEditor:类上⾯的标识
第⼀步:创建两个类,EditorDemo,Test1。EditorDemo需要放在Assets-->Editor⾥⾯,Test1类放⼊Scripts⾥⾯即可。
第⼆步:编写Test1代码,设置⼀些属性,并在⾥⾯引⼊新创建的类TypeDemo
1using System;
2using System.Collections;
3using System.Collections.Generic;
4using UnityEngine;
5
6public class Test1 : MonoBehaviour
7 {
8public int mIntVal;
9
10public float mFloatVal;
11
12public string mStrVal;
13
14public TypeDemo mTypeDemo;
15 }
16
17 [Serializable]//不添加序列化设置,属性值不会显⽰在Inspector⾯板⾥
18public class TypeDemo
19 {
20public int tIntVal;
21public string tStrVal;
22public float tFloatVal;
23 }
第三步:EditorDemo需要继承⾃Editor,并声明:[CustomEditor(typeof(Test1))]
1using System.Collections;
unity 教程
2using System.Collections.Generic;
3using UnityEditor;
4using UnityEngine;
5
6//是⼀个窗⼝脚本,所以要放在Assets-->Editor下⾯
7 [CustomEditor(typeof(Test1))]
8public class EditorDemo : Editor
9 {
10public SerializedObject mObj;//定义序列化⽬标对象
11//序列化出来⼏个属性,属性对应的是[CustomEditor(typeof(Test1))]中,Test1类⾥⾯的属性
12public SerializedProperty mIntVal;
13public SerializedProperty mFloatVal;
14public SerializedProperty mStrVal;
15public SerializedProperty mTypeDemo;
16
17//选择当前游戏对象
18private void OnEnable()
19    {
20//初始化
21this.mObj = new SerializedObject(target);
22//通过字符串名字,查Test1类⾥⾯的属性,并进⾏初始化
23this.mIntVal = this.mObj.FindProperty("mIntVal");
24this.mFloatVal = this.mObj.FindProperty("mFloatVal");
25this.mStrVal = this.mObj.FindProperty("mStrVal");
26
27this.mTypeDemo = this.mObj.FindProperty("mTypeDemo");
28    }
29
30//绘制
31public override void OnInspectorGUI()
32    {
33this.mObj.Update();
34
35        EditorGUILayout.PropertyField(this.mIntVal);
36        EditorGUILayout.PropertyField(this.mFloatVal);
37        EditorGUILayout.PropertyField(this.mStrVal);
38
39        EditorGUILayout.PropertyField(this.mTypeDemo, true);//true属性意思是设置显⽰⼦节点,也就是显⽰TypeDemo⾥⾯的属性40
41this.mObj.ApplyModifiedProperties();
42    }
43 }
效果展⽰:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。