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

news2024/11/22 22:32:24

目录

前言: 

一、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():

然后重新运行:

点击开始

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

 数据表改个坐标:

再次运行:

成功!


总结:

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

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/28594.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第2章 Elasticsearch入门

2.1 Elasticsearch 安装 2 . 1 .1 下载软件 Elasticsearch的官方地址&#xff1a;www.elastic.co/cn/ Elasticsearch最新的版本是7.11.2&#xff08;截止2021.3.10&#xff09;&#xff0c;我们选择7.8.0版本&#xff08;最新版本半年前的版本&#xff09; 下载地址&#x…

贝叶斯网络

贝叶斯网络的独立性&#xff1a; 当一个结点G的父节点已知的时候&#xff0c;该结点G与其所有非后代结点条件独立 交叉因果推断&#xff1a;如上述图中的例子,对于P&#xff08;i | g | d&#xff09;等于说是中D到I 这条路径中&#xff0c;做半边的路径是顺着箭头走的&#x…

表白墙(前端+后端+数据库)

目录 一、创建项目 1、创建maven项目&#xff0c;引入依赖 2、创建目录结构 二、前端代码 1、页面内容和样式 2、提交按钮的点击事件 3、发送GET请求 三、数据库 四、后端代码 1、重写doPost方法 1.1 创建Message类 1.2 重写doPost方法 1.3 实现save方法 2、重写…

你需要知道的50颗卫星:地球卫星清单

开放数据卫星 1陆地卫星 地球资源卫星令人难以置信的长期遗产已经保存了地球40多年的历史。通过无数的应用程序&#xff0c;它甚至发现 island Landsat in Canada。 图片来源&#xff1a;NASA 2哨兵 作为 Copernicus Programme 哨兵的6个任务的舰队是一个游戏改变者。明确地…

2022年经典散文:滚烫的石板

滚烫的石板 ——灵遁者 此刻&#xff0c;我想表达的情愫大概有千万种&#xff0c;如何表达并不容易&#xff0c;就好像一个人的时候&#xff0c;也在面对某个我认识或者不认识的人&#xff0c;话总是说不清&#xff0c;也说不出来。 小孩总是敢于表达的&#xff0c;就像一条没…

.NET 7 的 AOT 到底能不能扛反编译?

一&#xff1a;背景 1.讲故事 在B站&#xff0c;公众号上发了一篇 AOT 的文章后&#xff0c;没想到反响还是挺大的&#xff0c;都称赞这个东西能抗反编译&#xff0c;可以让破解难度极大提高&#xff0c;可能有很多朋友对逆向不了解&#xff0c;以为用 ILSpy,Reflector,DnSpy…

群勃龙-半琥珀酸酯(TR-HS)与BSA牛血清白蛋白偶联 TR-HS-BSA

产品名称&#xff1a;群勃龙-半琥珀酸酯与牛血清白蛋白偶联 英文名称&#xff1a;TR-HS-BSA 用途&#xff1a;科研 状态&#xff1a;固体/粉末/溶液 产品规格&#xff1a;1g/5g/10g 保存&#xff1a;冷藏 储藏条件&#xff1a;-20℃ 储存时间&#xff1a;1年 牛血清中的简单蛋白…

全光谱台灯对孩子眼睛有影响吗?什么样的全光谱台灯真的有用

全光谱台灯对眼睛当然是有影响的&#xff0c;因为光谱成分丰富度与太阳光类似&#xff0c;所以无限接近于太阳光的显色能力&#xff0c;这样的灯光下物体的色差如同沐浴太阳光一般真实&#xff0c;色差不失真&#xff0c;人眼自然就越舒服。 那么什么样的全光谱台灯有用呢&…

Python|excel表格数据一键转json格式小工具|支持xlsx、xls格式转json|【源码+解析】

背景 最近在使用JavaScript编写一些浏览器RPA脚本&#xff0c;脚本使用过程中遇到一些问题&#xff0c;脚本使用的数据往往存放在excel表&#xff0c;但运行时只能读取json数据&#xff0c;导致频繁人工excel转json&#xff0c;效率低下。 遇到问题后赶紧搜索excel转json小工…

基于PHP+MySQL药品信息查询系统(含论文)

