GameFrameWork框架(Unity3D)使用笔记(九) AssetBundle和游戏打包

GameFrameWork框架(Unity3D)实战指南:从AssetBundle配置到一键打包发布 本文详细介绍了GameFrameWork框架在Unity3D中的实战应用,重点解析了AssetBundle配置与一键打包发布的完整流程。通过Resource Editor工具配置资源路径、分组策略及打包技巧,帮助开发者高效管理游戏资源,实现热更新与包体优化。文章还提供了常见问题解决方案和自动化打包脚本,助力游戏开发流程的顺畅进行。 阅读详情
AI摘要

本文介绍了使用GameFrameWork框架打包游戏并运行的流程。包括配置路径,手动添加配置文件并告知框架路径;打包,将资源放入打包工具并设置输出目录;初始化资源,通过框架语句完成初始化;最后测试打包,确保游戏能正常启动运行。

目录

前言:

整个流程:

一、配置路径

二、打包

三、初始化资源

四、测试打包


前言:

        如果使用了GameFrameWork框架的话,你会发现你点击Build And Run按钮打包运行大概是运行不起来的。本篇就讲了怎么打包游戏运行。

        我觉得我对于资源加载这块儿理解也不够深,所以本篇主要记录方法流程,不讲原理。想探究原理的可以先去看看官方手册,看看GF官网,然后看看其它GF大佬的B站视频啊,博客啊啥的(多看看,每一篇都有值得吸收的碎片,然后把这些碎片再拼成自己脑中的体系图景)。       

        废话不多说,开干!

整个流程:

  •    配置路径,准备用UGF自带的Editor打包
  •    打出AB包
  •    把打好的包复制进StreamingAssets文件夹(如果已经build了)    
  •    build工程

一、配置路径

        如过没有配置过路径的话,打开GameFramework的资源工具Resource Editor是这样的:

        

也就是最右边一列的资产列表是空的。

(关于这个打包工具官网有相关介绍可以先看看)

所以这里需要自己手动添加一个配置文件,告诉这个打包器需要打包的资源路径。

在Assets/GameMain/Configs下手动创建文件ResourceEditor.xml:

内容为:

<?xml version="1.0" encoding="UTF-8"?>
<UnityGameFramework>
  <ResourceEditor>
    <Settings>
      <SourceAssetRootPath>Assets/GameMain</SourceAssetRootPath>
      <SourceAssetSearchPaths>
        <SourceAssetSearchPath RelativePath="" />
      </SourceAssetSearchPaths>
      <SourceAssetUnionTypeFilter>t:Scene t:Prefab t:Shader t:Model t:Material t:Texture t:AudioClip t:AnimationClip t:AnimatorController t:Font t:TextAsset t:ScriptableObject</SourceAssetUnionTypeFilter>
      <SourceAssetUnionLabelFilter>l:ResourceInclusive</SourceAssetUnionLabelFilter>
      <SourceAssetExceptTypeFilter>t:Script</SourceAssetExceptTypeFilter>
      <SourceAssetExceptLabelFilter>l:ResourceExclusive</SourceAssetExceptLabelFilter>
      <AssetSorter>Path</AssetSorter>
    </Settings>
  </ResourceEditor>
</UnityGameFramework>

 (配置文件的内容看英文就明白个大概了,如果想弄懂的话)

配置文件创建了,然后要告诉框架这个配置文件的路径,需要使用一个叫“ResourceEditorConfigPath”的属性来配置。下面来搞。

在Assets/GameMain/Scripts路径下建立Editor文件夹:

文件夹里面手动创建GameFrameworkConfigs.cs(名字实际上应该无所谓):

 里面配置一下刚刚创建的配置文件的路径:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using GameFramework;
using UnityGameFramework.Editor.ResourceTools;
using System.IO;
namespace ShadowU
{
    public static class GameFrameworkConfigs
    {
        [ResourceEditorConfigPath]
        public static string ResourceEditorConfig = Utility.Path.GetRegularPath(Path.Combine(Application.dataPath, "GameMain/Configs/ResourceEditor.xml"));
    }
}

如果不懂为啥可以去恶补一下c#的Attribute的相关知识。

保存。

然后再打开打包的资源编辑器:

这样在右边一列就能够看到自己的资源了。


二、打包

然后打包的任务通俗的说就是把右边的资源放到左边。这个界面的操作说明官网有(官网为数不多的教程就有讲这个的。。。)

