• 熱門專題

Unity3d開發(十八)監聽編輯器狀態改變 製定自定義回調

作者__银神:  發布日期_-|178众发娱乐:2016-11-24 21:08:05
Tag標簽|35彩票首页:編輯器  狀態  
  • 文章作者|-|作战场景布置:鬆陽

    本文出自 阿修羅道_--234下载彩票软件,禁止用於商業用途_-金俊绵家庭背景,轉載請注明出處_|钢轨标准。

    原文鏈接_-|辽宁都市频道:http://blog.csdn.net/fansongy/article/details/53318791

     

     

     

     

     

     

     

     

     



     


     

    做編輯器插件時_|寻找皇女的踪迹,我總是想要拿到監聽編輯器的狀態變化|运城美食。比如在打開編輯器開始運行自己的服務_亿彩彩票平台可靠吗?。這時就需要用戶打開編輯器的事件__我是忍者第一猜成语。再比如我希望在遊戲退出運行模式之前_-|中华益智养生功,把一些編輯的東西緩存出來-|-触动陷阱,然後對這些數據做自動化處理_|106时时彩手机版,那麼我就需要退出運行模式的事件|--印度电视剧新娘第四部。諸如此類吧|-亿彩彩票。

    另一方麵|||侧方位停车技巧图解,我希望用觀察者模式_2020彩票,並且能自動化注冊_||阳江泡吧。因為我注意到|_七咲风花,導入資源時的AssetImporter回調就是這樣做的___诺基亚大会。用戶隻需要實現一個接口||毒黄瓜事件,就可以收到回調|-132彩票。極大的簡化了擴展流程-_亿客隆彩票注册。編輯器代碼又不必考慮效率問題,借助C#的反射_现任重庆市公安局局长,可以很容易的實現這種功能-青岛31中。

    概述

    整套框架的啟動核心是屬性InitializeOnLoad___008彩票论坛ii。當Unity3d運行或啟動時|-钓鱼岛ppt,會重新加載有腳本-_新密这五个人火了。當使用這個宏時-5iwwe网,編輯器會自動將被標注的類實例化到內存中-|遗言网。因此我們可以利用這個特性-|l乐蜂网,在它的構造函數中拉起我們整個服務|_234彩票网络平台安全吗。 這裏有個小技巧_-众赢彩票安全吗。在啟動Unity編輯器的情況下,如果在構造函數中創建對象___地精炼金术士,會被其他清除函數幹掉_-元素太初。我認為是腳本初始化順序_-|新化南站,或是場景切換引起的--198彩票首页,具體原因得問Unity了_博尔格斯。為了解決這個問題_|苍井空 ed2k,我借助了update函數_-nba2k online花式运球,跳了一幀執行應有的邏輯__|苹果派电影院。

    自動注冊是借助C#的反射---啾啾宝贝,通過GetAssemblies和GetTypes獲取到所有的類_扒糗事地址更新系统,然後創建出對應的實例|-优信彩票快3。

    包裝

    這個類我覺得有個特別適合的名字——NightWatch-_-芭耐得。如果你沒看過冰與火之歌_|重庆ume影城,可能理解這個框架還算有點難度|-旁开口女裤。總的說來||贴膜先撕1还是2,這個框架講述了一個少年加入守夜人隊伍|_大旱之年,並去長城之外戰鬥的故事...

    實現

    接口類如下-||魔泥:

    public interface ICrow
    {
        /// <summary>
        /// Join the Nights Watch 
        /// </summary>
        void Enroll();
    
        /// <summary>
        /// Before to Enter Wild
        /// </summary>
        void PrepareForBattle();
    
        /// <summary>
        /// To the Weirwood outside the wall
        /// </summary>
        void FaceWeirwood();
    
        /// <summary>
        /// Back To the Castle Black
        /// </summary>
        void OpenTheGate();
    
        /// <summary>
        /// Tell Vow to the Old God
        /// </summary>
        void Vow();
    }

    實例類如下-|_阚立文 我愿意:

    using UnityEngine;
    using System.Collections;
    using System.Collections.Generic;
    using UnityEditor;
    
    [InitializeOnLoad]
    public class NightsWatch
    {
        #region Public Attributes
    
        #endregion
    
        #region Private Attributes
        private static List<ICrow> m_crows = new List<ICrow>();
        #endregion
    
        #region Public Methods
    
        static NightsWatch()
        {
            if (!EditorApplication.isPlayingOrWillChangePlaymode)
            {
                EditorApplication.update += WelcomeToCastleBlack;
            }
            else 
            {
                EditorApplication.update += BeyondTheWall;
            }
        }
    
        static void WelcomeToCastleBlack()
        {
            EditorApplication.update -= WelcomeToCastleBlack;
    
            //Debug.Log("Welcome To castle black");
            m_crows.Clear();
            var crows = GetAllImplementTypes<ICrow>(System.AppDomain.CurrentDomain);
            foreach (var eachCrow in crows)
            {
                eachCrow.Enroll();
                m_crows.Add(eachCrow);
            }
    
            EditorApplication.update += WaitForWild;
        }
    
        static void WaitForWild()
        {
            if (EditorApplication.isPlayingOrWillChangePlaymode)
            {
                foreach (var eachCrow in m_crows)
                {
                    eachCrow.PrepareForBattle();
                }
                EditorApplication.update -= WaitForWild;
            }
        }
    
        static void BeyondTheWall()
        {
            EditorApplication.update -= BeyondTheWall;
    
            //Debug.Log("Welcome To The Wild");
            m_crows.Clear();
            var crows = GetAllImplementTypes<ICrow>(System.AppDomain.CurrentDomain);
            foreach (var eachCrow in crows)
            {
                eachCrow.FaceWeirwood();
                m_crows.Add(eachCrow);
            }
    
            EditorApplication.update += WaitForCrowReturn;
        }
        
        static void WaitForCrowReturn()
        {
            if (!EditorApplication.isPlayingOrWillChangePlaymode )
            {
                //Debug.Log("Open the Door");
                EditorApplication.update -= WaitForCrowReturn;
                foreach (var eachCrow in m_crows)
                {
                    eachCrow.OpenTheGate();
                }
                EditorApplication.update += WelcomeToCastleBlack;
            }
        }
    
        public static void CrowsVow()
        {
            foreach (var eachCrow in m_crows)
            {
                eachCrow.Vow();
            }
        }
    
        [MenuItem("Land/CastleBlack")]
        public static void MakeVow()
        {
            NightsWatch.CrowsVow();
        }
        #endregion
    
        #region Override Methods
    
        #endregion
    
        #region Private Methods
        public static T[] GetAllImplementTypes<T>(System.AppDomain aAppDomain) where T : class
        {
            var result = new List<T>();
            var assemblies = aAppDomain.GetAssemblies();
            foreach (var assembly in assemblies)
            {
                var types = assembly.GetTypes();
                foreach (var type in types)
                {
                    if (typeof(T).IsAssignableFrom(type))
                    {
                        if (!type.IsAbstract)
                        {
                            var tar = assembly.CreateInstance(type.FullName) as T;
                            result.Add(tar);
                        }
                    }
                }
            }
            return result.ToArray();
        }
        #endregion
    }
    

    簡單解釋一下-_中大恒基官网,所有的接口都是按照冰與火之歌中的劇情定義__118彩图库和118论坛网址大全。當在編輯狀態下時--|永利网投平台,會創建對應的實例類|_买卖基金就这几招,並調用Enroll函數--365彩票安卓客户端,這相當於Jon剛剛進入CastleBlack_-水族zadull。當點擊Play運行時__香香公主化妆品,會先調用PrepareForBattle_奇迹世界2战士加点,相當於在城堡中準備出征|__陈照升。當遊戲開始運行時--|黑香米产地,會調用FaceToWeirWood|-刘仙蒂,這裏對應的是城外那顆魚梁木-|-金华职业技术学院邮编,一般出征之前都是要去祈禱一下|__天兰尾货市场。然後當遊戲運行結束時-注册公益彩票是真的么,會調用OpenTheGate|--魔域3 0,對應出征回來||_肖志恒简历,在長城下麵喊門-|易盈彩票网上登录。然後有個Vow接口-_诺顿免费激活码,這個是用來點名的--_菲诗曼尔,城堡裏的烏鴉都要列隊答“道”__|陈坤 蒋经国。

    使用

    新建兩個實例|-陕西省交通厅曹森: 一個是JonSnow:

    public class JonSnow :  ICrow
    {
        public void Enroll()
        {
            Debug.Log(this + " join the NightWatch!");
        }
    
        public void PrepareForBattle()
        {
            Debug.Log(this + " follow your lead!");
        }
    
        public void FaceWeirwood()
        {
            Debug.Log("I'm the wolf in the north");
        }
    
        public void OpenTheGate()
        {
            Debug.Log(this + " request enter Castle Black");
        }
    
        public void Vow()
        {
            Debug.Log(this + " For The Watch");
        }
    }

    一個是Samwell:

    public class Samwell :  ICrow
    {
        public void Enroll()
        {
            Debug.Log(this + " I came form Lord Randyll Tarly,and I even his oldest son ...");
        }
    
        public void PrepareForBattle()
        {
            Debug.Log(this + " is not ready yet...");
        }
    
        public void FaceWeirwood()
        {
            Debug.Log("I'm a useless warrior,but may be ... helpful");
        }
    
        public void OpenTheGate()
        {
            Debug.Log(this + " also want enter");
        }
    
        public void Vow()
        {
            Debug.Log(this + " For The ... alive");
        }
    }

    測試

    當寫好代碼編譯完成時__冰河时代2歌词,就能在輸出中看到他倆到長城去報道了|_-打长途加什么便宜。點擊運行程序|_朗姿女装正品代购,關閉運行程序|-|2015年世界gdp排名,會分別有日誌輸出---裙地垫卫生巾,效果如下_木樨园服装市场:


    其中紅線是點擊Play操作_-新乡爱情网,綠線是停止Unity運行的操作__买多网加盟,紅線以上的日誌是打開unity或重新編譯時輸出的-|易彩网平台。一切按照預期實現_||两朝太岁,收工___2628彩票账号注册。

    如果你覺得這篇文章對你有幫助_-2019年69期出什么马,可以順手點個頂__盈彩国际输钱怎么办,不但不會喜當爹___易旺彩票是真的吗,還能讓更多人能看到它...
     

About IT165 - 廣告服務 - 隱私聲明 - 版權申明 - 免責條款 - 網站地圖 - 網友投稿 - 聯係方式
本站內容來自於互聯網,僅供用於網絡技術學習,學習中請遵循相關法律法規
88彩票500万彩票幸运飞艇众发彩票盛兴彩票快乐时时彩

免责声明: 本站资料及图片来源互联网文章,本网不承担任何由内容信息所引起的争议和法律责任。所有作品版权归原创作者所有,与本站立场无关,如用户分享不慎侵犯了您的权益,请联系我们告知,我们将做删除处理!