本系统阐述了医药信息查询系统的开发过程,并对该系统的需求分析及系统需要实现的设计方法作了介绍。该系统的基本功能包括用户注册登录,查看医药资讯,医药查询和在线留言等信息。 本系统技术介绍:php,mysql,apache,notepad,sublime.运行环境wamp,PHPstudy,xammp等php集成环境. …

FastAPI使用typing类型提示

typing是Python标准库&#xff0c;用来做类型提示。FastAPI使用typing做了&#xff1a; 编辑器支持&#xff1b; 类型检查&#xff1b; 定义类型&#xff0c;request path parameters, query parameters, headers, bodies, dependencies等等&#xff1b; 类型转换&#xff1…

去中心化应用的终极是应用链?

互操作性是近期在Web3兴起的概念&#xff0c;是指不同的计算机系统、网络、操作系统和应用程序一起工作并共享信息的能力。随着链上通信、语义交互逐渐复杂&#xff0c;链上用户多样的需求已然超出应用在单条链可承受的技术能力。 原本视作创新实验的Web3应用逐渐被公众接纳&am…

初识变量和数据类型

JavaScript第2天 输入输出语句 输出语句 alert(变量) > 弹出document.write(变量) > 输出在页面上面console.log(变量) > 打印在控制台上 /* JS的输出语句 */ alert("弹出") document.write("直接在写页面上面") console.log("打印在控制…

MacOS 如何选择鼠标不飘滚动平滑

MacOS 如何选择鼠标不飘滚动平滑 前言 今天不务正业的聊聊 macos 下的鼠标的事情&#xff0c;群里也有朋友和我聊&#xff0c;正好说说这事。 我在很长的时间里都在用 macbook pro 的触控板 键盘的高效模式&#xff0c;因为触控板和键盘很近所以效率很高。 但是有一个问题就是…

set和multiset容器

1、基本概念 所有元素在插入时会自动排好序&#xff1b; 属于关联式容器&#xff0c;底层结构是用二叉树实现的 2、set和multiset的区别 set中不允许有重复元素&#xff0c;multiset允许有重复元素。 3、构造和赋值 构造&#xff1a; set<T>st; //默认构造 set&l…

Linux | 进程间通信 | 匿名管道 | 命名管道 | 模拟代码实现进程通信

文章目录进程通信的意义匿名管道通信原理管道的访问控制进程控制管道的特点命名管道进程通信的意义 之前聊进程时&#xff0c;讲过一个性质&#xff0c;即进程具有独立性&#xff0c;两个进程之间的交互频率是比较少的。就连父子进程也只是共享代码&#xff0c;修改父子进程中…

小程序云开发笔记一

一、什么是云开发&#xff1f; 微信官方云原生开发平台&#xff0c;腾讯云的各种能力加持&#xff0c;用云开发开发者可以节省大量的开发时间和运维成本。 二、云开发优势 无需运维&#xff0c;数据变大不需要管理&#xff0c; 弹性伸缩&#xff0c;业务量变大&#xff0c;服…

在一台电脑上安装多个python版本(小白教程)

我自己的办公电脑是64位&#xff0c;好几个同事的电脑还是win7&#xff0c;32位&#xff0c;因此我在写python办公自动化的时候还要考虑32位的python&#xff0c;因此在电脑上安装了两个版本的python&#xff0c;方便测试、打包使用 1、首先&#xff0c;下载两个python&#xf…

代码随想录算法训练营第七天|LeetCode 454. 四数相加 II 、383. 赎金信、 15. 三数之和、18. 四数之和

LeetCode 454. 四数相加 II 题目链接&#xff1a;454. 四数相加 II 分析&#xff1a; 本题比较简单&#xff0c;因为是无关的四个数组&#xff0c;所以不需要考虑去重&#xff0c;所以用哈希比较简单 思路&#xff1a; 定义个无序map先将nums1和nums2的和的数都存进去&…

单目标应用:世界杯优化算法(World Cup Optimization,WCO)求解单仓库多旅行商问题SD-MTSP(可更改旅行商个数及起点)

一、世界杯优化算法 世界杯优化算法&#xff08;World Cup Optimization&#xff0c;WCO)由Navid Razmjooy等人于2016年提出&#xff0c;该算法模拟了国际足联世界杯比赛&#xff0c;思路新颖&#xff0c;收敛速度快&#xff0c;全局寻优能力强。 算法原理参考&#xff1a;智…