[Unity] GameFramework 学习记录 3

本文记录了作者在学习 Unity 中的 GameFramework 框架时,针对模块创建、接口实例初始化以及如何查找接口实现的详细过程。通过分析源码和调试,作者发现了对象池管理、动态对象创建以及接口实例的生成方式。

首先要仿照飞船的创建流程创建一个主角

首先直接导入 Starter Assets - Third Person Character Controller
太爽了

我看看啊
他这个是除了 ThirdPersonController 之外还有一个处理刚体碰撞的,一个玩家跟随摄像机,一个 InputSystem 相关的
我在想能不能把他们搬到框架里面


我在看战机的时候,看这两行

IDataTable<DRAircraft> dtAircraft = GameEntry.DataTable.GetDataTable<DRAircraft>();
DRAircraft drAircraft = dtAircraft.GetDataRow(TypeId);

我就一直在想,为什么 GetDataRow 输入的是一个 TypeId
我乍一看上去还以为是,输入行号 TypeId,获得数据表的一行
所以我就奇怪,为什么 typeid 会对应行
因为战机的数据表里面有很多行嘛,那按照我这么想的话,就感觉是,一个表的很多行对应很多 typeid,但是一个战机怎么会在内部有很多 typeid 呢

之后才发现,原来他这个 GetDataRow 原来说的就是获取一整个 DR+数据表名 的类的实例啊hhh


哦我在整理流程的时候最后还是溯源到了一个接口的实例
之前我一直都被这个实例难住,因为我只看得到这个实例,用转到定义也看不到接口中的函数的实现
然后我就不知道怎么看了
之后去网上搜了一下

在这里插入图片描述

他一说构造函数,我才想起来要看这个接口的实例的初始化hhhh

比如我现在一路转到定义,转到了

Assets\GameFramework\UnityGameFramework-b2d2ef63517d2cab5f0def57e691a2d794b6a7f5\Scripts\Runtime\Entity\EntityComponent.cs

        public void ShowEntity(int entityId, Type entityLogicType, string entityAssetName, string entityGroupName, int priority, object userData)
        {
   
   
            if (entityLogicType == null)
            {
   
   
                Log.Error("Entity type is invalid.");
                return;
            }

            m_EntityManager.ShowEntity(entityId, entityAssetName, entityGroupName, priority, ShowEntityInfo.Create(entityLogicType, userData));
        }

然后我就想看 m_EntityManager.ShowEntity,但是如果直接对 ShowEntity() 转到定义,会看到接口类中的函数定义,却看不到实现

