GameFrameWork框架(Unity3D)使用笔记(六)游戏主流程ProcedureMain——从数据表加载出所需实体

目录

前言: 

一、Entity配置表

1、创建数据表

 2、创建数据表行类

 二、Character配置表

1、创建数据表

 2、写数据表行类

三、加载数据表

四、扩展一下Entity模块

五、应用Character数据表的位置信息

六、测试

总结:


前言: 

        上一篇中我们已经成功在场景中加载出了玩家实体,并且能够控制玩家移动。但是上次是直接调用实体模块加载出实体,在游戏体量大了之后,代码中到处充斥着这种加载方式的代码就会带来诸多问题,比如需要改变实体的资源路径名的话,就得找到各处的相关代码进行修改,这将大大提高维护和修改复杂度。所以我们需要引入数据表这样一个伟大的东西,来对游戏主体和实体资源之间进行进一步的解耦。

        这一次我们将借用数据表,先配置实体数据表的信息,然后读取数据表的配置信息加载出实体。


一、Entity配置表

1、创建数据表

首先在excel里面这么打:

(#开头的是注释。要真正搞懂数据表怎么写与其看各种教程比较推荐啃源码,看看源码是怎么处理读取的数据表的字符串的,这样自己可以不用总是按照StarForce的格式写,也可以自定义自己的数据表格式,自定义解析数据表的方式等。)

接着导出为txt文件Entity,放到数据表文件夹下面:

 2、创建数据表行类

数据表行类的作用就是用来解析数据表的每一行的,看看StarForce的就知道怎么写了:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;
using System.Text;
using UnityGameFramework.Runtime;
namespace ShadowU
{
    public class DREntity : DataRowBase
    {
        private int m_Id;
        public  override int Id
        {
            get { return m_Id; }
        }
        public string AssetName
        {
            get;
            private set;
        }
        public override bool ParseDataRow(string dataRowString, object userData)
        {
            string[] columnStrings = dataRowString.Split(DataTableExtension.DataSplitSeparators);
            for (int i = 0; i < columnStrings.Length; i++)
            {
                columnStrings[i] = columnStrings[i].Trim(DataTableExtension.DataTrimSeparators);
                Log.Debug(columnStrings[i]);
                Log.Debug(columnStrings[i].Length);
            }
            int index = 0;
            index++;
            m_Id = int.Parse(columnStrings[index++]);
            AssetName = columnStrings[index++];
            return true;
        }

        public override bool ParseDataRow(byte[] dataRowBytes, int startIndex, int length, object userData)
        {
            using (MemoryStream memoryStream = new MemoryStream(dataRowBytes, startIndex, length, false))
            {
                using (BinaryReader binaryReader = new BinaryReader(memoryStream, Encoding.UTF8))
                {
                    m_Id = binaryReader.Read7BitEncodedInt32();
                    AssetName = binaryReader.ReadString();
                }
            }
            return true;
        }
    }
}

 二、Character配置表

这个表用来配置和角色相关的信息,暂时就配置一个角色的初始位置.(以后多关卡可以扩展)

1、创建数据表

 

 2、写数据表行类

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;
using System.Text;
using UnityGameFramework.Runtime;
namespace ShadowU
{
    public class DRCharacter : DataRowBase
    {
        private int m_Id;
        public override int Id
        {
            get { return m_Id; }
        }
        public Vector3 SpawnPosition
        {
            get;
            private set;
        }
        public override bool ParseDataRow(string dataRowString, object userData)
        {
            string[] columnStrings = dataRowString.Split(DataTableExtension.DataSplitSeparators);
            for (int i = 0; i < columnStrings.Length; i++)
            {
                columnStrings[i] = columnStrings[i].Trim(DataTableExtension.DataTrimSeparators);
                Log.Debug(columnStrings[i]);
                Log.Debug(columnStrings[i].Length);
            }
            int index = 0;
            index++;
            m_Id = int.Parse(columnStrings[index++]);
            index++;
            string[] rowSpawnPosition = columnStrings[index++].Split('|');
            SpawnPosition = new Vector3(int.Parse(rowSpawnPosition[0]),int.Parse(rowSpawnPosition[1]), int.Parse(rowSpawnPosition[2]));
            return true;
        }
        //还有个解析二进制数据的没必要写因为我不是二进制数据存储的
    }
}

三、加载数据表

数据表都搞好了,下面就是加载数据表以备试用。

在ProcedureLaunch流程里面加载数据表的逻辑里面加载我们新增的两个表:

 就这么简单。


四、扩展一下Entity模块

 咱把”加载主角实体“这个操作整合到一个函数ShowPlayer()里面,并且作为Entity模块的一个扩展方法:


五、应用Character数据表的位置信息

数据表里的这个SpawnPosition位置信息,是要写到玩家实体对应的PlayerData类的实例数据里的Position属性里去的,最终Entity模块会根据实体数据里的Position属性确定生成实体的位置。

所以我们在PlayerData的构造方法里面查询数据表,填上玩家出生的位置信息:


六、测试

现在我们整个读取数据表加载实体的流程基本上搞定了。

我们已经创建了数据表信息,数据表行类,并且在游戏初始化的时候加载数据表。

我们利用Character数据表里的出生位置信息赋予玩家实体初始位置。

我们利用用Entity数据表里的资源名称信息加载玩家实体资源。

下面我们在主流程中调用我们写的扩展方法ShowPlayer()看看效果:

 但是报错了:

找了半天错误我真的没话讲。。。

原因是数据表最后有两行空行。。。。删掉就好了。

然后在解决这个bug的时候我还发现自己代码的一些错误,DRCharacter里解析坐标时候的Int.Parse()要改成float.Parse():

然后重新运行:

点击开始

哦看来是没问题了,就是初始坐标设置的有问题(红色报错是个人问题不用管)

 数据表改个坐标:

再次运行:

成功!


总结:

养成实体从数据表配置中加载的好习惯。

 

 

 

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
当学习Unity3D时,以下是一些重要的笔记: 1. Unity3D基础知识: - 游戏对象(Game Objects)和组件(Components):了解游戏对象的层次结构和组件的作用。 - 场景(Scenes)和摄像机(Cameras):学会如何创建场景并设置摄像机视角。 - 材质(Materials)和纹理(Textures):掌握如何创建和应用材质和纹理。 - 动画(Animations):学习如何创建和控制游戏对象的动画。 2. 脚本编程: - C#语言基础:了解C#语言的基本语法和面向对象编程概念。 - Unity脚本编写:学习如何编写脚本来控制游戏对象的行为和交互。 - 常见组件和功能:掌握常见的Unity组件和功能,如碰撞器(Colliders)、刚体(Rigidbodies)、触发器(Triggers)等。 3. 游戏开发流程: - 设计游戏关卡:了解如何设计游戏场景和关卡,包括布局、道具、敌人等。 - 游戏逻辑实现:将游戏规则和玩家交互转化为代码实现。 - UI界面设计:学习如何设计游戏中的用户界面,包括菜单、计分板等。 - 游戏优化和调试:优化游戏性能,解决常见的错误和问题。 4. 学习资源: - Unity官方文档和教程:官方提供了大量的文档和教程,逐步引导你学习Unity3D。 - 在线教程和视频教程:网上有很多免费和付费的Unity教程和视频教程,可根据自己的求选择学习。 - 社区论坛和博客:加入Unity开发者社区,与其他开发者交流并获取帮助。 通过系统地学习这些内容,你将能够掌握Unity3D的基础知识并开始开发自己的游戏项目。记得不断实践和尝试,不断提升自己的技能!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

咖啡咖_CoffCa

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

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

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

打赏作者

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

抵扣说明:

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

余额充值