Unity编译器拓展学习总结(一):常用工具API

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类理解

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值