然后关于打AB包怎么组合比较好可以参考Unity的官方手册:为 AssetBundle 准备资源 - Unity 手册 (unity3d.com)

这里为了演示就不一个包一个包打了直接一把梭:

然后左边就是选择打包的文件:

 细节不管了,先跑起来再说。

点击右下角save(默认会在Assets/GameFramework/Configs路径下生成ResourceCollection.xml):

然后打开工具的builder:

自己设置好你的Output Directory。

(这里的Internal Resource Version每打一次包就会自增,所以我这里是10.。。。)

 save是保存这个界面填写的配置(默认会在Assets/GameFramework/Configs路径下生成ResourceBuilder.xml)。

按Start Build Resources开始打包!

打包后,到自己设置的输出文件夹里:

 各个文件夹的介绍官网都有写:使用 AssetBundle 构建工具 | Game Framework

然后我们只需要把 Package(单机模式)或 Packed(可更新模式)中对应版本(如 0_1_0_1)、对应平台的内容(如 windows),完整拷贝至 Unity 工程的 Assets/StreamingAssets 中,即可Build了。(StreamingAssets文件夹自己创建):

 然后打包之前可以先在编译器运行一下非编译器资源模式。

把这个取消勾选:

然后运行。。。。。

你会发现报错,运行不了。

因为还有一步。


三、初始化资源

虽然已经把游戏所需要的资源打包放好了,但是要让程序使用它们还得通过框架对这些资源进行初始化。

不过初始化很简单,就一个语句:

GameEntry.Resource.InitResources(OnInitResourcesComplete);

其中传入的OnInitResourcesComplete是初始化完成的回调函数。

用一个标记来判断是否初始化完成:

m_InitResourcesComplete = false;

 回调函数就这么写:

        private void OnInitResourcesComplete()
        {
            m_InitResourcesComplete = true;
            Log.Info("Init resources complete.");
        }

 因为我流程写得相对于StarForce的精简了很多,所以我初始化资源、加载资源、启动游戏等逻辑都放在了ProcedureLaunch.cs里面,所以我加了一点处理来保证初始化资源-->初始化完成-->加载资源-->加载资源完成-->启动游戏这些操作按顺序执行。所以代码如下:

(如果觉得乱直接去学习StarForce的代码即可)

 using GameFramework.Fsm;
using GameFramework.Event;
using UnityGameFramework.Runtime;
using System.Collections.Generic;
using UnityEngine;
namespace ShadowU
{
    public class ProcedureLaunch : ProcedureBase
    {
        public override bool UseNativeDialog
        {
            get
            {
                return true;
            }
        }

        private Dictionary<string, bool> m_LoadedFlag = new Dictionary<string, bool>();//用来标记是否已经加载

        private bool m_InitResourcesComplete = false;

        private bool temp = false;

        public static readonly string[] DataTableNames = new string[]
       {
            "Scene",
            "Character",
            "Entity",
            "Enemy"
       };

        protected override void OnEnter(IFsm<GameFramework.Procedure.IProcedureManager> procedureOwner)
        {
            base.OnEnter(procedureOwner);
            Debug.Log("launch!");

            //初始化资源标记
            m_InitResourcesComplete = false;

            temp = false;

            // 注意:使用单机模式并初始化资源前,需要先构建 AssetBundle 并复制到 StreamingAssets 中,否则会产生 HTTP 404 错误
            GameEntry.Resource.InitResources(OnInitResourcesComplete);

            //注册事件
            GameEntry.Event.Subscribe(LoadConfigSuccessEventArgs.EventId, OnLoadConfigSuccess);
            GameEntry.Event.Subscribe(LoadConfigFailureEventArgs.EventId, OnLoadConfigFailure);
            GameEntry.Event.Subscribe(LoadDataTableSuccessEventArgs.EventId, OnLoadDataTableSuccess);
            GameEntry.Event.Subscribe(LoadDataTableFailureEventArgs.EventId, OnLoadDataTableFailure);

           
        }

        protected override void OnLeave(IFsm<GameFramework.Procedure.IProcedureManager> procedureOwner, bool isShutdown)
        {
            base.OnLeave(procedureOwner, isShutdown);
            //注销事件
            GameEntry.Event.Unsubscribe(LoadConfigSuccessEventArgs.EventId, OnLoadConfigSuccess);
            GameEntry.Event.Unsubscribe(LoadConfigFailureEventArgs.EventId, OnLoadConfigFailure);
            GameEntry.Event.Unsubscribe(LoadDataTableSuccessEventArgs.EventId, OnLoadDataTableSuccess);
            GameEntry.Event.Unsubscribe(LoadDataTableFailureEventArgs.EventId, OnLoadDataTableFailure);

        }

