Unity 導入觸發(fā)

資源加載時觸發(fā)


public class test:AssetPostprocessor  {
    //所有的資源的導入麸粮,刪除,移動寞焙,都會調(diào)用此方法猎塞,注意,這個方法是static的 
    public static void OnPostprocessAllAssets(string[] importedAsset, string[] deletedAssets, string[] movedAssets, string[] movedFromAssetPaths)
    {
        Debug.Log("OnPostprocessAllAssets");
        foreach (string str in importedAsset)
        {
            Debug.Log("importedAsset = " + str);
        }
        foreach (string str in deletedAssets)
        {
            Debug.Log("deletedAssets = " + str);
        }
        foreach (string str in movedAssets)
        {
            Debug.Log("movedAssets = " + str);
        }
        foreach (string str in movedFromAssetPaths)
        {
            Debug.Log("movedFromAssetPaths = " + str);
        }
    }

    

AddTag Scripts

using UnityEditor;

public static class TagHelper
{
    public static void AddTag(string tag)
    {
        UnityEngine.Object[] asset = AssetDatabase.LoadAllAssetsAtPath("ProjectSettings/TagManager.asset");
        if ((asset != null) && (asset.Length > 0))
        {
            SerializedObject so = new SerializedObject(asset[0]);
            SerializedProperty tags = so.FindProperty("tags");

            for (int i = 0; i < tags.arraySize; ++i)
            {
                if (tags.GetArrayElementAtIndex(i).stringValue == tag)
                {
                    return;     // Tag already present, nothing to do.
                }
            }

            tags.InsertArrayElementAtIndex(tags.arraySize);
            tags.GetArrayElementAtIndex(tags.arraySize - 1).stringValue = tag;
            so.ApplyModifiedProperties();
            so.Update();
        }
    }
}

taskManager 全方法

using System.Reflection;
using UnityEditor;
using System.Collections.Generic;
using UnityEngine;

public class test01 :AssetPostprocessor {

    // will check if the specified layer names are present and add any missing ones
    // it will simply add them from the first open slots so do not depend on any
    // specific order but rather grab layers from the layer names at runtime
    public static void CheckLayers(string[] layerNames)
    {
        SerializedObject manager = new SerializedObject(AssetDatabase.LoadAllAssetsAtPath("ProjectSettings/TagManager.asset")[0]);
#if !UNITY_4
        SerializedProperty layersProp = manager.FindProperty("layers");
#endif

        foreach (string name in layerNames)
        {
            // check if layer is present
            bool found = false;
            for (int i = 0; i <= 31; i++)
            {
#if UNITY_4
                    string nm = "User Layer " + i;
                    SerializedProperty sp = manager.FindProperty(nm);
#else
                SerializedProperty sp = layersProp.GetArrayElementAtIndex(i);
#endif
                if (sp != null && name.Equals(sp.stringValue))
                {
                    found = true;
                    break;
                }
            }

            // not found, add into 1st open slot
            if (!found)
            {
                SerializedProperty slot = null;
                for (int i = 8; i <= 31; i++)
                {
#if UNITY_4
                        string nm = "User Layer " + i;
                        SerializedProperty sp = manager.FindProperty(nm);
#else
                    SerializedProperty sp = layersProp.GetArrayElementAtIndex(i);
#endif
                    if (sp != null && string.IsNullOrEmpty(sp.stringValue))
                    {
                        slot = sp;
                        break;
                    }
                }

                if (slot != null)
                {
                    slot.stringValue = name;
                }
                else
                {
                    Debug.LogError("Could not find an open Layer Slot for: " + name);
                }
            }
        }

        // save
        manager.ApplyModifiedProperties();
    }

    public static void CheckTags(string[] tagNames)
    {
        SerializedObject manager = new SerializedObject(AssetDatabase.LoadAllAssetsAtPath("ProjectSettings/TagManager.asset")[0]);
        SerializedProperty tagsProp = manager.FindProperty("tags");

        List<string> DefaultTags = new List<string>() { "Untagged", "Respawn", "Finish", "EditorOnly", "MainCamera", "Player", "GameController" };

        foreach (string name in tagNames)
        {
            if (DefaultTags.Contains(name)) continue;

            // check if tag is present
            bool found = false;
            for (int i = 0; i < tagsProp.arraySize; i++)
            {
                SerializedProperty t = tagsProp.GetArrayElementAtIndex(i);
                if (t.stringValue.Equals(name)) { found = true; break; }
            }

            // if not found, add it
            if (!found)
            {
                tagsProp.InsertArrayElementAtIndex(0);
                SerializedProperty n = tagsProp.GetArrayElementAtIndex(0);
                n.stringValue = name;
            }
        }

        // save
        manager.ApplyModifiedProperties();
    }

