❤️UNITY实战进阶-框架简介-2

  • Game Farmework 框架基础

       框架很牛, 谁用谁知道, 是中小型游戏公司的福利, 不多说,直接介绍一波

        总览:

组件功能 名称 对应脚本
游戏入口 Game Framework GameEntry
基础组件 Builtin BaseComponent
全局配置 Config ConfigComponent
数据节点 Data Node DataNodeComponent
数据表 Data Table DataTableComponent
调试器 Debugger DebuggerComponent
下载 Download DownloadComponent
实体 Entity EntityComponent
事件 Event EventComponent
有限状态机 FSM FsmComponent
本地化 Localization LocalizationComponent
网络 Network NetworkComponent
对象池 Object Pool ObjectPoolComponent
流程 Procedure ProcedureComponent
引用池 Reference Pool ReferencePoolComponent
资源管理 Resource ResourceComponent
场景管理 Scene SceneComponent
游戏配置 Setting SettingComponent
界面管理 UI UIComponent
声音 Sound SoundComponent
web请求 Web Request WebRequestComponent
内置数据 Builtin Data BuiltinDataComponent
文件系统(新版本增加)

FileSystem

        乍一眼看上去很懵, 那么多组件咋用啊, 别着急, 先把该设置的设置下,再去运行

(1)配置Builtin
 

Editor Resource Mode:
勾选直接使用编辑器下面的资源,否则根据Resource的ResourceMode来判断是读StreamingAssets里面的AB资源还是读取PersistentDataPath里面的AB资源

 (2)配置Localization

 

 (3)配置Procedure

全部勾选, 选择launch主流程

(4)配置Resource

Package: 单机模式, AB资源需要放到StreamingAssets
Updatable: 更新模式, 需填入Update Prefix Uti  你的资源存放下载地址

(5)配置UI

一般来说,需要自己重写UGuiGroupHelper
我这边设置了2层, 底层:BaseUI 需要UI相机绑定  最上层 Overlay
根据各自的需要自己拟定

        private void InitCanvas()
        {
            m_CachedCanvas = gameObject.GetOrAddComponent<Canvas>();
            if (m_Depth == 0)
            {
                m_CachedCanvas.renderMode = RenderMode.ScreenSpaceCamera;
                m_CachedCanvas.worldCamera = GameObject.Find("UICamera").GetComponent<Camera>();
                m_CachedCanvas.planeDistance = m_CachedCanvas.worldCamera.farClipPlane / 2;
                m_CachedCanvas.sortingLayerName = name;
            }
            else
            {
                m_CachedCanvas.renderMode = RenderMode.ScreenSpaceOverlay;
                m_CachedCanvas.overrideSorting = true;
                m_CachedCanvas.sortingOrder = DepthFactor * m_Depth;
            }
            CanvasScaler csc = gameObject.GetOrAddComponent<CanvasScaler>();
            csc.uiScaleMode = CanvasScaler.ScaleMode.ScaleWithScreenSize;
            csc.referenceResolution = new Vector2(Screen_width, Screen_height);
            csc.screenMatchMode = CanvasScaler.ScreenMatchMode.MatchWidthOrHeight;
            csc.matchWidthOrHeight = MatchWidthOrHeight;
            gameObject.GetOrAddComponent<GraphicRaycaster>();
        }

(6)配置Web Request

Unity在2017以后逐步放弃了www方案, 主推unityWebRequest方案

如何阅读

1.从ProcedureLaunch开始阅读
        ChangeState<Procedure>(procedureOwner);
        用于跳转流程
2.ProcedureSplash 可以搞些打开动画, 比如:
                我是正经游戏,
                不是精神鸦片,
                是家长不作为,
                然而怪我咯

3.ProcedureCheckVersion 检查资源流程
   是否是编辑器模式
        是: 进入ProcedurePreload流程
        否: 检查Resource Mode
                Package: 初始化资源, 进入ProcedurePreload流程
                Updatable: 请求版本号,检查是否需要更新资源
4.ProcedurePreload 预加载流程

            // Preload configs
            LoadConfig("DefaultConfig");
            // Preload data tables
            foreach (string dataTableName in DataTableNames)
            {
                LoadDataTable(dataTableName);
            }
            // Preload dictionaries
            LoadDictionary("Default");
            // Preload fonts
            LoadFont("MainFont");
            // Preload PersistentDataPath image
            // Init Shader
            // Do everything

