IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> UNITY实战进阶-框架简介-2 -> 正文阅读

[游戏开发]UNITY实战进阶-框架简介-2

  • Game Farmework 框架基础

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

? ? ? ? 总览:

组件功能名称对应脚本
游戏入口Game FrameworkGameEntry
基础组件BuiltinBaseComponent
全局配置ConfigConfigComponent
数据节点Data NodeDataNodeComponent
数据表Data TableDataTableComponent
调试器DebuggerDebuggerComponent
下载DownloadDownloadComponent
实体EntityEntityComponent
事件EventEventComponent
有限状态机FSMFsmComponent
本地化LocalizationLocalizationComponent
网络NetworkNetworkComponent
对象池Object PoolObjectPoolComponent
流程ProcedureProcedureComponent
引用池Reference PoolReferencePoolComponent
资源管理ResourceResourceComponent
场景管理SceneSceneComponent
游戏配置SettingSettingComponent
界面管理UIUIComponent
声音SoundSoundComponent
web请求Web RequestWebRequestComponent
内置数据Builtin DataBuiltinDataComponent
文件系统(新版本增加)

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, 可以拿来直接使用... 很方便...真的...谁用谁知道...
一般人我不说的



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

明天撸代码!

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2021-09-11 19:08:27  更:2021-09-11 19:09:28 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/17 10:48:04-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码