    public static void CheckSortLayers(string[] tagNames)
    {
        SerializedObject manager = new SerializedObject(AssetDatabase.LoadAllAssetsAtPath("ProjectSettings/TagManager.asset")[0]);
        SerializedProperty sortLayersProp = manager.FindProperty("m_SortingLayers");

        //for (int i = 0; i < sortLayersProp.arraySize; i++)
        //{ // used to figure out how all of this works and what properties values look like
        //    SerializedProperty entry = sortLayersProp.GetArrayElementAtIndex(i);
        //    SerializedProperty name = entry.FindPropertyRelative("name");
        //    SerializedProperty unique = entry.FindPropertyRelative("uniqueID");
        //    SerializedProperty locked = entry.FindPropertyRelative("locked");
        //    Debug.Log(name.stringValue + " => " + unique.intValue + " => " + locked.boolValue);
        //}

        foreach (string name in tagNames)
        {
            // check if tag is present
            bool found = false;
            for (int i = 0; i < sortLayersProp.arraySize; i++)
            {
                SerializedProperty entry = sortLayersProp.GetArrayElementAtIndex(i);
                SerializedProperty t = entry.FindPropertyRelative("name");
                if (t.stringValue.Equals(name)) { found = true; break; }
            }

            // if not found, add it
            if (!found)
            {
                manager.ApplyModifiedProperties();
                AddSortingLayer();
                manager.Update();

                int idx = sortLayersProp.arraySize - 1;
                SerializedProperty entry = sortLayersProp.GetArrayElementAtIndex(idx);
                SerializedProperty t = entry.FindPropertyRelative("name");
                t.stringValue = name;
            }
        }

        // save
        manager.ApplyModifiedProperties();
    }

    // you need 'using System.Reflection;' for these
    private static Assembly editorAsm;
    private static MethodInfo AddSortingLayer_Method;

    /// <summary> add a new sorting layer with default name </summary>
    public static void AddSortingLayer()
    {
        if (AddSortingLayer_Method == null)
        {
            if (editorAsm == null) editorAsm = Assembly.GetAssembly(typeof(Editor));
            System.Type t = editorAsm.GetType("UnityEditorInternal.InternalEditorUtility");
            AddSortingLayer_Method = t.GetMethod("AddSortingLayer", (BindingFlags.Static | BindingFlags.NonPublic), null, new System.Type[0], null);
        }
        AddSortingLayer_Method.Invoke(null, null);
    }
 
}

最后用到的類

using System;
using System.Reflection;
using Assets.roguelike2d.game;
using UnityEditor;
using UnityEngine;


[InitializeOnLoad]
public class AddTagsAndLayers
{
    static AddTagsAndLayers()
    {
        SerializedObject tagManager =
                    new SerializedObject(AssetDatabase.LoadAllAssetsAtPath("ProjectSettings/TagManager.asset")[0]);
        //增加所有的Tags
        foreach (string str in Enum.GetNames(typeof(GameTags)))
        {
            AddTag(str, tagManager);
        }
        //從10層做起始層
        int startIndex = 10;
        int layerCount = 0;
        //增加所有的Layers
        foreach (var str in Enum.GetValues(typeof(GameLayers)))
        {
            AddLayer(str.ToString(), tagManager, startIndex + layerCount);
            layerCount++;
        }
        //增加所有的SortingLayers
        foreach (GameLayers str in Enum.GetValues(typeof(GameLayers)))
        {
            addSortingLayer(str, tagManager);
        }
    }