        protected override void OnUpdate(IFsm<GameFramework.Procedure.IProcedureManager> procedureOwner, float elapseSeconds, float realElapseSeconds)
        {
            base.OnUpdate(procedureOwner, elapseSeconds, realElapseSeconds);

            if (!m_InitResourcesComplete)
            {
                // 初始化资源未完成则继续等待
                return;
            }

            if (!temp)//temp用于保证这里的代码只执行一次
            {
                m_LoadedFlag.Clear();
                //预加载配置
                PreloadResources();
                //加载数据表
                foreach (string dataTableName in DataTableNames)
                {
                    LoadDataTable(dataTableName);
                }
                temp = true;
            }

            foreach (KeyValuePair<string,bool> loadedFlag in m_LoadedFlag)
            {
                if (!loadedFlag.Value)
                {
                    return;//说明有资源没有加载成功
                }
            }

            //通过加载的配置表来设置下一个转换场景的ID
            procedureOwner.SetData<VarInt32>("NextSceneId",GameEntry.Config.GetInt("Scene.Menu"));
            //一帧后直接转到菜单流程
            ChangeState<ProcedureChangeScene>(procedureOwner);
        }

        private void PreloadResources()
        {
            LoadConfig("DefaultConfig");
        }

        private void LoadConfig(string configName)
        {
            string configAssetName = AssetUtility.GetConfigAsset(configName, false);
            m_LoadedFlag.Add(configAssetName, false);
            GameEntry.Config.ReadData(configAssetName, this);
        }
        private void LoadDataTable(string dataTableName)
        {
            string dataTableAssetName = AssetUtility.GetDataTableAsset(dataTableName, false);
            m_LoadedFlag.Add(dataTableAssetName, false);
            GameEntry.DataTable.LoadDataTable(dataTableName, dataTableAssetName, this);
        }

        private void OnLoadConfigSuccess(object sender, GameEventArgs e)
        {
            LoadConfigSuccessEventArgs ne = (LoadConfigSuccessEventArgs)e;
            if (ne.UserData != this)
            {
                return;
            }

            m_LoadedFlag[ne.ConfigAssetName] = true;  //资源加载成功了则设置一下标记为true
            Log.Info("Load config '{0}' OK.", ne.ConfigAssetName);
        }

        private void OnLoadConfigFailure(object sender, GameEventArgs e)
        {
            LoadConfigFailureEventArgs ne = (LoadConfigFailureEventArgs)e;
            if (ne.UserData != this)
            {
                return;
            }

            Log.Error("Can not load config '{0}' from '{1}' with error message '{2}'.", ne.ConfigAssetName, ne.ConfigAssetName, ne.ErrorMessage);
        }
        private void OnLoadDataTableSuccess(object sender, GameEventArgs e)
        {
            LoadDataTableSuccessEventArgs ne = (LoadDataTableSuccessEventArgs)e;
            if (ne.UserData != this)
            {
                return;
            }

            m_LoadedFlag[ne.DataTableAssetName] = true;
            Log.Info("Load data table '{0}' OK.", ne.DataTableAssetName);
        }

        private void OnLoadDataTableFailure(object sender, GameEventArgs e)
        {
            LoadDataTableFailureEventArgs ne = (LoadDataTableFailureEventArgs)e;
            if (ne.UserData != this)
            {
                return;
            }

            Log.Error("Can not load data table '{0}' from '{1}' with error message '{2}'.", ne.DataTableAssetName, ne.DataTableAssetName, ne.ErrorMessage);
        }
        private void OnInitResourcesComplete()
        {
            m_InitResourcesComplete = true;
            Log.Info("Init resources complete.");
        }
    }

}

 搞定。


四、测试打包

再在编译器运行一下非编译器资源模式:

 可以启动,点击开始后也能正常运行。

那下面就可以打包了:

Build And Run,选择好文件夹,打包,运行!

 搞定!

同时StreamingAssets文件夹的内容会同时拷贝到打包好的工程的StreamingAssets文件夹:

 

 

