? ? ? ?框架很牛, 谁用谁知道, 是中小型游戏公司的福利, 不多说,直接介绍一波
? ? ? ? 总览:
组件功能 | 名称 | 对应脚本 | 游戏入口 | 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, 可以拿来直接使用... 很方便...真的...谁用谁知道...
一般人我不说的
有兴趣的小伙伴可以关注一波
明天撸代码!
|