亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

游戲UI框架設計(五): 配置管理與應用

發布時間:2020-07-17 05:01:43 來源:網絡 閱讀:1848 作者:Liu_guozhu 欄目:開發技術

游戲UI框架設計(五)

--配置管理與應用



   在開發企業級游戲/VR/AR產品時候,我們總是希望可以總結出一些通用的技術體系,框架結構等,為簡化我們的開發起到“四兩撥千金”的作用。所謂“配置管理”是指一個游戲項目(軟件項目),很多需要經常變化的需求或者數據,最好以配置文件的形式存在,從而代替“硬編碼”方式。


   這里筆者就對游戲產品中大量應用到動態加載的情形,開發出一套通用的配置管理(腳本)工具。該工具可以很方便的對于具備“鍵值對”特性的配置文件做統一的數據提取處理,特別適合如下應用情形等:


1:“UI預設”/“游戲對象預設”的動態加載。

2:企業級Log 日志系統中關于配置信息(日志的保存路徑、日志級別信息)的動態加載。

3:資源(語言)國際化系統中關于語言信息的動態加載。


下圖給出本UI框架用到的"語言國際化"對應的Json 配置文件:


游戲UI框架設計(五): 配置管理與應用


   (“語言國際化”中文信息的Json配置文件)



目前(2017)國際國內普遍采用的配置管理方式主要有兩種: XML與Json 方式。

  兩者各有優缺點:

  XML: 對于數據的精確表示、易讀性很高。

       微軟很多的項目都內置對XML作為配置文件的支持。

      (例如: 網站項目:ASP.Net、 WinForm 等)

       缺點是讀寫速度慢,這個問題在移動端尤其突出。


  Json: 讀寫速度快,但是易讀性沒有XML好,但是可以接受。

       所以本框架項目都采用Json作為配置文件。



考慮到目前移動端游戲/VR/AR產品的大量應用,所以筆者在此重點介紹基于Json配置文件的數據解析與配置管理。(Json比傳統的XML作為配置文件使用,具備解析速度快,文件尺寸小等突出優點)


什么是Json 