GameFrameWork框架(Unity3D)实战指南:从AssetBundle配置到热更新发布 本文详细介绍了GameFrameWork框架在Unity3D中的实战应用,重点讲解AssetBundle配置与热更新发布的完整流程。通过XML文件配置资源打包规则、资源分组原则及打包策略,帮助开发者高效管理游戏资源。同时提供热更新实战方案和常见问题排查技巧,助力游戏开发流程优化。 阅读详情

相关推荐

Unity WebGL资源加载失败?GameFramework AssetBundle问题排查与解决方案

在Unity WebGL开发中,资源加载是核心环节,其机制与本地平台有本质区别。WebGL运行于浏览器沙箱环境,无法直接访问本地文件系统,所有资源需通过异步HTTP请求从服务器获取。这一原理决定了资源路径需从本地路径转换为URL,并涉及跨域、缓存等HTTP特性。其技术价值在于实现跨平台内容交付,尤其适用于无需安装的网页游戏和交互应用。常见应用场景包括使用GameFramework等框架管理AssetBundle的WebGL项目。实践中,资源加载失败常由路径映射错误、服务器配置不当或缓存机制引发。本文聚焦As

weixin_29006701的博客 231

【Unity 3D】GameFramework、QFramework框架简介及应用实战(超详细 附源码)

【Unity 3D】GameFramework、QFramework框架简介及应用实战(超详细 附源码)

showswoller的博客 1万+

GameFramework打包后游戏跑不起来?可能是资源初始化这步没做对

本文深入解析GameFramework打包后游戏无法启动的常见问题,重点讲解资源初始化的关键步骤和调试技巧。通过分析AssetBundle加载机制、编辑器模式与单机模式的差异,以及构建健壮的资源加载状态机,帮助开发者解决资源初始化失败的问题,确保游戏顺利运行。

weixin_42523693的博客 257

GameFramework框架

ellan做事风格非常低调,属于实干派,几乎没有宣传过框架,但是多年持续维护更新,框架实际是提炼于知名的商业项目。虽然框架文档十分匮乏,新人上手相对困难,但是GF依然靠着过硬的代码质量吸引开发者使用和学习。每个模块的xxxManager都会实现对应的IxxxManager接口,UGF只会直接引用接口,不会直接引用Manager。如果需要调用依赖于引擎实现的接口,可以定义对应的IHelper接口并在UGF层实现接口,GF层只管调用不管具体实现。对常用模块封装,规范开发过程,保证产品质量,内置19个模块。

—巨人绿 4507

Unity 游戏框架之GameFramework和ET对比

Unity 框架 GF 和 ET 哪个更好用,各自的优点,缺点是什么? 随着Unity的不断发展,现在出现了很多比较牛逼的 开源 框架,其中,我觉得 最厉害的是 Game Framework 和 ET 这2个框架。 ET:https://github.com/egametang/ET GameFramework:https://github.com/EllanJiang/UnityGameFramework

TxNet 4万+

【Unity3D框架】GameFramework框架完全教程《全网最全》-专栏文章目录

最近准备学习框架,了解到GameFramework框架是国产Unity3D框架,准备学习一下,但是奈何全网关于这个框架的教程实在太少。为了让自己学习方便一些,也为了让后来者乘凉。将框架以自己的理解整理目录,并且补全教程。觉得教程有帮助别忘了一键三连哦。

优快云博客专家,Unity3D高级软件工程师,《Unity 3D从入门到实战》作者。 2万+

告别打包报错!GameFramework框架下AssetBundle打包与StreamingAssets配置全流程避坑

本文详细解析了GameFramework框架下AssetBundle打包与StreamingAssets配置的全流程,帮助开发者避免常见打包报错。从资源编辑器配置、AssetBundle生成策略到StreamingAssets部署与验证,提供实战解决方案和最佳实践,确保游戏资源打包流程高效无误。

weixin_30681121的博客 423

【GameFramework框架】一、框架介绍

这是GameFramework框架教程的第一篇,但是博主不准备直接就讲GameFramework框架。【GameFramework框架】二、GameFramework框架介绍了。框架(Framework)通常被理解为一种基础要素的集合,它们用于承载系统的必要功能。约束性:框架定义了解决特定问题的边界,并将相关的软件组件约束在这个范围内,以保持框架的内聚性和解决问题的专注性。支撑性:框架本身不直接解决问题,而是提供一个基础的支撑结构,使得在其上构建的解决方案更为灵活和高效。

