[Unity] GameFramework 学习记录 2

本文记录了作者在学习Unity中GameFramework游戏框架的过程,从工程仓库搭建到主角基础移动的实现,详细描述了加载流程、数据表的创建与使用,以及在遇到各种问题时的解决思路,包括组件初始化顺序、资源加载和数据表生成等常见问题的解决。
摘要由CSDN通过智能技术生成

嗯……要开始尝试做自己的事了

一开始策划给我列了这些

工程仓库搭建
工程程序框架
第三人称相机实现
主角基础移动实现
主角闪避实现
主角战斗实现
主角能量条实现
近战敌人战斗实现
远程敌人战斗实现
UI实现02
用户设置实现02

开始开始

我觉得主角基础移动是首先要做的

那就先看什么时候要开始控制主角吧

那自然是从流程开始看

ProcedureLaunch 中做语言、资源包、音乐设置
一帧之后跳转
然后到 ProcedureSplash 这个是游戏开始前的闪屏,比如展示公司标志
闪屏任务结束后跳转
然后到 ProcedurePreload 加载设置、数据表、字典、字体
订阅加载函数成功事件,设置 flag 为真。所有 flag 都为真,说明所有加载项都加载完毕,可以跳转
NextSceneId 是 Assets\GameMain\Configs\DefaultConfig.txt 中的 Scene.Menu
然后到 ProcedureChangeScene,进入时 停止所有声音,隐藏所有实体,卸载所有场景,还原游戏速度 这其实也是基于游戏的,比如还原游戏速度,是因为游戏中陨石被打碎的时候会让游戏速度先减慢后恢复,游戏有可能在陨石被击碎,游戏速度还没恢复正常的时候退出,这个时候就要恢复正常了
但总归来说,也是一个通用的中间流程

接下来自然到了这一句

IDataTable<DRScene> dtScene = GameEntry.DataTable.GetDataTable<DRScene>();

感觉很神奇,因为实际上我需要的是一个 scene 表,但是我是向 api 输入了一个泛型
那么就有一个问题是,为什么我能够得到一个表
如果对 GetDataTable 溯源的话,就会找到一个 DataTable 中的接口,其中找不到对 GetDataTable 接口的实现

这个时候没有头绪的话,我就会想,是不是我直接在 Assets\GameMain\DataTables 中创建好了 txt 格式的表格,就能直接通过 GameEntry.DataTable.GetDataTable<DR表格名>() 获得表格
毕竟因为我看不到内容嘛
但总归是不确定,所以就很烦躁

之后找别的教程才知道所有数据表已经 load 过了
在 ProcedurePreload 的 OnEnter 就开始加载资源,加载资源的函数里面包含了加载数据表,这个加载数据表是对一个名称列表遍历,把名称输入到加载数据表函数里面,加载数据表函数根据这个数据表名称找到资源名,名称和资源名一起输入到 DataTableExtension 的加载函数里面,在那里面再给文件名前面加上一个 DR,看有没有定义过 DR+数据表名 的类,有的话就新建一个表然后读数据进去

Assets\GameMain\Scripts\Procedure\ProcedurePreload.cs

        protected override void OnEnter(ProcedureOwner procedureOwner)
        {
   
        	//...
            PreloadResources();
        }
        private void PreloadResources()
        {
   
            // Preload configs
            LoadConfig("DefaultConfig");

            // Preload data tables
            foreach (string dataTableName in DataTableNames)
            {
   
                LoadDataTable(dataTableName);
            }

Assets\GameMain\Scripts\Procedure\ProcedurePreload.cs

namespace OaksMayFall
{
   
    public class ProcedurePreload : ProcedureBase
    {
   
        public static readonly string[] DataTableNames = new string[]
        {
   
            "Aircraft",
            "Armor",
            "Asteroid",
            "Entity",
            "Music",
            "Scene",
            "Sound",
            "Thruster",
            "UIForm",
            "UISound",
            "Weapon",
        };

Assets\GameMain\Scripts\Procedure\ProcedurePreload.cs

        private void LoadDataTable(string dataTableName)
        {
   
            string dataTableAssetName = AssetUtility.GetDataTableAsset(dataTableName, false);
            m_LoadedFlag.Add(dataTableAssetName, false);
            GameEntry.DataTable.LoadDataTable(dataTableName, dataTableAssetName, this);
        }

Assets\GameMain\Scripts\DataTable\DataTableExtension.cs

public static void LoadDataTable(this DataTableComponent dataTableComponent, string dataTableName, string dataTableAssetName, object userData)
        {
   
            if (string.IsNullOrEmpty(dataTableName))
            {
   
                Log.Warning("Data table name is invalid.");
                return;
            }

            string[
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值