C:\Users\18221\AppData\Local\Temp\MetadataAsSource\7f73a0cffcfb4b64ae957e64e6ab0bfe\832e6a5ddbb7461ba47bec9b9ce43ea6\IEntityManager.cs

    //
    // Summary:
    //     实体管理器接口。
    public interface IEntityManager
    {
   
   
        //
        // Summary:
        //     显示实体。
        //
        // Parameters:
        //   entityId:
        //     实体编号。
        //
        //   entityAssetName:
        //     实体资源名称。
        //
        //   entityGroupName:
        //     实体组名称。
        void ShowEntity(int entityId, string entityAssetName, string entityGroupName);

        //
        // Summary:
        //     显示实体。
        //
        // Parameters:
        //   entityId:
        //     实体编号。
        //
        //   entityAssetName:
        //     实体资源名称。
        //
        //   entityGroupName:
        //     实体组名称。
        //
        //   priority:
        //     加载实体资源的优先级。
        void ShowEntity(int entityId, string entityAssetName, string entityGroupName, int priority);

        //
        // Summary:
        //     显示实体。
        //
        // Parameters:
        //   entityId:
        //     实体编号。
        //
        //   entityAssetName:
        //     实体资源名称。
        //
        //   entityGroupName:
        //     实体组名称。
        //
        //   userData:
        //     用户自定义数据。
        void ShowEntity(int entityId, string entityAssetName, string entityGroupName, object userData);

        //
        // Summary:
        //     显示实体。
        //
        // Parameters:
        //   entityId:
        //     实体编号。
        //
        //   entityAssetName:
        //     实体资源名称。
        //
        //   entityGroupName:
        //     实体组名称。
        //
        //   priority:
        //     加载实体资源的优先级。
        //
        //   userData:
        //     用户自定义数据。
        void ShowEntity(int entityId, string entityAssetName, string entityGroupName, int priority, object userData);

这个时候应该看 m_EntityManager 的初始化

Assets\GameFramework\UnityGameFramework-b2d2ef63517d2cab5f0def57e691a2d794b6a7f5\Scripts\Runtime\Entity\EntityComponent.cs

        protected override void Awake()
        {
   
   
            base.Awake();

            m_EntityManager = GameFrameworkEntry.GetModule<IEntityManager>();

往下找

C:\Users\18221\AppData\Local\Temp\MetadataAsSource\7f73a0cffcfb4b64ae957e64e6ab0bfe\53ef5f794854447fae0b6697b6c091ae\GameFrameworkEntry.cs

        //
        // Summary:
        //     获取游戏框架模块。
        //
        // Type parameters:
        //   T:
        //     要获取的游戏框架模块类型。
        //
        // Returns:
        //     要获取的游戏框架模块。
        //
        // Remarks:
        //     如果要获取的游戏框架模块不存在,则自动创建该游戏框架模块。
        public static T GetModule<T>() where T : class
        {
   
   
            Type typeFromHandle = typeof(T);
            if (!typeFromHandle.IsInterface)
            {
   
   
                throw new GameFrameworkException(Utility.Text.Format("You must get module by interface, but '{0}' is not.", typeFromHandle.FullName));
            }

            if (!typeFromHandle.FullName.StartsWith("GameFramework.", StringComparison.Ordinal))
            {
   
   
                throw 
### Game Framework 使用教程及开发指南 Game Framework 是一个广泛应用于游戏开发的框架,主要针对 Unity 引擎进行设计和封装[^1]。它通过提供标准化的开发流程、封装常用模块以及支持快速迭代,帮助开发者提高效率并确保产品质量[^2]。 以下是一个关于 Game Framework 的使用教程概览: #### 1. 安装与配置 在开始使用 Game Framework 之前,需要完成安装和配置工作。具体步骤包括: - 下载项目源码,可以从官方仓库获取(如 [UnityGameFramework](https://gitcode.com/gh_mirrors/un/UnityGameFramework) 或其他相关版本)[^3]。 - 导入项目到 Unity 工程中,确保 Unity 版本与框架兼容。 - 配置必要的资源路径和依赖项,例如加载场景、资源管理等。 #### 2. 核心功能介绍 Game Framework 提供了多个核心模块,用于处理游戏开发中的常见需求[^4]。以下是几个关键模块及其用途: - **资源管理**:支持动态加载和卸载资源,减少内存占用。 - **实体系统**:基于数据驱动的设计,允许开发者定义和操作游戏中的对象。 - **事件系统**:实现模块间的解耦通信,便于扩展和维护。 - **日志系统**:记录运行时信息,方便调试和问题追踪。 #### 3. 开发流程 为了高效地使用 Game Framework,建议遵循以下开发流程: - **初始化项目**:创建一个新的 Unity 工程,并导入 Game Framework 插件。 - **配置框架参数**:根据项目需求调整框架的默认设置。 - **开发核心功能**:利用框架提供的模块实现游戏的核心逻辑。 - **测试与优化**:通过框架的日志和性能分析工具,对游戏进行优化。 #### 4. 示例代码 以下是一个简单的示例,展示如何使用 Game Framework 加载资源并创建实体: ```csharp using UnityEngine; using GameFramework; public class Example : MonoBehaviour { void Start() { // 加载资源 GameEntry.Resource.LoadAsset("prefab/player", (asset) => { if (asset != null) { // 创建实体 GameObject entity = Instantiate(asset as GameObject); entity.transform.position = Vector3.zero; } }); } } ``` #### 5. 学习资源 除了官方文档外,还可以参考以下学习资源: - **官方教程**:[UnityGameFramework 教程指南](https://gitcode.com/gh_mirrors/un/UnityGameFramework) 提供了详细的开发指导。 - **社区讨论**:参与相关论坛或社交媒体群组,与其他开发者交流经验。 - **视频教程**:搜索 YouTube 或 B 站上的相关教学视频,获取直观的学习体验。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值