优快云博客专家,Unity3D高级软件工程师,《Unity 3D从入门到实战》作者。 1万+

GameFrameWork框架(Unity3D)实战指南:从AssetBundle配置到独立游戏构建

本文详细介绍了GameFrameWork框架在Unity3D中的实战应用,重点讲解AssetBundle配置与独立游戏构建流程。从资源编辑器环境搭建到AssetBundle打包策略,再到游戏构建集成,提供了一套完整的解决方案,帮助开发者高效管理游戏资源并实现热更新功能。

weixin_30825581的博客 485

【GameFramework扩展应用】6-4、GameFramework框架增加AB包加解密功能

做热更的时候加载的是资源,如果不对这些资源进行加密的话,很容易被人破解,那么应该如何做加解密呢。内置的:使用的加密算法为GameFramework.Utility.Encryption.GetQuickXorBytes();:使用的加密算法为GameFramework.Utility.Encryption.GetXorBytes();OK,那么要如何是实现我们自定义的加解密方法呢。因为加载方式会走LoadResourceAgentHelper的ParseBytes(byte[] bytes)

优快云博客专家,Unity3D高级软件工程师,《Unity 3D从入门到实战》作者。 2334

EtherCAT主站开发(学习笔记一)

摘要:本文介绍了基于STM32H7的EtherCAT主站开发探索。EtherCAT是一种高实时性工业以太网协议,具有低延迟、高带宽利用率等特点。文章详细解析了EtherCAT的协议架构、帧结构和工作原理,重点阐述了PDO数据传输过程及主从站通信机制。同时介绍了CoE、FoE等应用层协议扩展。作者将基于SOEM开源协议栈进行开发,为后续实际应用中的伺服电机控制奠定基础。

weixin_69388007的博客 1474

告别Build失败!GameFramework框架下AssetBundle打包与游戏发布的保姆级避坑指南

本文提供GameFramework框架下AssetBundle打包与游戏发布的详细指南,帮助开发者避免常见构建失败问题。从环境配置、资源分组策略到高级排错技巧,全面解析如何优化AssetBundle打包流程,确保游戏发布顺利进行。特别适合Unity3D开发者和GameFramework初学者。

weixin_30924087的博客 200

别急着做AI:FDE教你识别真需求,让AI真正落地

人工智能项目在落地过程中,经常出现业务方高喊“我们要做AI”,却说不清具体应用场景的现象。判断一个需求是否值得用AI实现,不能只看技术流行度,而要从问题出现频率、当前替代方案以及可量化业务价值三个维度展开验证。同时需要冷静比较规则引擎与大模型的边界:不是所有语义任务都要靠生成式模型,稳定、可解释且低成本的传统方案往往更具工程性价比。数据闭环也至关重要,缺乏历史样本与反馈回流路径的项目,很难在真实环境中持续优化。针对智能客服、合同审查或企业知识库等典型场景,可借助人机协同与最小代价的用户验证,逐步筛除伪需求,

weixin_42624889的博客 341

GameFramework资源管理进阶:对比单机模式(Package)与可更新模式(Packed)的打包策略选择

本文深入解析GameFramework资源管理中的单机模式(Package)与可更新模式(Packed)的打包策略选择。通过对比两种模式的核心设计哲学、技术实现细节及适用场景,帮助开发者根据项目需求选择最优方案,并分享高级优化技巧与安全防护措施,提升Unity3D游戏开发效率。

weixin_33704234的博客 450

保姆级教程:用CameraX API快速搞定Android多摄像头切换与预览(附避坑指南)

本文提供了一份详细的CameraX API教程,帮助开发者快速实现Android多摄像头切换与预览功能。通过简化API设计和生命周期感知能力,CameraX大幅降低了开发复杂度,同时解决了多摄像头兼容性、预览优化等常见问题。文章包含完整代码示例和实战避坑指南,特别适合需要高效集成相机功能的Android开发者。

weixin_42699679的博客 166

微信小程序:errno: 1500104, errCode: 10008, errMsg: “writeBLECharacteristicValue:fail:system error, status

微信小程序errno: 1500104, errCode: 10008, errMsg: "writeBLECharacteristicValue:fail:system error, status: UNKNOWN (239)"微信小程序调用蓝牙API,wx.writeBLECharacteristicValue()报错,微信小程序蓝牙写入错误,在开发uniapp微信小程序蓝牙通信功能时报错,蓝牙开发设备控制核心api,微信小程序调用蓝牙API “wx.writeBLECharacteristicValu

