##《遊戲框架》發佈說明:
++++「遊戲框架」還是「遊戲架構」,立鑽哥哥還是以「遊戲框架」來命名這個主題吧。
++++「遊戲框架」作爲整個遊戲的框架,具有核心的地位,一個遊戲的層次和後期維護性就取決於遊戲框架。
++++《遊戲框架》當然也是一個探索篇,作爲這個分類的第一篇博文,還是先探索一段時間,後期根據需要再推出一個精品博文。
====>立鑽哥哥帶您學遊戲框架。
##《遊戲框架》目錄:
#第一篇:框架入門篇
#第二篇:框架夯實篇
#第三篇:框架實戰篇
#第四篇:框架進階篇
#第五篇:框架高級實戰篇
#第六篇:立鑽哥哥帶您學框架
++第一篇:框架入門篇
++++第一章:框架概述
++++第二章:UI框架
++第一章:框架概述
++++1.1、Unity3D遊戲客戶端基礎框架
++++1.2、立鑽哥哥帶您學遊戲框架
++1.1、Unity3D遊戲客戶端基礎框架
++++一些通用的基礎系統的框架搭建,其中包括:
--UI框架(UGUI+MVC)
--消息管理(Message Manager)
--網絡層框架(Socket + Protobuf)
--表格數據(Protobuf)
--資源管理(Unity5.x的AssetBundle方案)
--熱更框架(tolua)
++1.1.1、UI框架
++++編寫UI框架的意義:
--打開、關閉、層級、頁面跳轉等管理問題集中化,將外部切換等邏輯交給UIManager處理。
--功能邏輯分散化,每個頁面維護自身邏輯,依託於框架便於多人協同開發,不用關心跳轉和顯示關閉細節。
--通用性框架能夠做到簡單的代碼複用和「項目經驗」沉澱。
++++基於Unity3D和UGUI實現的簡單的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網絡框架主要用途是:數據存儲(序列化和反序列化),功能類似xml和json等;製作網絡通信協議等。(Protobuf不僅可以進行excel表格數據的導出,還能直接用於網絡通信協議的定製。)
++++Protobuf是由Google公司發佈的一個開源的項目,是一款方便而又通用的數據傳輸協議。(在Unity中可藉助Protobuf來進行數據存儲和網絡協議兩方面的開發。)
++1.1.4、表格數據
++++在遊戲開發中,有很多數據是不需要通過網絡層從服務器拉取下來的,而是通過表格配置的格式存儲在本地。
++++遊戲中的一個道具,通常服務器只下發該道具的ID(唯一標識)和LV(等級),然後客戶端從本地數據中檢索到該道具的具體屬性值。(通常使用Excel表格來配置數據,可以使用Protobuf、JSON、XML等序列化和反序列化特性對錶格數據轉化。)
++1.1.5、資源管理(AssetBundle)
++++AssetBundle是Unity引擎提供的一種資源壓縮文件,文件擴展名通常爲unity3d或assetbundle。
++++對於資源的管理,其實是爲熱更新提供可能,Unity製作遊戲的資源管理方式就通過AssetBundle工具將資源打成多個ab包,通過網絡下載新的ab包來替換本地舊的包,從而實現熱更的目的。
++++AssetBundle是Unity編輯器在編輯環境創建的一系列的文件,這些文件可以被用在項目的運行環境中。(包括的資源文件有:模型文件(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框架
++++2.1、MVC
++++2.2、UIBase
++++2.3、UIManager
++++2.4、ResourceManager
++++2.5、Defines
++++2.6、Singleton
++++2.7、SingletonException
++++2.8、DDOLSingleton
++++2.9、GameController
++++2.10、CoroutineController
++++2.11、StartGame
++++2.12、TestOne
++++2.13、TestTwo
++++2.14、BaseController
++++2.15、BaseModel
++++2.16、BaseModule
++++2.17、ModuleManager
++++2.18、Message
++++2.19、MessageCenter
++++2.20、MessageType
++++2.21、EventTriggerListener
++++2.22、MethodExtension
++++2.23、TestOneModule
++++2.24、PropertyItem
++++2.25、IDynamicProperty
++++2.26、BaseActor
++++2.27、BaseScene
++++2.28、SceneManager
++++2.29、MailUI
++++2.30、MailRewardUI
++++2.31、MailModule
++++2.32、MailData
++++2.33、立鑽哥哥帶您學UI框架。
++UI框架前言
++++前端開發中實際上大量的編碼工作都在UI編碼上,基本上佔前端編碼的70%左右。一個良好的UI框架決定了前端的開發效率和後期的維護成本。
++UI框架涉及內容
++++1、BaseUI:UI界面的基類,定義了統一的UI功能接口(事件,開關,動畫,聲音)。
++++2、UIManager:管理UI的管理器,管理是否緩存UI對象,是否需要互斥UI對象,管理一些通用UI。
++++3、ResourceManager資源管理器,資源加載統一管理,資源加載方式選擇(同步、異步、本地、AB、ObjPool、....),資源緩存,資源釋放。
++++4、Singleton通用單例類的基類。
++++5、BaseModule邏輯模塊基類,定義模塊的通用功能,處理不同系統的數據邏輯。
++++6、ModuleManager:邏輯模塊管理器,管理遊戲內所有邏輯的註冊註銷等。
++++7、自定義事件系統:不同模塊直接的通信,模塊內界面和數據邏輯分離。
++++8、BaseScene:場景邏輯基類。
++++9、SceneManager: 管理項目所有場景切換,加載等。
++++10、CommonUI:項目中一些通用UI,繼承BaseUI可重用UI。
++++11、NetWork:如何在我們的框架中添加網絡模塊。
++2.1、MVC
++++MVC全名是Model View Controller,是模型(model)-視圖(view)-控制器(controller)的縮寫,一種軟件設計典範,用一種業務邏輯、數據、界面顯示分離的方式組織代碼,將業務邏輯聚集到一個部件裏面,在改進和個性化定製界面及用戶交互的同時,不需要重新編寫業務邏輯。
++++【Model(模型)】:是應用程序中用於處理應用程序數據邏輯的部分。(通常模型對象負責在數據庫中存取數據。)
++++【View(視圖)】:是應用程序中處理數據顯示的部分。(通常視圖是依據模型數據創建的。)
++++【Controller(控制器)】:是應用程序中處理用戶交互的部分。(通常控制器負責從視圖讀取數據,控制用戶輸入,並向模型發送數據。)
++2.1.1、MVC模式設計流程
++++【抽象Model層】=>【爲Model提供一套增刪改查的方法】=>【Controller層,把我們的需求(問題)轉化成增刪改查】=>【將Model層的信息,以一種用戶可以接受的形式表現到View層。】
++2.1.2、PureMVC
++++PureMVC是經典MVC設計框架的一個變種:「純粹的MVC框架」。(是基於MVC模式建立的輕量級應用框架。)
++2.2、BaseUI
++++UIBase是UI的公共基類。(定義了統一的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.1、BaseUI.cs(UI公共基類)
//立鑽哥哥: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.3、UIManager
++++UIManager:UI管理類。(管理是否緩存UI對象,是否需要互斥UI對象,管理一些通用UI等。)
++++Scripts/YanlzFramework/Manager/UIManager.cs
++2.3.1、UIManager.cs(UI管理類)
//立鑽哥哥:UIManager.cs(UI管理類)(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.4、ResManager
++++ResManager:資源管理器,資源加載統一管理。(資源加載方式選擇(同步、異步、本地、AB、ObjPool、....),資源緩存,資源釋放等。)
++++Scripts/YanlzFramework/Manager/ResManager.cs
++2.4.1、ResManager.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(「立鑽哥哥:Error:null Instantiate _retObj.」);
}
}else{
Debug.LogError(「立鑽哥哥:Error:null 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.5、Defines
++++Defines:自定義空間和類。
++++Scripts/YanlzFramework/Defines/Defines.cs
++2.5.1、Defines.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.6、Singleton
++++Singleton:單例基類。
++++Scripts/YanlzFramework/Common/Singleton/Singleton.cs
++2.6.1、Singleton.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.7、SingletonException
++++SingletonException:異常類。
++++Scripts/YanlzFramework/Common/Singleton/SingletonException.cs
++2.7.1、SingletonException.cs
//立鑽哥哥:SingletonException.cs(異常類)(YanlzFramework/.../SingletonException.cs)
using System;
namespace YanlzFramework{
public class SingletonException : Exception{
public SingletonException(string msg) : base(msg){
}
}
}
++2.8、DDOLSingleton
++++DDOLSingleton:繼承MonoBehaviour的單例基類。
++++Scripts/YanlzFramework/Common/Singleton/DDOLSingleton.cs
++2.8.1、DDOLSingleton.cs(繼承MonoBehaviour的單例基類)
//立鑽哥哥:DDOLSingleton.cs(Scripts/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.9、GameController
++++GameController:遊戲控制器。
++++Scripts/YanlzFramework/Manager/GameController.cs
++2.9.1、GameController.cs(遊戲控制器)
//立鑽哥哥:GameController.cs(YanlzFramework/Manager/GameController.cs)
using UnityEngine;
using System.Collections;
public class GameController : DDOLSingleton<GameController>{
}
++2.10、CoroutineController
++++CoroutineController:非繼承MonoBehaviour使用協程管理器。
++++Scripts/YanlzFramework/Manager/CoroutineController.cs
++2.10.1、CoroutineController.cs(協程管理器)
//立鑽哥哥:協程管理器:(YanlzFramework/Manager/CoroutineController.cs)
using UnityEngine;
using System.Collections;
public class CoroutineController : DDOLSingleton<CoroutineController>{
}
++2.11、StartGame
++++StartGame:遊戲開始控制。
++++Scripts/GameLogic/StartGame.cs
++2.11.1、StartGame.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.12、TestOne
++++TestOne:第一個UI測試界面。
++++Scripts/GameLogic/UI/TestOne.cs
++2.12.1、TestOne.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.13、TestTwo
++++TestOne:第一個UI測試界面。
++++Scripts/GameLogic/UI/TestOne.cs
++2.13.1、TestTwo.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.14、BaseController
++++BaseModule:控制器基類。
++++Scripts/YanlzFramework/BaseClass/BaseController.cs
++2.14.1、BaseController.cs(控制器基類)
//立鑽哥哥:控制器基類:(Srcipts/YanlzFramework/BaseClass/BaseController.cs)
using System;
namespace YanlzFramework{
public class BaseController{
public BaseController(){
}
}
}
++2.15、BaseModel
++++BaseModel
//Close(); //立鑽哥哥:UIManager統一處理
}
private void Close(){
Destroy(gameObject);
}
}
++2.14、BaseController
++++BaseModule:控制器基類。
++++Scripts/YanlzFramework/BaseClass/BaseController.cs
++2.14.1、BaseController.cs(控制器基類)
//立鑽哥哥:控制器基類:(Srcipts/YanlzFramework/BaseClass/BaseController.cs)
using System;
namespace YanlzFramework{
public class BaseController{
public BaseController(){
}
}
}
++2.15、BaseModel
++++BaseModel:模型基類。
++++Scripts/YanlzFramework/BaseClass/BaseModel.cs
++2.15.1、BaseModel.cs(模型基類)
//立鑽哥哥:模型基類:(Scripts/YanlzFramework/BaseClass/BaseModel.cs)
using System;
namespace YanlzFramework{
public class BaseModel{
public BaseModel(){
}
}
}
++2.16、BaseModule
++++BaseModule:數據邏輯處理模塊基類。
++++Scripts/YanlzFramework/BaseClass/BaseModule.cs
++2.16.1、BaseModule.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.1、BaseModule.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