加载你需要的各项内容
5.ProcedureUpdateGame 更新流程
使用GameEntry.Resource.CheckResources检查需要更新资源
使用GameEntry.Resource.UpdateResources来更新你的资源
同时监听OnResourceUpdateStart,OnResourceUpdateChanged,OnResourceUpdateSuccess,OnResourceUpdateFailure处理你需要的事情
6.ProcedureMainMenu 主菜单流程
终于进入到了自己的节奏中了, 可以愉快的虾搞了
7.你需要什么流程自己加呗, 都是有限状态机处理的, 需要自己判断进入下一个流程的时机

如何加载UI界面

所有的UI界面脚本继承UGuiForm类,基类包含很多基础功能函数
    主要功能:(可通过重写来添加需要的功能,记得调用基类中的相应方法)
    OnInit            界面初始化
    OnOpen            界面打开
    OnClose            界面关闭
    OnPause            界面暂停
    OnResume        界面暂停恢复
    OnCover            界面遮挡
    OnReveal        界面遮挡恢复
    OnRefocus        界面激活
    OnUpdate         界面轮询
    OnDepthChanged    界面深度改变

    获取其他界面的实例:
     //加载UI界面
    GameEntry.UI.OpenUIForm(UIFormId.MenuForm, this);
    //打开对话框界面
    GameEntry.UI.OpenDialog(new DialogParams()
     {
                    Mode = 1,
                    Title = GameEntry.Localization.GetString("LoginDemo.Tip"),
                    Message = GameEntry.Localization.GetString("LoginDemo.AccountError"),
      });

Setting组件

用于存取本地数据,使用Unity的PlayerPref来实现的,调用方法也差不多,只是多封装了一层
    //设置并保存数据
    GameEntry.Setting.SetString(Constant.Setting.Language, language.ToString());
    GameEntry.Setting.Save();
    //获取数据
    GameEntry.Setting.GetString(Constant.Setting.Language);
    //清除key所对应的数据
    GameEntry.Setting.RemoveKey(Constant.Setting.Language);

DataTable组件

        加载和获取所有表数据的组件
        ProcedurePreload (预加载流程)中加载所有数据
        //获取整张表数据
        IDataTable<DRUIForm> dtUIForm = GameEntry.DataTable.GetDataTable<DRUIForm>();
        //根据数据表行的编号来获取该行数据
        DRUIForm drUIForm = dtUIForm.GetDataRow(uiFormId);
        //获取完表数据,记得判空
        if (drUIForm == null)
        {
            return false;
        }

Download 下载组件

用于资源的更新,支持断点续传
    示例:
    //从url远程地址下载所需要的资源文件到本地localPath路径
    //注意:localPath和url都需要完整路径,即包含文件名以及文件名后缀!
    GameEntry.Download.AddDownload(string localPath, string url);
    GameEntry.Download.CurrentSpeed//当前下载速度
    //订阅下载成功事件
    GameEntry.Event.Subscribe(UnityGameFramework.Runtime.EventId.DownloadSuccess, DownloadSuc);
    void DownloadSuc(){
        DownloadSuccessEventArgs ne = (DownloadSuccessEventArgs)e;
        if(ne.UserData!=this)    return;//是否是当前监听的事件
        ........
    }

Entity实体组件

所有游戏中的物体都通过该组件来加载(如:敌人、子弹、角色、技能特效等)
    示例:
    (1)每一种实体类继承EntityObject类来实现具体的逻辑功能 如:Bullet 继承 EntityObject
    (2)同时为该实体创建相应的数据类,继承BulletData类来实现 如:BulletData 继承 EntityData
    (3)在实体表Entity.txt中添加该实体的一行数据
    (4)在扩展类EntityExtension.cs中添加该实体的显示扩展 如: 
        public static void ShowBullet(this EntityComponent entityCompoennt, BulletData data)
        {
            entityCompoennt.ShowEntity(typeof(Bullet), "Bullet", data);
        }
    (5)调用实现:
        GameEntry.Entity.ShowBullet(new BulletData(.......));