✅ 精选推荐文章 3930

Unity通用框架GameFramework源码集成与核心模块应用指南

在Unity游戏开发中,模块化框架设计是提升代码复用性、可维护性和团队协作效率的核心工程实践。其原理在于通过预置通用功能模块(如资源管理、UI系统、场景控制)和定义清晰的交互规范,将游戏架构的“地基”标准化,使开发者能聚焦于游戏独特的玩法逻辑。这种设计模式的技术价值在于大幅降低项目启动成本,统一代码规范,并为中大型项目的长期迭代提供稳定支撑。其应用场景广泛覆盖从独立游戏到商业手游的开发流程。本文以开源框架GameFramework为例,详细解析其源码集成方法、核心模块(如资源加载、UI管理)的配置与使用,并

weixin_33985507的博客 479

32、AI责任认定:法律与社会视角的探讨

本文探讨了人工智能(AI)在法律与社会视角下的责任认定问题。从疏忽与责任标准、严格责任制度的适用性,到AI是否能够承担法律责任等角度展开分析,指出随着AI技术的发展,传统的责任概念需要重新审视。文章进一步将AI与法人进行类比,提出AI作为物理-社会系统的责任认定框架,并强调需要建立适应AI特点的法律体系以实现公平与安全的平衡。

star5的专栏 200

[Unity3D] 5.0 图集合并扩展工具,用于解决UGUI与AssetBundle打包造成资源包过大的问题

http://www.cppblog.com/shly/archive/2015/12/09/212443.html [Unity3D] 5.0 图集合并扩展工具,用于解决UGUI与AssetBundle打包造成资源包过大的问题 UGUI Image已Sprite为主,而简单的合并图集可以使用自带的SpritePacker。 而当在使用AssetBundle的时候情况有些不同,会

any 3111

宇瞳杯安防镜头设计

宇瞳杯安防镜头设计

weixin_72050316的博客 1516

技术面 - 手撕算法题整理

这篇博客整理了华为OD面试中涉及的算法题,包括LeetCode热门题目、OD原题和需要手写的算法,如二分查找、冒泡排序等。建议优先刷"hot100"的LeetCode题目,全刷OD原题,以及掌握手撕算法的基本原理。

m0_73659489的博客 1024

Unity3d+GameFramework:资源分析,资源依赖,循环依赖检测

根据ResourceCollection.xml增加打包资源[],“Name”0,“Packed”false}增加打包资源[],“Name”0,“Packed”false}

Have a nice day. 3650

【WorkBuddy专栏43】如何利用WorkBuddy开发一个PC网站(上)——环境选型、设计编码到部署上线

【WorkBuddy专栏43】如何利用WorkBuddy开发一个PC网站(上)——环境选型、设计编码到部署上线

AI人人懂 2249

Unity3D 5.3 新版AssetBundle使用方案及策略

Unity3D 5.3 新版AssetBundle使用方案及策略 本文的主要内容就是分析5.X版本的AssetBundle机制(包括创建资源包、压缩资源包、加载资源包和从资源包中加载/卸载资源等几个方面)及其关键的API使用方式并总结一些对项目的建议

write_the_code的博客 450

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

从StarForce到你的项目:手把手迁移GameFramework的GameEntry最佳实践

本文详细介绍了如何将GameFramework的GameEntry从StarForce示例迁移到实际项目中,提供模块化设计和动态注册机制的最佳实践。通过解析核心架构、初始化顺序控制和开发期辅助工具,帮助开发者高效实现GameEntry的定制化改造,提升Unity3D项目的可维护性和扩展性。

weixin_28693309的博客 213

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

GameFramework资源管理实战:从Resource Editor配置到ProcedureLaunch初始化的完整代码解析

本文深入解析GameFramework资源管理模块,从Resource Editor配置到ProcedureLaunch初始化的完整流程。详细介绍了AssetBundle打包策略、运行时资源加载机制及性能优化技巧,帮助开发者高效管理Unity3D游戏资源,提升游戏开发效率。

weixin_34110970的博客 259

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

上一篇: GameFrameWork框架(Unity3D)使用笔记(八) 实现场景加载进度条
下一篇: 【模板】并查集简单版模板(路径压缩、按size合并双重优化版,C#)
咖啡咖_CoffCa
博客等级 码龄6年 116粉丝 58原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

咖啡咖_CoffCa

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值