Unity编译器拓展学习总结(一):常用工具API
文章目录
前言
最近花了不少时间学习了编译器拓展的东西,所以想着趁着有时间回过头来总结总结,将把我所学到的编译器拓展的相关知识给总结一下。
一、常用工具API
1、PrefabUtility
常用于制作预制体的API,常用方法是CreateAsPrefabAndConnect,这个可以制作一个预制体,并且与场景中的原预制体连接。
public class PrefabTest
{
[MenuItem("Test/Create Prefab")]
static void CreatePrefab()
{
GameObject gameObj = GameObject.Find("Cube");//要进行打包的游戏物体
string outPutPath = "Assets/Prefabs"+ "/" + gameObj.name + ".prefab";//要输出的路径
InteractionMode mInteractionMode = InteractionMode.AutomatedAction;//自动还是手动打包,手动可以支持Undo操作,撤销链接
PrefabUtility.SaveAsPrefabAssetAndConnect(gameObj, outPutPath, mInteractionMode);
}
}
2、AssetDatabase
与Asset数据相关的,可以用于制作AB包,刷新资产列表等。
AssetDatabase.Refresh();//用于刷新数据
3、EditorPrefs
用于编辑器存储相关的,与PlayerPrefs类似。
//如
EditorPrefs.SetString("GENERATE_CLASS_NAME","ssasasasasa");//Set相关的用于保存
EditorPrefs.GetString("GENERATE_CLASS_NAME");//Get相关的方法用于读取
4、Selection
用于选择相关的操作,可以获得当前选择的游戏物体、音乐资源等。
Debug.Log(Selection.activeGameObject.name);//第一个选择的游戏物体
Debug.Log(Selection.activeObject.name);//第一个选择的游戏物体,除了文件夹都可选
Debug.Log(Selection.objects.Length);//所有选择的物体
Debug.Log(Selection.activeTransform);//只能获取Hirearchy下的游戏物体
Debug.Log(Selection.transforms.Length);//只能获取Hirearchy下的所有点击物体
5、Undo
所有撤销类的操作,可以用这个类注册一系列的操作。
GameObject o=new GameObject("Test");
Undo.DestroyObjectImmediate(o);//利用Undo进行的删除物体操作
GameObject uiRootObj = new GameObject("UIRoot");
Undo.RegisterCreatedObjectUndo(uiRootObj, "Create UIRoot");//记录此时的GameObject状态,后续修改游戏物体撤销后可以回到此状态
GameObject canvas = new GameObject("Canvas");
Undo.SetTransformParent(canvas.transform, uiRootObj.transform, "Set Parent Canvas");//用于记录设置父节点的撤销
6、SerializedObject
序列化,可以对对象进行序列化,类似于反射的用法,可以获取到序列化类的字段,常用于检视Inspector面板拓展
using UnityEngine;
using UnityEditor;
public class MyObject : ScriptableObject
{
public int myInt = 42;
}
public class SerializedPropertyTest : MonoBehaviour
{
void Start()
{
MyObject obj = ScriptableObject.CreateInstance<MyObject>();//创建MyObject数据结构,也可以是组件
SerializedObject serializedObject = new UnityEditor.SerializedObject(obj);//创建一个序列化对象
SerializedProperty serializedPropertyMyInt = serializedObject.FindProperty("myInt");//获取myInt字段
Debug.Log("myInt " + serializedPropertyMyInt.intValue);//需要根据字段的不同类型获取不同的值
//serializeScript.ApplyModifiedPropertiesWithoutUndo();一般在复赋值后刷新用的方法
}
}
7、ScriptableObject
是Unity的一个数据容器,可以利用该文件存储如武器信息,任务信息等,利用CreateInstance()可以实例化出来一个.asset实例文件。
写法一:利用MenuItem创建
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//武器信息
[System.Serializable]
public class WeaponObject : ScriptableObject {
public string weaponName = "Weapon Name Here";
public int cost;
public string description;
public int damage;
}
接着写个创建该数据结构的脚本
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
public class MakeWeaponObject
{
//在顶部MenuItem(菜单)/Assets/Create/New Weapon目录下新建一个按钮,点击就执行下面的方法
[MenuItem("Assets/Create/New Weapon")]
public static void Creat() {
//新建一个weaponObject对象并实例它
WeaponObject asset = ScriptableObject.CreateInstance<WeaponObject>();
//将实例出来的对象做成一个.asset文件并存放在以下目录(可自定义)
AssetDatabase.CreateAsset(asset, "Assets/WeaponShop/WeaponObjects/New Weapon.asset");
//让unity自己的文件管理系统添加这个对象到目录下,貌似是为了生成一个meta文件
AssetDatabase.SaveAssets();
//接下来的写不写不影响,意思解释下就是让系统Focus到刚刚创建出来的文件
EditorUtility.FocusProjectWindow();
Selection.activeObject = asset;
}
}
写法二:注意脚本文件名要与类名一致,不然无法找到对应脚本
[CreateAssetMenu(fileName = "Data1", menuName = "ScriptableObjects/SpawnManagerScriptableObject2", order = 2)]
public class SpawnManagerScriptableObject2 : ScriptableObject
{
public string prefabName;
public int numberOfPrefabsToCreate;
public Vector3[] spawnPoints;
}
8、特性DidReloadScriptsAttrible
加上这个特性,在脚本编译完成后将会自动调用。
[DidReloadScripts]
static void AddComponentToGameObject()
{
Debug.Log("添加组件");
}
总结
本篇文章介绍了在编译器拓展中常用的工具API,通过这些工具API,可以很方便的进行一些相关的操作。
参考链接:scriptableobject类理解