JSON(JavaScript Object Notation) 是一種輕量級的數據交換格式。 JSON采用完全獨立于語言的文本格式,但是也使用了類似于C語言家族的習慣(包括C、C++、C#、Java、JavaScript、Perl、Python等)。這些特性使JSON成為理想的數據交換語言。 易于人閱讀和編寫,同時也易于機器解析和生成(一般用于提升網絡傳輸速率)。



JSON 語法 (JSON 語法是 JavaScript 對象表示語法的子集)

特點:

    數據在鍵值對中,數據由逗號分隔。

    花括號保存對象,方括號保存數組。

JSON 數據的書寫格式是:名稱/值對  "firstName":"John"

   具體示例:


游戲UI框架設計(五): 配置管理與應用



Json的解析方式: 


目前(2017)國際國內對于Json 的解析主要有以下幾種方式

  • .NET自帶的運行時序列化和反序列化json工具。

   命名空間 System.Runtime.Serialization.Json

   缺點是需要編寫大量代碼,自己來封裝一些實用方法,不推薦。

  • 插件解析:

  目前國內用的最多的Json解析插件: litejson

由于Unity公司也看到了Unity項目中對于大量Json 文件解析操作的需求,所以在Unity5.3以上版本開始原生提供Json的解析API,如下圖:


游戲UI框架設計(五): 配置管理與應用



對于Json 的初學者,為了更好的理解后面的配置管理技術講解,特提供使用Unity的API 對Json 配置文件的解析示例:


Json基本解析示例

  • 示例1:  


  對于Unity 原生支持Json 解析方法的最簡測試演示。

namespace Test
{
    [Serializable]
public class Hero
    {
        //名稱
        public string Name;
        //等級
        public Level MyLevel;

    }
}

namespace Test
{
    [Serializable]
public class Level
{
    public int HeroLevel;

}
}


/***
 * 
 *    Title: "SUIFW" UI框架項目
 *           主題: 演示Unity 對Json 解析API    
 
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

namespace Test
{
public class TestUnityJson : MonoBehaviour {


void Start () {
Hero heroObj=new Hero();
   heroObj.Name = "郭靖";
   heroObj.MyLevel = new Level() {HeroLevel = 800};
            //相當于如下寫法
            //Level lev=new Level();
            //lev.HeroLevel = 800;
            //heroObj.MyLevel = lev;

   //方法1: Json 序列化工作(對象--> 文件)
   string strHeroInfo = JsonUtility.ToJson(heroObj);
            Debug.Log("測試1: 得到的序列化后的字符串="+strHeroInfo);

   //方法2: 反序列化(Json文件--> 對象)
   Hero heroInfo2 = JsonUtility.FromJson<Hero>(strHeroInfo);
            Debug.Log("測試2:得到反序列化對象數值,名稱:  "+heroInfo2.Name+" 等級:  "+heroInfo2.MyLevel.HeroLevel);

   //方法3: 測試覆蓋反序列化。
            Hero hero=new Hero();
   hero.Name = "楊過";
   hero.MyLevel = new Level() {HeroLevel = 500};
            
            //Json 序列化
   string heroInfo3 = JsonUtility.ToJson(hero);
            //測試覆蓋反序列化
            JsonUtility.FromJsonOverwrite(heroInfo3, heroObj);
            Debug.Log("測試3, 得到再次反序列化覆蓋的對象信息,名稱:  "+heroObj.Name+"  等級: "+heroObj.MyLevel.HeroLevel);


}
}
}



  • 示例2:

      對于Json 文件的實戰性測試用例演示。

/***
 * 
 *    Title: "SUIFW" UI框架項目
 *           主題: 對于Unity中Resource 目錄下的Json 文件的解析Demo
 *    Description: 
 *           功能: yyy
 *                  
 *    Date: 2017
 *    Version: 0.1版本
 *    Modify Recoder: 
 *    
 *   
 */
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

namespace Test
{
public class TestUnityJson2 : MonoBehaviour {


void Start ()
{
             //提取文件,得到字符串數據
    TextAsset TaObj=Resources.Load<TextAsset>("People");
             //反序列化  文件-->對象 
             PersonInfo perInfo=JsonUtility.FromJson<PersonInfo>(TaObj.text);
             //顯示對象中數據
             foreach (People per in perInfo.People)
    {
       Debug.Log(" ");
                Debug.Log(string.Format("name={0},Age={1}",per.Name,per.Age));
    }
}
}
}



以上代碼解釋如下:


Unity(5.3以上版本)提供的JsonUtility 提供了三個重要方法


JsonUtility.ToJson() //表示進行序列化操作,把對象序列化為字符串。

JsonUtility.FromJson() ;//表示進行反序列化操作,把Json字符串反序列化為對象。

JsonUtility.FromJsonOverwrite();//是覆蓋方式進行反序列化。



有了以上技術儲備,我們就可以進行開發“通用配置管理器”了。


第1步: 首先定義通用配置管理器接口與輔助類。


代碼如下:

/***
 * 
 *    Title: "SUIFW" UI框架項目
 *           主題: 通用配置管理器接口   
 *    Description: 
 *           功能: 
 *                基于“鍵值對”配置文件的通用解析
 *                  
 *    Date: 2017
 *    Version: 0.1版本
 *    Modify Recoder: 
 *    
 *   
 */

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

namespace SUIFW
{
public interface IConfigManager  {

        /// <summary>
        /// 只讀屬性: 應用設置
        /// 功能: 得到鍵值對集合數據
        /// </summary>
   Dictionary<string, string> AppSetting { get; }

        /// <summary>
        /// 得到配置文件(AppSeting)最大的數量
        /// </summary>
        /// <returns></returns>
   int GetAppSettingMaxNumber();

}

    [Serializable]
    internal class KeyValuesInfo
    {
        //配置信息
        public List<KeyValuesNode> ConfigInfo = null;
    }

    [Serializable]
    internal class KeyValuesNode
    {
        //鍵
        public string Key = null;
        //值
        public string Value = null;
    }
}



第2步: 定義Json 解析異常類。


Json 的解析過程如果出錯,推薦使用我們自己定義的異常處理,為了更好的發現程序錯誤,所以自定義Json 解析異常類定義如下:


/***
 * 
 *    Title: "SUIFW" UI框架項目
 *           主題: Json 解析異常
 *    Description: 
 *           功能:專門負責對于JSon 由于路徑錯誤,或者Json 格式錯誤造成的異常,進行捕獲。
 *                  
 *    Date: 2017
 *    Version: 0.1版本
 *    Modify Recoder: 
 *    
 *   
 */

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

namespace SUIFW
{
public class JsonAnlysisException : Exception {
   public JsonAnlysisException() : base(){}
   public JsonAnlysisException(string exceptionMessage) : base(exceptionMessage){}
}
}


第3步:定義“配置管理器”類


開發實現IConfigManager 接口的通用配置管理器


/***
 * 
 *    Title: "SUIFW" UI框架項目
 *           主題:基于Json 配置文件的“配置管理器”  
 *    Description: 
 *           功能:
 *                  
 *    Date: 2017
 *    Version: 0.1版本
 *    Modify Recoder: 
 *    
 *   
 */

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

namespace SUIFW
{
public class ConfigManagerByJson : IConfigManager
{
        //保存(鍵值對)應用設置集合
   private static Dictionary<string, string> _AppSetting;

        /// <summary>
        /// 只讀屬性: 得到應用設置(鍵值對集合)
        /// </summary>
   public Dictionary<string, string> AppSetting
   {
       get { return _AppSetting; }
   }

        /// <summary>
        /// 構造函數
        /// </summary>
        /// <param name="jsonPath">Json配置文件路徑</param>
   public ConfigManagerByJson(string jsonPath)
   {
       _AppSetting=new Dictionary<string, string>();
            //初始化解析Json 數據,加載到(_AppSetting)集合。
            InitAndAnalysisJson(jsonPath);
   }

        /// <summary>
        /// 得到AppSetting 的最大數值
        /// </summary>
        /// <returns></returns>
   public int GetAppSettingMaxNumber()
   {
            if (_AppSetting!=null && _AppSetting.Count>=1)
            {
                return _AppSetting.Count;
            }
            else
            {
                return 0;
            }
   }

        /// <summary>
        /// 初始化解析Json 數據,加載到集合眾。
        /// </summary>
        /// <param name="jsonPath"></param>
   private void InitAndAnalysisJson(string jsonPath)
        {
            TextAsset configInfo = null;
            KeyValuesInfo keyvalueInfoObj = null;

            //參數檢查
            if (string.IsNullOrEmpty(jsonPath)) return;
            //解析Json 配置文件
            try{
                configInfo = Resources.Load<TextAsset>(jsonPath);
                keyvalueInfoObj=JsonUtility.FromJson<KeyValuesInfo>(configInfo.text);
            }
            catch{
                throw new JsonAnlysisException(GetType() + "/InitAndAnalysisJson()/Json Analysis Exception ! Parameter jsonPath=" + jsonPath);
            }
            //數據加載到AppSetting 集合中
            foreach (KeyValuesNode nodeInfo in keyvalueInfoObj.ConfigInfo)
            {
                _AppSetting.Add(nodeInfo.Key,nodeInfo.Value);
            }
        }



}
}


代碼說明:

   以上定義的“配置管理器”,可以對所有具備“鍵值對”特性的Json 配置文件,做統一數據提取工作,從而對于“UI預設”、“游戲對象”、“日志配置文件”、“語言國際化”等信息,可以做統一處理,極大提供開發效率。以下筆者提供本UI框架需要用到的除企業日志系統外,其他兩種配置文件的截圖,供參考。


游戲UI框架設計(五): 配置管理與應用


  (企業級Log日志中使用到的配置信息)


游戲UI框架設計(五): 配置管理與應用


  (“UI預設” 路徑信息Json配置文件)

 

本篇就先寫到這,下篇 "游戲UI框架設計(6)_消息傳遞中心" 繼續。



向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

阿克苏市| 梁平县| 四平市| 东乌珠穆沁旗| 墨竹工卡县| 武陟县| 时尚| 宝鸡市| 沧州市| 丰镇市| 朝阳市| 桐乡市| 南丰县| 泗阳县| 沈阳市| 平山县| 永平县| 双牌县| 阿拉善右旗| 吐鲁番市| 武夷山市| 西宁市| 卫辉市| 基隆市| 郯城县| 共和县| 深泽县| 即墨市| 留坝县| 丰镇市| 青阳县| 仙游县| 蓬溪县| 苍溪县| 九寨沟县| 维西| 榆社县| 宝兴县| 黔江区| 南丹县| 肇州县|