遊戲框架(框架入門篇)

《遊戲框架》

##《遊戲框架》發佈說明:

++++「遊戲框架」還是「遊戲架構」,立鑽哥哥還是以「遊戲框架」來命名這個主題吧。

++++「遊戲框架」作爲整個遊戲的框架,具有核心的地位,一個遊戲的層次和後期維護性就取決於遊戲框架。

++++《遊戲框架》當然也是一個探索篇,作爲這個分類的第一篇博文,還是先探索一段時間,後期根據需要再推出一個精品博文。

====>立鑽哥哥帶您學遊戲框架。


##《遊戲框架》目錄:

#第一篇:框架入門篇

#第二篇:框架夯實篇

#第三篇:框架實戰篇

#第四篇:框架進階篇

#第五篇:框架高級實戰篇

#第六篇:立鑽哥哥帶您學框架



#第一篇:框架入門篇

++第一篇:框架入門篇

++++第一章:框架概述

++++第二章:UI框架



++第一章:框架概述

++++1.1Unity3D遊戲客戶端基礎框架

++++1.2、立鑽哥哥帶您學遊戲框架





###1.1Unity3D遊戲客戶端基礎框架

++1.1Unity3D遊戲客戶端基礎框架

++++一些通用的基礎系統的框架搭建,其中包括:

--UI框架(UGUI+MVC

--消息管理(Message Manager

--網絡層框架(Socket + Protobuf

--表格數據(Protobuf

--資源管理(Unity5.xAssetBundle方案)

--熱更框架(tolua


++1.1.1UI框架

++++編寫UI框架的意義:

--打開、關閉、層級、頁面跳轉等管理問題集中化,將外部切換等邏輯交給UIManager處理。

--功能邏輯分散化,每個頁面維護自身邏輯,依託於框架便於多人協同開發,不用關心跳轉和顯示關閉細節。

--通用性框架能夠做到簡單的代碼複用和「項目經驗」沉澱。

++++基於Unity3DUGUI實現的簡單的UI框架,實現內容:

--1、加載、顯示、隱藏、關閉頁面,根據標示獲得相應界面實例;

--2、提供界面顯示隱藏動畫接口;

--3、單獨界面層級,Collider,背景管理;

--4、根據存儲的導航信息完成界面導航;

--5、界面通用對話框管理;

--6、便於進行需求和功能擴展;


++1.1.2、消息管理(Message Manager

++++一個消息系統的核心功能:

--一個通用的事件監聽器;

--管理各個業務監聽的事件類型(註冊和解綁事件監聽器);

--全局廣播事件;

--廣播事件所傳參數數量和數據類型都是可變的(數量可以是0~3,數據類型是泛型)

++++消息管理設計思路:在消息系統初始化時將每個模塊綁定的消息列表,根據消息類型分類(用一個string類型的數據類標識),即建立一個字典Dictionary<string, List<Model>>:每條消息觸發時需要通知的模塊列表:某條消息觸發,遍歷字典中綁定的模塊列表。

++1.1.3、網絡層框架(NetworkManager

++++除了單機遊戲,限制絕大多數的網遊都是以強聯網的方式實現的,選用Socket通信可以實時地更新玩家狀態。

++++選定了聯網方式後,還需要考慮網絡協議定製的問題,Protobuf無疑是個比較好的選擇,一方面是跨平臺特性好,另一方面是數據量小可以節省通信成本。

++++Socket通信:聯網方式、聯網步驟,數據收發以及協議數據格式。(加入線程池管理已經用一個隊列來管理同時發起的請求,讓Socket請求和接收異步執行,基本的思路就是引入多線程和異步等技術。)

++++Protobuf網絡框架主要用途是:數據存儲(序列化和反序列化),功能類似xmljson等;製作網絡通信協議等。(Protobuf不僅可以進行excel表格數據的導出,還能直接用於網絡通信協議的定製。)

++++Protobuf是由Google公司發佈的一個開源的項目,是一款方便而又通用的數據傳輸協議。(在Unity中可藉助Protobuf來進行數據存儲和網絡協議兩方面的開發。)

++1.1.4、表格數據

++++在遊戲開發中,有很多數據是不需要通過網絡層從服務器拉取下來的,而是通過表格配置的格式存儲在本地。

++++遊戲中的一個道具,通常服務器只下發該道具的ID(唯一標識)和LV(等級),然後客戶端從本地數據中檢索到該道具的具體屬性值。(通常使用Excel表格來配置數據,可以使用ProtobufJSONXML等序列化和反序列化特性對錶格數據轉化。)


++1.1.5、資源管理(AssetBundle

++++AssetBundleUnity引擎提供的一種資源壓縮文件,文件擴展名通常爲unity3dassetbundle

++++對於資源的管理,其實是爲熱更新提供可能,Unity製作遊戲的資源管理方式就通過AssetBundle工具將資源打成多個ab包,通過網絡下載新的ab包來替換本地舊的包,從而實現熱更的目的。

++++AssetBundleUnity編輯器在編輯環境創建的一系列的文件,這些文件可以被用在項目的運行環境中。(包括的資源文件有:模型文件(models)、材質(materials)、紋理(textures)和場景(scenes)等。)

++++Editor打包AssetBundle

//立鑽哥哥:Editor打包AssetBundle

[MenuItem(Assets/Build AssetBundles)]

static void BuildAllAssetBundles(){

    BuildPipeline.BuildAssetBundles(Application.dataPath + /AssetBundles, BuildAssetBundleOptions.None, BuildTarget.StandaloneOSXIntel);

}

++1.1.6、熱更新框架(tolua

++++使用C#編寫底層框架,使用lua編寫業務邏輯,這是業內最常見的設計方式,還有一個非常成熟的熱更新框架tolua

++++通常可熱更新的有:圖片資源、UI預製和lua腳本,而處於跨平臺的考慮,C#腳本是不允許進行熱更的。



##第二章:UI框架

++第二章:UI框架

++++2.1MVC

++++2.2UIBase

++++2.3UIManager

++++2.4ResourceManager

++++2.5Defines

++++2.6Singleton

++++2.7SingletonException

++++2.8DDOLSingleton

++++2.9GameController

++++2.10CoroutineController

++++2.11StartGame

++++2.12TestOne

++++2.13TestTwo

++++2.14BaseController

++++2.15BaseModel

++++2.16BaseModule

++++2.17ModuleManager

++++2.18Message

++++2.19MessageCenter

++++2.20MessageType

++++2.21EventTriggerListener

++++2.22MethodExtension

++++2.23TestOneModule

++++2.24PropertyItem

++++2.25IDynamicProperty

++++2.26BaseActor

++++2.27BaseScene

++++2.28SceneManager

++++2.29MailUI

++++2.30MailRewardUI

++++2.31MailModule

++++2.32MailData

++++2.33、立鑽哥哥帶您學UI框架。


++UI框架前言

++++前端開發中實際上大量的編碼工作都在UI編碼上,基本上佔前端編碼的70%左右。一個良好的UI框架決定了前端的開發效率和後期的維護成本。

++UI框架涉及內容

++++1BaseUIUI界面的基類,定義了統一的UI功能接口(事件,開關,動畫,聲音)。

++++2UIManager:管理UI的管理器,管理是否緩存UI對象,是否需要互斥UI對象,管理一些通用UI

++++3ResourceManager資源管理器,資源加載統一管理,資源加載方式選擇(同步、異步、本地、ABObjPool....),資源緩存,資源釋放。

++++4Singleton通用單例類的基類。

++++5BaseModule邏輯模塊基類,定義模塊的通用功能,處理不同系統的數據邏輯。

++++6ModuleManager:邏輯模塊管理器,管理遊戲內所有邏輯的註冊註銷等。

++++7、自定義事件系統:不同模塊直接的通信,模塊內界面和數據邏輯分離。

++++8BaseScene:場景邏輯基類。

++++9SceneManager: 管理項目所有場景切換,加載等。

++++10CommonUI:項目中一些通用UI,繼承BaseUI可重用UI

++++11NetWork:如何在我們的框架中添加網絡模塊。





###2.1MVC

###2.1MVC

++2.1MVC

++++MVC全名是Model View Controller,是模型(model-視圖(view-控制器(controller)的縮寫,一種軟件設計典範,用一種業務邏輯、數據、界面顯示分離的方式組織代碼,將業務邏輯聚集到一個部件裏面,在改進和個性化定製界面及用戶交互的同時,不需要重新編寫業務邏輯。

++++Model(模型)】:是應用程序中用於處理應用程序數據邏輯的部分。(通常模型對象負責在數據庫中存取數據。)

++++View(視圖)】:是應用程序中處理數據顯示的部分。(通常視圖是依據模型數據創建的。)

++++Controller(控制器)】:是應用程序中處理用戶交互的部分。(通常控制器負責從視圖讀取數據,控制用戶輸入,並向模型發送數據。)


++2.1.1MVC模式設計流程

++++【抽象Model層】=>【爲Model提供一套增刪改查的方法】=>Controller層,把我們的需求(問題)轉化成增刪改查】=>【將Model層的信息,以一種用戶可以接受的形式表現到View層。】

++2.1.2PureMVC

++++PureMVC是經典MVC設計框架的一個變種:「純粹的MVC框架」。(是基於MVC模式建立的輕量級應用框架。)




###2.2BaseUI

###2.2BaseUI

++2.2BaseUI

++++UIBaseUI的公共基類。(定義了統一的UI功能接口(事件、開關、動畫、聲音)等。)

++++Scripts/YanlzFramework/BaseClass/BaseUI.cs

++2.2.1、一個簡單UI代碼參考(沒有BaseUI

//立鑽哥哥:一個簡單UI代碼參考:一個Panel上點擊一個按鈕進行Panel切換

using UnityEngine;

using System.Collections;

using UnityEngine.UI;

 

public class TestOne: MonoBehaviour{

    private Button bth;

 

    void Start(){

        btn = transform.Find(Panel/Button).GetComponent<Button>();

        btn.onClick.AddListener(OnClickBtn);

    }

 

    private void OnClickBth(){

        GameObject go = Instantiate<GameObject>(Resource.Load<GameObject>Prefabs/TestTwo);

        TestTwo testTwo= go.GetComponent<TestTwo>();

        if(null == testTwo){

            testTwo= go.AddComponent<TestTwo>();

        }

 

        Close();

    }

 

    private void Close(){

        Destroy(gameObject);

    }

}


++2.2.1BaseUI.csUI公共基類)

//立鑽哥哥:UI的公共基類(Scripts/YanlzFramwork/BaseClass/BaseUI.cs

using UnityEngine;

using System.Collections;

 

namespace YanlzFramework{

    public abstract class BaseUI : MonoBehaviour{

 

        #region Cache gameObject &transform

        private GameObject _cacheGameObject;

        public GameObject CacheGameObject{

            get{

                if(null == _cacheGameObject){

                    _cacheGameObject = this.gameObject;

                }

 

                return _cacheGameObject;

            }

        }

 

        private Transform _cacheTransform;

        public Transform CacheGameObject{

            get{

                if(null == _cacheTransform){

                    _cacheTransform = this.transform;

                }

 

                return _cacheTransform;

            }

        }

        #endregion

 

        #region EnumObjectState & UI Type

        protected EnumObjectState _state = EnumObjectState.None;

        public event StateChangeEvent StateChanged;

 

        public EnumObjectState State{

            protected get{

                return this._state;

            }

 

            set{

                EnumObjectState oldState = this._state;

                this._state = value;

        

                if(null != StateChanged){

                    StateChanged(this, this._state, oldState);  //立鑽哥哥:調用事件

                }

            }

 

            public abstract EnumUIType GetUIType();

 

            #endregion

 

            void Awake(){

                this.State = EnumObjectState.Initial;

                OnAwake();

            }

 

            //Use this for initialization

            void Start(){

                OnStart();

            }

 

            //Update is called once per frame

            void Update(){

                if(this._state == EnumObjectState.Ready){

                    OnUpdate(Time.deltaTime);

                }

            }

 

            public void Release(){

                this.State = EnumObjectState.Closing;

                GameObject.Destroy(this.CacheGameObject);

                OnRelease();

            }

 

            void OnDestroy(){

                this.State = EnumObjectState.None;

            }

 

 

            protected virtual void OnAwake(){

                this.State = EnumObjectState.Loading;

                this.OnPlayOpenUIAudio();    //播放音樂

            }

 

            protected virtual void OnStart(){ }

 

            protected virtual void OnUpdate(float delatTime){ }

 

            protected virtual void OnRelease(){

                this.State = EnumObjectState.None;

                this.OnPlayCloseUIAudio();    //關閉音樂

            }

 

            protected virtual void OnLoadData(){  }

 

            //播放打開界面音樂

            protected virtual void OnPlayOpenUIAudio(){ }

 

            //播放關閉界面音樂

            protected virtual void OnPlayCloseUIAudio(){ }

 

            protected virtual void SetUI(params object[] uiParams){

                this.State = EnumObjectState.Loading;

            }

 

            public virtual void SetUIParam(params object[] uiParams){

            }

 

            protected virtual void OnLoadData(){

            }

 

            public void SetUIWhenOpening(params object[] uiParams){

                SetUI(uiParams);

 

                //StartCoroutine(AsyncOnLoadData());    //立鑽哥哥:異步加載

               CoroutineController.Instance.StartCoroutine(AsyncOnLoadData());

            }

 

            private IEnumerator AsyncOnLoadData(){

                yield return new WaitForSecond(0);

 

                if(this.State == EnumObjectState.Loading){

                    this.OnLoadData();

                    this.State = EnumObjectState.Ready;

                }

            }

        }

    }

}




###2.3UIManager

###2.3UIManager

++2.3UIManager

++++UIManagerUI管理類。(管理是否緩存UI對象,是否需要互斥UI對象,管理一些通用UI等。)

++++Scripts/YanlzFramework/Manager/UIManager.cs

++2.3.1UIManager.csUI管理類)

//立鑽哥哥:UIManager.csUI管理類)(Scripts/YanlzFramework/Manager/UIManager.cs

using System;

 

namespace YanlzFramework{

    public class UIManager : Singleton<UIManager>{

        #region UIInfoData class

        class UIInfoData{

            public EnumUIType UIType{  get;  private set;  }

            public Type ScriptType {  get;  private set;  }

            public string Path{  get;  private set;  }

            public object[] UIParams{  get;  private set;  }

 

            public UIInfoData(EnumUIType _uiType, string _path, params object[] _uiParams){

                this.UIType = _uiType;

                this.Path = _path;

                this.UIParams = _uiParams;

                this.ScriptType = UIPathDefines.GetUIScriptByType(this.UIType);

            }

        }

        #endregion

 

        private Dictionary<EnumUIType, GameObject> dicOpenUIs = null;

 

        private Stack<UIInfoData> stackOpenUIs = null;

 

        public override void Init(){

            dicOpenUIs = new Dictionary<EnumUIType, GameObject>();

            statckOpenUIs = new Stack<UIInfoData>();

        }

 

        //獲取指定UI

        public T GetUI<T>(EnumUIType _uiType) where T : BaseUI{

            GameObject _retObj = GetUIObject(_uiType);

            if(_retObj != null){

                return _retObj.GetComponent<T>();

            }

 

            return null;

        }

 

        public GameObject GetUIObject(EnumUIType _uiType){

            GameObject _retObj = null;

            if(!dicOpenUIs.TryGetValue(_uiType, out _retObj)){

                throw new Exception(立鑽哥哥:_dicOpenUIs TryGetValue Failure! _uiType:  + _uiType.ToString());

            }

 

            return _retObj;

        }

 

        #region Preload UI Prefab By EnumUIType

 

        public void PreloadUI(EnumUIType[] _uiTypes){

            for(int i = 0;  i < _uiTypes.Length;  i++){

                PreloadUI(_uiTypes[i]);

            }

        }

 

        //立鑽哥哥:預先加載UI資源

        public void PreloadUI(EnumUIType _uiType){

            string path = UIPathDefines.GetPrefabPathByType(_uiType);

            Resource.Load(path);

            //ResManager.Instance.ResourcesLoad(path);

        }

 

        #endregion

 

        #region Open UI By EnumUIType

 

        //打開界面

        public void OpenUI(EnumUIType[] _uiTypes){

            OpenUI(false, _uiTypes, null);

        }

 

        public void OpenUI(EnumUIType _uiType, params object[] _uiParams){

            EnumUIType[] _uiTypes = new EnumUIType[1];

            _uiTypes[0] = _uiType;

    

            OpenUI(false, _uiTypes, _uiParams);

        }

 

        public void OpenUICloseOthers(EnumUIType[] _uiTypes){

            OpenUI(true, _uiTypes, null);

        }

 

        public void OpenUICloseOthers(EnumUIType _uiType, params object[] _uiParams){

            EnumUIType[] _uiTypes = new EnumUIType[1];

            _uiTypes[0] = _uiType;

    

            OpenUI(true, _uiTypes, _uiParams);

        }

 

        //打開UI

        public void OpenUI(bool _isCloseOthers, EnumUIType[] _uiTypes, params object[] _uiParams){

            //立鑽哥哥:Close Other UI

            if(_isCloseOthers){

                CloseUIAll();    //立鑽哥哥:關閉其他UI

            }

 

            //push _uiTypes in stack

            for(int i = 0;  i < _uiTypes.Length;  i++){

                EnumUIType _uiType = _uiTypes[i];

                if(dicOpenUIs.ContainsKey(_uiType)){

                    string _path = UIPathDefines.GetPrefabsPathByType(_uiType);

                    stackOpenUIs.Push(new UIInfoData(_uiType, _path, _uiParams));

                }

            }

 

            //Open UI

            if(stackOpenUIs.Count > 0){

                //GameController.Instance.StartCoroutine();    //立鑽哥哥:

                CoroutineController.Instance.StartCoroutine(AsynLoadData());

            }

        }

 

        #endregion

 

        private IEnumerator<int> AsyncLoadData(){

            UIInfoData _uiInfoData = null;

            UnityEngine.Object _prefabObj = null;

            GameObject _uiObject = null;

    

            if(stackOpenUIs != null && stackOpenUIs.Count > 0){

                do{

                    _uiInfoData = stackOpenUIs.Pop();

                    _prefabObj = Resource.Load(_uiInfoData.Path);

            

                    if(_prefabObj != null){

                        _uiObject = MonoBehaviour.Instantiate(_prefabObj) as GameObject;

                        BaseUI _baseUI = _uiObject.GetComponent<BaseUI>();

             

                        if(null == _baseUI){

                            _baseUI = _uiObject.AddComponent(_uiInfoData.ScriptType) as BaseUI;

                        }

                

                        if(null != _baseUI){

                            _baseUI.SetUIWhenOpening(_uiInfoData.UIParams);

                        }

                        dicOpenUIs.Add(_uiInfoData.UIType, _uiObject);

                    }

                }while(stackOpenUIs.Count > 0);

            }

 

            yield return 0;

        }

 

        #region Close UI By EnumUIType

 

        public void CloseUIAll(){

            List<EnumUIType> _keyList = new List<EnumUIType> (dicOpenUIs.Keys);

            foreach(EnumUIType _uiType in _keyList){

                GameObject _uiObj = dicOpenUIs[_uiType];

                CloaseUI(_uiType, _uiObj);

            }

            //CloseUI(_listKey.ToArray());   //立鑽哥哥:利用數組關閉

 

            dicOpenUIs.Clear();

         }

 

        public void CloseUI(EnumUIType[] _uiTypes){

            for(int i=0;  i <_uiTypes.Length; i++){

                CloseUI(_uiTypes[i]);

            }

        }

 

        public void CloseUI(EnumUIType _uiType, GameObject _uiObj){

            //GameObject _uiObj = GetUIObject(_uiType);

 

            if(null == _uiObj){

                dicOpenUIs.Remove(_uiType);

 

            }else{

                BaseUI _baseUI = _uiObj.GetComponent<BaseUI>();

 

               if(null == _baseUI){

                    GameObject.Destroy(_uiObj);

                    dicOpenUIs.Remove(_uiType);

                }else{

                    _baseUI.StateChanged += CloseUIHandle;  //立鑽哥哥:添加委託

                    _baseUI.Release();

                }

            }

        }

 

        private void CloseUIHandle(object sender, EnumObjectState newState, EnumObjectState oldState){

            if(newState == EnumObjectState.Closing){

                   BaseUI _baseUI = sender as BaseUI;

                    dicOpenUIs.Remove(_baseUI.GetUIType());

                    _baseUI.StateChanged -= CloseUIHandle;

            }

        }

 

        #endregion

 

    }

}




###2.4ResManager

###2.4ResManager

++2.4ResManager

++++ResManager:資源管理器,資源加載統一管理。(資源加載方式選擇(同步、異步、本地、ABObjPool....),資源緩存,資源釋放等。)

++++Scripts/YanlzFramework/Manager/ResManager.cs

++2.4.1ResManager.cs(資源管理器)(版本2

//立鑽哥哥:ResMananger.cs(資源管理器)(YanlzFramework/Manager.ResManager.cs

using System;

using UnityEngine;

using System.Collection.Generic;

 

namespace YanlzFramework{

    //立鑽哥哥:資源信息

    public class AssetInfo{

        private UnityEngine.Object _Object;

        public Type AssetType{  get;  set;  }

        public string Path{  get;  set;  }

        public int RefCount{  get;  set;  }

        public bool IsLoaded{

            get{

                return null != _Object;

            }

        }

 

        public UnityEngine.Object AssetObject{

            get{

                if(null == _Object){

                    //_Object = Resources.Load(Path);

                    _ResourcesLoad();

                }

 

                return _Object;

            }

        }

 

        public IEnumerator GetCoroutineObject(Action<UnityEngine.Object> _loaded){

            while(true){

                yield return null;

 

                if(null == _Object){

                    //yield return null;

 

                    //_Object = Resources.Load(Path);

                    _ResourcesLoad();

 

                    yield return null;

                }

 

                if(null != _loaded){

                     _loaded(_Object);

                }

 

                yield break;

            }

        }

 

        private void _ResourcesLoad(){

            try{

                _Object = Resource.Load(Path);

                if(null == _Object){

                    Debug.Log(立鑽哥哥:Resources Load Failure! Path:  + Path);

                }

            }catch(Exception e){

                Debug.Log(e.ToString());

            }

        }

 

        public IEnumerator GetAsyncObject(Action<UnityEngine.Object> _loaded){

            return GetAsyncObject(_loaded, null);

        }

 

        public IEnumerator GetAsyncObject(Action<UnityEngine.Object> _loaded, Action<float> _progress){

            //立鑽哥哥:have Object

            if(null != _Object){

                _loaded(_Object);

                yield break;

            }

 

            //Object null. Not Load Resources

            ResourceRequest _resRequest = Resources.LoadAsync(Path);

            while(_resRequest.progress < 0.9){

                if(null != _progress){

                    _progress(_resRequest.progress);

                }

 

                yield return null;

            }

 

            while(!_resRequest.isDone){

                if(null != _progress){

                    _progress(_resRequest.progress);

                }

 

                yield return null;

            }

 

            ///???

            _Object = _resRequest.asset;

            if(null != _loaded){

                _loaded(_Object);

            }

 

            yield return _resRequest;

        }

    }

 

    //立鑽哥哥:ResManger:資源管理器

    public class ResManager : Singleton<ResManager>{

        private Dictionary<string, GameObject> dicAssetInfo = null;

 

        public override void Init(){

            //Resources.Load();

            //Resources.LoadAsync();

            //Resources.LoadAll();

            //Resources.LoadAssetAtPath();

            dicAssetInfo = new Dictionary<string, AssetInfo>();

            Debug.Log(立鑽哥哥:ResManager : Singleton<ResManager> Init);

        }

 

        #region Load Resource & Instantiate Object

 

        public UnityEngine.Object LoadInstance(string _path){

            UnityEngine.Object _obj = Load(_path);

 

            //MonoBehaviour.Instantiate();

            return Instantiate(_obj);

        }

        #endregion

 

        private UnityEngine.Object Instantiate(UnityEngine.Object _obj){

            return Instantiate(_obj, null);

        }

 

        private UnityEngine.Object Instantiate(UnityEngine.Object _obj, Action<UnityEngine.Object> _loaded){

                UnityEngine.Object _retObj = null;

                if(null != _obj){

                    _retObj = MonoBehaviour.Instantiate(_obj);

                    if(null != _retObj){

                        if(null != _loaded){

                            _loaded(_retObj);

                        }else{

                            Debug.LogError(立鑽哥哥:null _loaded.);

                       }

                       return _retObj;

 

                  }else{

                      Debug.LogError(立鑽哥哥:Errornull Instantiate _retObj.);

                  }

 

              }else{

                 Debug.LogError(立鑽哥哥:Errornull Resources Load return _obj.);

             }

        }

 

        #region Load Resource

 

        public UnityEngine.Object Load(string _path){

            AssetInfo _assetInfo = GetAssetInfo(_path);

            if(null != _assetInfo){

                return _assetInfo.AssetObject;

            }

 

             return null;

        }

        #endregion

 

        #region Load Coroutine Resources

 

        public void LoadCoroutine(string _path, Action<UnityEngine.Object> _loaded){

            AssetInfo _assetInfo = GetAssetInfo(_path, _loaded);

                if(null != _assetInfo){

                    CoroutineController.Instance.StartCoroutine(_assetInfo.GetCoroutineObject(_loaded));

                }

         }

        #endregion

 

        #region Load Async Resources

 

        public void LoadAsync(string _path, Action<UnityEngine.Object> _loaded){

            LoadAsync(_path, _loaded, null);

         }

 

        public void LoadAsync(string _path, Action<UnityEngine.Object> _loaded, Action<float> _progress){

            AssetInfo _assetInfo = GetAssetInfo(_path, _loaded);

            if(null != _assetInfo){

                CoroutineController.Instance.StartCoroutine(_assetInfo.GetAsyncObject(_loaded, _progress));

            }

        }

        #endregion

 

 

        private AssetInfo GetAssetInfo(string _path){

            return GetAssetInfo(_path, null);

        }

 

        private AssetInfo GetAssetInfo(string _path, Action<UnityEngine.Object> _loaded){

            if(string.IsNullOrEmpty(_path)){

                Debug.LogError(立鑽哥哥:Error: null _path name.);

                if(null != _loaded){

                    _loaded(null);

                }

            }

 

            // Load Res ....

           AssetInfo _assetInfo = null;

           if(!dicAssetInfo.TryGetValue(_path, out _assetInfo)){

                _assetInfo = new AssetInfo();

                _assetInfo.Path = _path;

                dicAssetInfo.Add(_path, _assetInfo);

            }

            _assetInfo.RefCount++;

 

            return _assetInfo;

        }

 

    }

}




###2.5Defines

###2.5Defines

++2.5Defines

++++Defines:自定義空間和類。

++++Scripts/YanlzFramework/Defines/Defines.cs

++2.5.1Defines.cs

//立鑽哥哥:自定義空間和類(Scripts/YanlzFramework/Defines/Defines.cs

using System;

 

namespace YanlzFramework{

 

    #region 全局委託Global delegate

    public delegate void StateChangeEvent(Object sender, EnumObjectState newState, EnumObjectSate oldState);

    public delegate void MessageEvent(Message message);

    public delegate void OnTouchEventHandle(GameObject_sender, object _args, params object[] _params);

    public delegate void PropertyChangedHandle(BaseActor actor, int id, object oldValue, object newValue);

 

 

    #endregion

 

    #region 全局枚舉對象 Global enum

    public enum EnumObjectState{

        None,

        Initial,

        Loading,

        Read,

        Disabled,

        Closing

    }

 

    public enum EnumUIType : int{

        None = -1,

        TestOne,

        TestTwo,

    }

 

    public enum EnumTouchEventType{

        OnClick,

        OnDoubleClick,    //立鑽哥哥:雙擊

        OnDown,

        OnUp,

        OnEnter,

        OnExit,

        OnSelect,

        OnUpdateSelect,

        OnDeSelect,

        OnDrag,

        OnDragEnd,

        OnDrop,

        OnScroll,

        OnMove,

    }

 

    public enum EnumPropertyType : int{

        RoleName = 1,   //立鑽哥哥:角色名

        Sex,    //性別

        RoleID,    //Role ID

        Gold,    //寶石(元寶)

        Coin,    //金幣(銅板)

        Level,    //等級

        Exp,    //當前經驗

 

        AttackSpeed,    //攻擊速度

        HP,    //當前HP

        HPMax,    //生命最大值

        Attack,    //普通攻擊(點數)

        Water,    //水系攻擊(點數)

        Fire,    //火系攻擊(點數)

    }

 

    public enum EnumActorType{

        None = 0,

        Role,

        Monster,

       NPC,

    }

 

    public enum EnumSceneType{

        None = 0,

        StartGame,

        LoadingScene,

        LoginScene,

        MainScene,

        CopyScene,

        PVPScene,

        PVEScene,

    }

 

    #endregion

 

    public class UIPathDefines{

        public const string UI_PREFAB = Prefabs/;    //UI預設

        public const string UI_CONTROLS_PREFAB = UIPrefab/Control/;   //UI小控件預設

        public const string UI_SUBUI_PREFAB = UIPrefab/SubUI/;  //UI子頁面預設

        public const string UI_IOCN_PATH = UI/Icon/;    //icon路徑

 

        public static string GetPrefabsPathByType(EnumUIType _uiType){

            string _path = string.Empty;

            switch(_uiType){

                case EnumUIType.TestOne:{

                    _path = UI_PREFAB + TestUIOne;

                    break;

                }

 

                case EnumUIType.TestTwo:{

                    _path = UI_PREFAB + TestUITwo;

                    break;

                }

 

                default:{

                    Debug.Log(立鑽哥哥:Not Find EnumUIType! Type:  + uiType.ToString());

                    break;

                }

 

                return _path;

            }

        }

 

        public static System.Type GetUIScriptByType(EnumUIType _uiType){

            System.Type _scriptType = null;

            switch(_uiType){

                case EnumUIType.TestOne:{

                    _scriptType = typeof(TestOne);

                    break;

                }

 

                case EnumUIType.TestTwo:{

                     _scriptType = typeof(TestTwo);

                    break;

                }

 

               default:{

                    Debug.Log(立鑽哥哥:Not Find EnumUIType! Type:  + _uiType.ToString());

                    break;

                }

            }

 

            return _scriptType;

        }

 

    }

 

 

    public class Defines{

        public Defines(){

        }

    }

}




###2.6Singleton

###2.6Singleton

++2.6Singleton

++++Singleton:單例基類。

++++Scripts/YanlzFramework/Common/Singleton/Singleton.cs

++2.6.1Singleton.cs(單例基類)

//立鑽哥哥:Singleton.cs(單例基類)(YanlzFramework/Common/Singleton/Singleton.cs

using System;

 

namespace YanlzFramework{

    public abstract class Singleton<T> where T : class, new() {

        public Singleton(){

            protected static T _Instance = null;

            public static T Instance{

                get{

                    if(null == _Instance){

                        _Instance = new T();

                    }

 

                    return _Instance;

                }

            }

        }

 

        protected Singleton(){

            if(null != _Instance){

                throw new SingletonException(立鑽哥哥:This  + (typeof(T)).ToString() +  Singleton Instance is not null !!!);

            }

 

            Init();

        }

 

        public virtual void Init(){

        }

    }

}




###2.7SingletonException

###2.7SingletonException

++2.7SingletonException

++++SingletonException:異常類。

++++Scripts/YanlzFramework/Common/Singleton/SingletonException.cs

++2.7.1SingletonException.cs

//立鑽哥哥:SingletonException.cs(異常類)(YanlzFramework/.../SingletonException.cs

using System;

 

namespace YanlzFramework{

    public class SingletonException : Exception{

        public SingletonException(string msg) : base(msg){

        }

    }

}




###2.8DDOLSingleton

###2.8DDOLSingleton

++2.8DDOLSingleton

++++DDOLSingleton:繼承MonoBehaviour的單例基類。

++++Scripts/YanlzFramework/Common/Singleton/DDOLSingleton.cs

++2.8.1DDOLSingleton.cs(繼承MonoBehaviour的單例基類)

//立鑽哥哥:DDOLSingleton.csScripts/YanlzFramework/.../DDOLSingleton.cs

using UnityEngine;

using System.Collections;

 

public class DDOLSingleton<T> : MonoBehaviour where T : DDOLSingleton<T>{

    protected static T _Instance = null;

 

    public static T Instance{

        get{

            if(null == _Instance){

                GameObject go = GameObject.Find(DDOLGameObject);

                if(null == go){

                    go = new GameObject(DDOLGameObject);  

                    DontDestroyOnLoad(go);  //立鑽哥哥:創建對象,過場不銷燬

                }

 

               _Instance = go.AddComponent<T>();

            }

 

            return _Instance;

        }

    }

 

    //Raises the application quit event.

    private void OnApplicationQuit(){

        _Instance = null;

    }

}




###2.9GameController

###2.9GameController

++2.9GameController

++++GameController:遊戲控制器。

++++Scripts/YanlzFramework/Manager/GameController.cs

++2.9.1GameController.cs(遊戲控制器)

//立鑽哥哥:GameController.csYanlzFramework/Manager/GameController.cs

using UnityEngine;

using System.Collections;

 

public class GameController : DDOLSingleton<GameController>{

}




###2.10CoroutineController

###2.10CoroutineController

++2.10CoroutineController

++++CoroutineController:非繼承MonoBehaviour使用協程管理器。

++++Scripts/YanlzFramework/Manager/CoroutineController.cs

++2.10.1CoroutineController.cs(協程管理器)

//立鑽哥哥:協程管理器:(YanlzFramework/Manager/CoroutineController.cs

using UnityEngine;

using System.Collections;

 

public class CoroutineController : DDOLSingleton<CoroutineController>{

}




###2.11StartGame

###2.11StartGame

++2.11StartGame

++++StartGame:遊戲開始控制。

++++Scripts/GameLogic/StartGame.cs

++2.11.1StartGame.cs(開始遊戲)

//立鑽哥哥:開始遊戲:(Scripts/GameLogic/StartGame.cs

using UnityEngine;

using System.Collections;

using System.Collections.Generic;

using YanlzFramework;   //立鑽哥哥:自己的框架命名空間

 

//public class StartGame : MonoBehaviour{

public class GameController : DDOLSingleton<StartGame>{

    //Use this for initialization

    void Start(){

        //RegisterAllMoudles();    //立鑽哥哥:模擬GameController:註冊模塊

        ModuleManager.Instance.RegisterAllModules();    //立鑽哥哥:

 

        SceneManager.Instance.RegisterAllScene();    //立鑽哥哥:註冊場景

 

        //GameObject go = Instantiate(Resource.Load<GameObject>(Prefabs/TestUIOne));

        UIManager.Instance.OpenUI(EnumUIType.TestOne);    //立鑽哥哥

     

        TestResManager();    //立鑽哥哥:測試ResManager功能

 

        StartCoroutine(AutoUpdateGold());    //立鑽哥哥:測試金幣更新

        StartCoroutine(NetAutoUpdateGold());    //立鑽哥哥:模擬網絡金幣更新

    }

 

    void TestResManager(){

        float time = System.Enviroment.TickCount;

        for(int i = 1;  i < 1000;  i++){

            GameObject go = null;

            go = Instantiate(Resoureces.Load<GameObject>(Prefabs/Cube));  //1

            go = ResManager.Instance.LoadInstance(Prefabs/Cube) as GameObject; //2

 

            //3、異步加載

            ResManager.Instance.LoadAsyncInstance(Prefabs/Cube, (_obj)=>{

                go = _obj as GameObject;

               go.transform.position = UnityEngine.Random.insideUnitSphere * 20;

           });

 

            //4、協程加載

           ResManager.Instance.LoadCoroutineInstance(Prefabs/Cube, (_obj)=>{

                go = _obj as GameObject;

                go.transform.position = UnityEngine.Random.insideUnitSphere * 20;

            });

 

            //go.transform.position = UnityEngine.Random.insideUnitCircle * 20;

           go.transform.position = UnityEngine.Random.insideUnitSphere * 20;

       }

 

       Debug.Log(立鑽哥哥:Times:  + (System.Environment.TickCout - time) * 1000);

    }

 

    private IEnumerator<int> AsyncLoadData(){

    }

 

    private IEnumerator AutoUpdateGold(){

        int gold = 0;

        while(true){

            gold++;

            yield return new WaitForSeconds(1.0f);

 

            Message message = new Message(AutoUpdateGold, this);

            message [gold] = gold;

            message .Send();

        }

    }

 

    private IEnumerator NetAutoUpdateGold(){

        int gold = 0;

        while(true){

            gold++;

            yield return new WaitForSeconds(1.0f);

 

            Message message = new Message(MessageType.Net_MessageTestOne, this);

            message [gold] = gold;

 

            //message .Send();

            //MessageCenter.Instance.SendMessage(NetMessageType.Net_MessageTestOne, this, null, gold);

            MessageCenter.Instance.SendMessage(message);    //立鑽哥哥:

        }

    }

 

    //立鑽哥哥:模擬GameController中的功能:註冊模塊

    private void RegisterAllModules(){

        //TestOneModule testOneModule = new TestOneModule();

        //testOneModule.Load();

        LoadModule(typeof(TestOneModule));

    }

 

    private void LoadModule(Type moduleType){

        BassModule bm = System.Activator.CreateInstance(moduleType) as BaseModule;

        bm.Load();

    }

 

}




###2.12TestOne

###2.12TestOne

++2.12TestOne

++++TestOne:第一個UI測試界面。

++++Scripts/GameLogic/UI/TestOne.cs

++2.12.1TestOne.cs(第一個UI測試界面)

//立鑽哥哥:第一個UI測試界面:(Scripts/GameLogic/UI/TestOne.cs

using UnityEngine;

using System.Collections;

using System.Collections.Generic;

using YanlzFramework;    //立鑽哥哥:自己的框架命名空間

 

public class TestOne : BaseUI{

    private Button btn;

    private Text text;    //立鑽哥哥:分數更新測試

 

    private TestOneModule oneModule;

 

    #region implemented abstract members of BaseUI

    public override EnumUIType GetUIType(){

        return EnumUIType.TestOne;

    }

    #endregion

 

    //Use this for initialization

    void Start(){

        //btn = transform.Find(Panel/Button).GetComponent<Button>();

        //btn.onClick.AddListener(OnClickBtn);

 

        text = transform.Find(Panel/Text).GetComponent<Text>();    //分數更新測試

    //EventTriggerListener.Get(transform.Find(Panel/Button).gameObject).SetEventHandle(EnumTouchEventType.OnClick, Close);

        EventTriggerListener listener = EventTriggerListener.Get(transform.Find(Panel/Button).gameObject);

        //listener.SetEventHandle(EnumTouchEventType.OnClick, Close);

        listener.SetEventHandle(EnumTouchEventType.OnClick, Close, 1, 1234);

 

        oneModule = ModuleManager.Instance.Get<TestOneModule>();

        text.text = Gold:  + oneModule.Gold;

    }

 

    public override OnAwake(){

        MessageCenter.Instance.AddListener(AutoUpdateGold, UpdateGold);

        base.OnAwake();

    }

 

    protected override void OnRelease(){

        MessageCenter.Instance.RemoveListener(AutoUpdateGold, UpdateGold);

        base.OnRelease();

    }

 

    private void UpdateGold(Message message){

        int gold = (int)message[gold];

        Debug.Log(立鑽哥哥:TestOne UpdateGold:  + gold);

 

        text.text = Gold:  + gold;    //立鑽哥哥:分數更新測試

    }

 

    private void OnClickBtn(){

        //GameObject go = Instantiate(Resources.Load<GameObject>(Prefabs/TestUITwo));

        UIManager.Instance.OpenUICloseOthers(EnumUIType.TestTwo);

 

        //Close();    //立鑽哥哥:UIManager統一處理

    }

 

    private void Close(){

        Destroy(gameObject);

    }

 

    private void Close(GameObject _sender, objcet _args, params object[] _params){

        int i = (int) _params[0];

        string s = (string) _params[1];

        Debug.Log(i);

        Debug.Log(s);

    

        UIManager.Instance.OpenUICloseOthers(EnumUIType.TestTwo);

    }

}




###2.13TestTwo

###2.13TestTwo

++2.13TestTwo

++++TestOne:第一個UI測試界面。

++++Scripts/GameLogic/UI/TestOne.cs

++2.13.1TestTwo.cs(第二個UI測試界面)

//立鑽哥哥:第一個UI測試界面:(Scripts/GameLogic/UI/TestTwo.cs

using UnityEngine;

using System.Collections;

using System.Collections.Generic;

using YanlzFramework;    //立鑽哥哥:自己的框架命名空間

 

public class TestOne : BaseUI{

    private Button btn;

 

    #region implemented abstract members of BaseUI

    public override EnumUIType GetUIType(){

        return EnumUIType.TestTwo;

    }

    #endregion

 

    //Use this for initialization

    void Start(){

        btn = transform.Find(Panel/Button).GetComponent<Button>();

        btn.onClick.AddListener(OnClickBtn);

    }

 

    protected override void OnWake(){

        Message.Instance.AddListener(AutoUpdateGold, UpdateGold);

        base.OnAwake();

    }

 

    protected override void OnRelease(){

        MessageCenter.Instance.RemoveListener(AutoUpdateGold, UpdateGold);

        base.OnRelease();

    }

 

    private void UpdateGold(Message message){

        int gold = (int)message[gold];

        Debug.Log(立鑽哥哥:TestTwo UpdateGold:  + gold);

    }

 

    private void OnClickBtn(){

        //GameObject go = Instantiate(Resources.Load<GameObject>(Prefabs/TestUIOne));

        UIManager.Instance.OpenUICloseOthers(EnumUIType.TestOne);

 

        //Close();    //立鑽哥哥:UIManager統一處理

    }

 

    private void Close(){

        Destroy(gameObject);

    }

}





###2.14BaseController

###2.14BaseController

++2.14BaseController

++++BaseModule:控制器基類。

++++Scripts/YanlzFramework/BaseClass/BaseController.cs

++2.14.1BaseController.cs(控制器基類)

//立鑽哥哥:控制器基類:(Srcipts/YanlzFramework/BaseClass/BaseController.cs

using System;

 

namespace YanlzFramework{

    public class BaseController{

        public BaseController(){

        }

    }

}




###2.15BaseModel

###2.15BaseModel

++2.15BaseModel

++++BaseModel

 

        //Close();    //立鑽哥哥:UIManager統一處理

    }

 

    private void Close(){

        Destroy(gameObject);

    }

}





###2.14BaseController

###2.14BaseController

++2.14BaseController

++++BaseModule:控制器基類。

++++Scripts/YanlzFramework/BaseClass/BaseController.cs

++2.14.1BaseController.cs(控制器基類)

//立鑽哥哥:控制器基類:(Srcipts/YanlzFramework/BaseClass/BaseController.cs

using System;

 

namespace YanlzFramework{

    public class BaseController{

        public BaseController(){

        }

    }

}




###2.15BaseModel

###2.15BaseModel

++2.15BaseModel

++++BaseModel:模型基類。

++++Scripts/YanlzFramework/BaseClass/BaseModel.cs

++2.15.1BaseModel.cs(模型基類)

//立鑽哥哥:模型基類:(Scripts/YanlzFramework/BaseClass/BaseModel.cs

using System;

 

namespace YanlzFramework{

    public class BaseModel{

        public BaseModel(){

        }

    }

}




###2.16BaseModule

###2.16BaseModule

++2.16BaseModule

++++BaseModule:數據邏輯處理模塊基類。

++++Scripts/YanlzFramework/BaseClass/BaseModule.cs

++2.16.1BaseModule.cs

//立鑽哥哥:數據邏輯處理模塊基類:(YanlzFramework/BaseClass/BaseModule.cs

using System;

 

namespace YanlzFramework{

    public class BaseModule{

        public enum EnumRegisterMode{

            NotRegister,

            AutoRegister,

            AlreadyRegister,

        }

 

        private EnumObjectState state BaseModule

++++BaseModule:數據邏輯處理模塊基類。

++++Scripts/YanlzFramework/BaseClass/BaseModule.cs

++2.16.1BaseModule.cs

//立鑽哥哥:數據邏輯處理模塊基類:(YanlzFramework/BaseClass/BaseModule.cs

using System;

 

namespace YanlzFramework{

    public class BaseModule{

        public enum EnumRegisterMode{

            NotRegister,

            AutoRegister,

            AlreadyRegister,

        }

 

        private EnumObjectState state = EnumObjectState.Initial;

        public EnumObjectState State{

            get{

                return state;

            }

 

            set{

                if(state == value){

                    return;

                }

 

               EnumObjectState oldState = state;

               state = value;

 

               if(null != StateChanged){

                   StateChanged(this, state, oldState);

               }

 

              OnStateChanged(state, oldState);

           }

        }

 

        public event StateChangedEvent StateChanged;

 

        protected virtual void OnStateChanged(EnumObjectState newState, EnumObjectState oldState){

namespace YanlzFramework{

    public class BaseModule{

        public enum EnumRegisterMode{

            NotRegister

相關文章
相關標籤/搜索