    static void addSortingLayer(GameLayers sortLayer, SerializedObject tagManager)
    {
        SerializedProperty sortingLayers = tagManager.FindProperty("m_SortingLayers");
        bool found = false;
        for (int i = 0; i < sortingLayers.arraySize; i++)
        {
            SerializedProperty t = sortingLayers.GetArrayElementAtIndex(i);
            if (t.FindPropertyRelative("name").stringValue.Equals(sortLayer.ToString()))
            {
                found = true;
                t.FindPropertyRelative("uniqueID").longValue = (long)sortLayer;
                break;
            }
        }
        if (!found)
        {
            sortingLayers.InsertArrayElementAtIndex(0);
            SerializedProperty sp = sortingLayers.GetArrayElementAtIndex(0);
            if (sp != null)
            {
                sp.FindPropertyRelative("name").stringValue = sortLayer.ToString();
                sp.FindPropertyRelative("uniqueID").longValue = (long)sortLayer;
            }
        }
        tagManager.ApplyModifiedProperties();
    }

    static void AddTag(string tag, SerializedObject tagManager)
    {
        SerializedProperty tagsProp = tagManager.FindProperty("tags");

        bool found = false;
        for (int i = 0; i < tagsProp.arraySize; i++)
        {
            SerializedProperty t = tagsProp.GetArrayElementAtIndex(i);
            if (t.stringValue.Equals(tag)) { found = true; break; }
        }
        if (!found)
        {
            tagsProp.InsertArrayElementAtIndex(0);
            SerializedProperty n = tagsProp.GetArrayElementAtIndex(0);
            n.stringValue = tag;
        }
        tagManager.ApplyModifiedProperties();
    }

    static void AddLayer(string layer, SerializedObject tagManager,int index)
    {
        SerializedProperty layersProp = tagManager.FindProperty("layers");

        bool found = false;
        for (int i = 0; i < layersProp.arraySize; i++)
        {
            SerializedProperty t = layersProp.GetArrayElementAtIndex(i);
            if (t.stringValue.Equals(layer)) { found = true; break; }
        }
        if (!found)
        {
            Debug.Log(layersProp.arraySize);
            SerializedProperty sp = layersProp.GetArrayElementAtIndex(index);
            if (sp != null) sp.stringValue = layer;
        }
        tagManager.ApplyModifiedProperties();
    }


}



枚舉的層

public enum GameLayers:long
    {
        Role = 1,
        Item = 2,
        BackGround = 3,
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市嘶炭,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌摇庙,老刑警劉巖旱物,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件遥缕,死亡現(xiàn)場離奇詭異卫袒,居然都是意外死亡,警方通過查閱死者的電腦和手機单匣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進店門夕凝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來宝穗,“玉大人,你說我怎么就攤上這事码秉〈” “怎么了?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵转砖,是天一觀的道長须鼎。 經(jīng)常有香客問我,道長府蔗,這世上最難降的妖魔是什么晋控? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮姓赤,結(jié)果婚禮上赡译,老公的妹妹穿的比我還像新娘。我一直安慰自己不铆,他們只是感情好蝌焚,可當我...
    茶點故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著誓斥,像睡著了一般只洒。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上劳坑,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天红碑,我揣著相機與錄音,去河邊找鬼泡垃。 笑死析珊,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的蔑穴。 我是一名探鬼主播忠寻,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼存和!你這毒婦竟也來了奕剃?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤捐腿,失蹤者是張志新(化名)和其女友劉穎纵朋,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體茄袖,經(jīng)...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡操软,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了宪祥。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片聂薪。...
    茶點故事閱讀 38,809評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡家乘,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出藏澳,到底是詐尸還是另有隱情仁锯,我是刑警寧澤,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布翔悠,位于F島的核電站业崖,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏蓄愁。R本人自食惡果不足惜腻要,卻給世界環(huán)境...
    茶點故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望涝登。 院中可真熱鬧雄家,春花似錦、人聲如沸胀滚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽咽笼。三九已至顷编,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間剑刑,已是汗流浹背媳纬。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留施掏,地道東北人钮惠。 一個月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像七芭,于是被迫代替她去往敵國和親素挽。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,724評論 2 351

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,867評論 25 707
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理狸驳,服務(wù)發(fā)現(xiàn)预明,斷路器,智...
    卡卡羅2017閱讀 134,638評論 18 139
  • 我起床時 看到窗邊有光線在來回擺動 像昨天晚上 喝剩的香檳 床架 也尖叫著醒來 窗外下著絨毛般的細雨 我身體里的每...
    WONKA瓦南閱讀 145評論 0 0
  • 有些男人是用來看的耙箍,比如黃曉明撰糠、王力宏;有些男人則是“來電”服務(wù)的辩昆,比如身穿工裝的水電工阅酪,有強烈的性電流與性吸引力...
    學徒曉成閱讀 634評論 1 5