Localization语言本地化组件

    所有本地化语言使用XML文件保存在固定文件夹中,如:
    简体中文存放在:Assets/GameMain/Localization/ChineseSimplified/Dictionaries/Default.xml中
    在default.xml中添加唯一的key和value即可在代码中获取
    使用示例:
    //根据文字的key获取对应的string值
    GameEntry.Localization.GetString("Dialog.ConfirmButton");

Object Pool 对象池组件

可以根据对象类型创建相应的对象池:

    //创建一个HPBar的对象类,继承自对象基类
	public class HPBarItemObject : ObjectBase
    {
        public HPBarItemObject(object target)
            : base(target)
        {

        }

        protected override void Release()
        {
            HPBarItem hpBarItem = (HPBarItem)Target;
            if (hpBarItem == null)
            {
                return;
            }

            Object.Destroy(hpBarItem.gameObject);
        }
    }

    //IObjectPool:对象池接口
	private IObjectPool<HPBarItemObject> m_HPBarItemObjectPool = null;
	//CreateSingleSpawnObjectPool 创建允许单次获取的对象,
	//就是说创建出来的对象同时只能有一个地方使用,需要多个地方同时使用的就会创建多个对象
	m_HPBarItemObjectPool = GameEntry.ObjectPool.CreateSingleSpawnObjectPool<HPBarItemObject>("HPBarItem", m_InstancePoolCapacity);
	//CreateMultiSpawnObjectPool 创建允许多次获取的对象,
	//就是说该方法创建的对象可以由多处使用,永远只会存在一个对象,多处共用!
	m_HPBarItemObjectPool = GameEntry.ObjectPool.CreateMultiSpawnObjectPool<HPBarItemObject>("HPBarItem", m_InstancePoolCapacity);
	//创建对象
	m_HPBarItemObjectPool.Register(new HPBarItemObject(hpBarItem), true);
	//获取对象
	HPBarItemObject hpBarItemObject = m_HPBarItemObjectPool.Spawn();
	//回收对象
	m_HPBarItemObjectPool.Unspawn(hpBarItem);

	注:详细参考Starface工程HPBarComponent.cs脚本

 强大的Utility工具类

以上都看完了,自己也配置过了一次, 并且成功的进入了Starface的战斗了, 那么恭喜你基础入门了

 *★,°*:.☆( ̄▽ ̄)/$:*.°★* 。
 *★,°*:.☆( ̄▽ ̄)/$:*.°★* 。
 *★,°*:.☆( ̄▽ ̄)/$:*.°★* 。
 *★,°*:.☆( ̄▽ ̄)/$:*.°★* 。
 *★,°*:.☆( ̄▽ ̄)/$:*.°★* 。
 *★,°*:.☆( ̄▽ ̄)/$:*.°★* 。


  • 界面

我们先制作一个假冒伪劣的框架界面

PS: 主要是买了个极米投影仪, 上面听歌软件差评, 会员不能白买, 于是决定撸个网抑云出来, 就顺便拿来做例子了....

需要做的事:

  1. 加载用户头像图片
  2. 用户名称赋值
  3. 根据自己的歌单动态创建左侧的按钮
  4. 上一首/播放/下一首 按钮响应事件
  5. 进度条: 当前播放事件/播放进度/歌曲总时间
  6. 音量调节
  7. 加载歌曲图片
  8. 歌曲名称赋值
  9. 歌手赋值
  10. 搜索歌曲并展示搜索到的歌曲信息
  11. 最小化/最大化/关闭

这些都是需要真实的数据配合的...


  • 数据来源

网页版的的网易云音乐:网易云音乐

方法一: 使用F12大法
        搜索:春庭雪, 出现下列的歌曲

在开发者工具的界面中选择Network查看http请求的报文

        这块的json数据就是真实的数据, 歌单列表等等都以这样获得
        找个文本存起来, 在unity中读取文本解析json 

方法二: 爬虫大法

        找到发送请求的URL和内容, 伪造一把钥匙去开门
        然后在Unity中撸个Http请求

 

方法三: Git大法

        世界之大无奇不有, 没有你找不到的, 只有你想不到的!

        Github上有别人封装好的API, 可以拿来直接使用... 很方便...真的...谁用谁知道...
一般人我不说的



有兴趣的小伙伴可以关注一波

明天撸代码!

猜你喜欢

转载自blog.csdn.net/flj135792468/article/details/120210339