-
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: 主要是买了个极米投影仪, 上面听歌软件差评, 会员不能白买, 于是决定撸个网抑云出来, 就顺便拿来做例子了....
需要做的事:
- 加载用户头像图片
- 用户名称赋值
- 根据自己的歌单动态创建左侧的按钮
- 上一首/播放/下一首 按钮响应事件
- 进度条: 当前播放事件/播放进度/歌曲总时间
- 音量调节
- 加载歌曲图片
- 歌曲名称赋值
- 歌手赋值
- 搜索歌曲并展示搜索到的歌曲信息
- 最小化/最大化/关闭
这些都是需要真实的数据配合的...
-
数据来源
网页版的的网易云音乐:网易云音乐
方法一: 使用F12大法
搜索:春庭雪, 出现下列的歌曲
在开发者工具的界面中选择Network查看http请求的报文
这块的json数据就是真实的数据, 歌单列表等等都以这样获得
找个文本存起来, 在unity中读取文本解析json
方法二: 爬虫大法
找到发送请求的URL和内容, 伪造一把钥匙去开门
然后在Unity中撸个Http请求
方法三: Git大法
世界之大无奇不有, 没有你找不到的, 只有你想不到的!
Github上有别人封装好的API, 可以拿来直接使用... 很方便...真的...谁用谁知道...一般人我不说的
有兴趣的小伙伴可以关注一波
明天撸代码!