Godot(4.X): 外接Python处理Excel数据: 账号管理系统实现
前言: 本文是Godot通过外接Python脚本处理Excel数据实现的账号管理系统Godot 游戏内使用AutoLoad实现全局账号管理对接外部Python脚本。本文包括子文章除了 Godot 实现的代码外将会有较多篇幅解释Python处理Excel表格的代码。此外在阅读本文章前请了解Godot全局AutoLoad。这里给出AutoLoad全局编辑器操作的解释:Godot(2D)架构细分4编辑器全局设置解释-CSDN博客注意: 由于解释文章过长这里将会给出总篇章同时将给出子文章作为补充解释文章链接将会在文末给出。本文中由于 Python 脚本已经对接Godot规定了Python和Godot之间的传参格式同时保留了Python中总调试开关所以演示会同时演示Python和Godot两边的输出且Godot中处理方式将会在后续文章中补充。同时本文给出的 Python 代码中除了对Excel的处理还会带有未使用但是用于优化的Excel统一打开类Excel转化Json供Godot获取玩家数据的处理函数本文作为总文章首先会给出开源地址以及实际演示效果完整代码解析将会放于文末逐渐补全。1. Godot外接Python数据处理Excel概述1. 综合讨论与概述Godot 实现外接 Python 处理 Excel 表格是因为想要实现可视化数据更改提升存储数据容量方便信息维护。从读取速度来讲Godot原生支持的直接读写格式如Resource二进制格式JSON格式CSV格式等的文件读写速度远高于 Excel 文件但是由于 Excel 表格数据的操作方式较多在合理数据量下一般不会造成严重卡顿数据类型丰富且结构稳定支持库多而且对于人来讲信息清晰容易读懂修改所以用来存储大量非即时数据例如账号大小较大的多人存档等信息而言是一个不错的选择Godot 原生库里并没有直接支持Excel读写的类或者功能所以使用外接Python脚本的方式来处理Excel数据。这里通过使用Godot中OS类连接Python脚本OS类是Godot中提供对常见操作系统访问功能的类封装了与主机操作系统通信的最常见功能这里就是使用了Os.execute()向操作系统申请一个新进程然后使用这个进程运行Python脚本同时获得返回值这种处理方式除了本文即将演示实现的Godot账号管理系统外还可以处理玩家存档信息等其他类似的数据本质来说就是处理完后向Godot返回自己规定的返回值比如是或否用来实现逻辑判断以及处理成Godot可以直接处理的文件格式比如Json来间接实现Excel存储本操作系统为Windows10 22H22. 实际实现流程概述1. 完成Python基本功能实现Excel统一读取Excel格式化为字典类型新数据写入Excel登录数据校验注册数据校验等基本功能2. 规定Godot与Python固定传参流程与内容修改Python中已经完成的基本功能返回值3. 临时完成Godot与Python传参测试固定传参流程4. 完成Godot中登录系统AutoLoad中的主要子管理器逻辑完成并测试与Python的正式传输流程是否正确完成完成并固定Python中与Godot交互的主脚本的逻辑函数5. 完成Godot中主管理器的API开放完成对子管理器的调控检查并删除外置所有暴露的AutoLoad变量完成以上流程后就是Godot内其他逻辑比如登录界面的具体实现的问题了本文也会演示。2. Godot外接Python处理Excel总体演示本文Python处理Excel使用的库为openpyxl库详细演示以及处理Excel流程将会在后续文章中演示这里都先演示主程序。这里先给出Python文件结构1. Python程序对接(主程序)Python处理Excel按照特定格式返回Godot后面会解释如何在Godot和Python之间传输消息这里先都先单独演示单独的脚本或者程序代码Python与Godot对接主程序将所有基础功能整合成登录验证与注册验证且返回值全部定为字符串类型的数字例如 0 12。这里规定:0 : 验证通过1 : 校验信息问题(比如账号不存在注册密码长度不够)2 : 账号密码匹配问题(密码错误已被注册)主代码如下#openpyxl库# # 本文用来处理Excel的python的库 # ## from openpyxl.worksheet.worksheet import Worksheet # 以下为子Python脚本引入的处理函数(这里简要解释) from ExcelProcessing import read_from_excel # 返回指定的Excel工作表 from ExcelProcessing import write_new_account # 向Excel写入新账号信息,返回 tuple[bool, int] 元组 from JsonProcessing import convert_excel_to_account # 将Excel中读取的数据转化为固定字典格式 {ID: [password, name]} from JsonProcessing import detect_login_information # 校验登录信息返回 tuple[bool, int] 元组 # Optional 为类型注解标记可以用于规定函数传参传限定类型内的参数如 Optional[int | str] 指参数可以传入 intstrNone类型的 from typing import Optional # 这个是Python用来接收系统传参的类其中 sys.argv 为收到的参数 import sys import os #默认存档名# default_save_exc_name GameDataExcel.xlsx # 手动调用脚本时的Excel路径 default_exc_data_player PlayerData # 默认取打开Excel中的工作表的名字为 PlayerData default_json_out PlayerGameData.json # 存档转化出的Json位置 #默认存档名# #指定参数# # 这里所有的位置都是Godot中传来参数中对应参数的索引 default_order_index: int 2 # 这里是默认从godot获得的参数中取第2位为指令参数 default_excel_path_index: int 1 # 默认Excel位置 default_order_name_index: int 3 # 默认名字位置 default_order_pwd_index: int 4 # 默认密码位置 default_godot_argv_len: int 5 # 默认传参长度 #指定参数# #指定命令# godot_login: str 0 # 指定Godot登录命令为 0 godot_register: str 1 # 指定Godot注册命令为 1 #指定命令# 以下所有函数面向Godot返回 此时Python中print的内容就是Godot接收到的返回值- 全部使用print 返回值说明: - 元组第1位:是否校验通过(True通过,False不通过) - 元组第2位:状态码 - 0 : 账号验证通过 - 1 : 账户信息不存在 - 2 : 账号信息验证错误信息不全/密码错误 # 登录验证器 def login_verify(input_login_info: Optional[list[str]]) - None: if input_login_info is None: return None try: # 得到账户表格 read_sheet read_from_excel(default_save_exc_name, default_exc_data_player) stored_info_dict convert_excel_to_account(read_sheet) # 验证登录信息 verify_result: tuple detect_login_information(stored_info_dict, input_login_info) # 通过验证 print(str(verify_result[1])) except Exception as e: # 登录程序运行失败 print(-1) 账户注册处理 返回-1: 程序运行出错 返回0 : 注册成功 返回1 : 账户注册出现问题(非法字符/账户密码问题) 返回2 : 账户已被注册 # 注册验证器 def register_verify(input_register_info: Optional[list[str]]) - None: if input_register_info is None: return None try: # 验证注册信息并写入 verify_result: tuple write_new_account(default_exc_data_player, default_save_exc_name, input_register_info) print(str(verify_result[1])) except Exception as e: # 注册程序运行失败 print(-1) 返回 -1 为程序运行出错 返回 -2 为程序输入变量不足 # 主函数进入 if __name__ __main__: if len(sys.argv) default_godot_argv_len: # 将Godot传参转至本地 receive_params: list[str] sys.argv godot_order receive_params[default_order_index] # 格式化传参内容 default_save_exc_name receive_params[default_excel_path_index] # 获得收到的Excel地址 input_name receive_params[default_order_name_index] # 获得收到的账号ID input_pwd receive_params[default_order_pwd_index] # 获得收到的密码 input_info: list[str] [input_name, input_pwd] # 登录注册验证请求 if (godot_order godot_login): login_verify(input_info) if (godot_order godot_register): register_verify(input_info) # 参数不够传 -2 else: print(-2)2. Godot对接主程序先给出Godot本项目结构Godot将Python处理完的结果接收用于Godot脚本内处理主AutoLoad代码将会给出主管理器的部分和登录子管理器来演示如何接收和发送Python信息登录系统主管理器extends Node2D # 登录和注册两个子管理器 export var Login : Node2D export var Register : Node2D # 主管理器提供统一 Excel 文件地址这里使用绝对地址当然也可以使用相对Godot的相对地址 # 主管理器同样要提供 Python脚本 的地址下文会说明 var excel_path D:/GodotProject/Godot Excel Spreadsheet/godot-excel-spreadsheet/06_GameData/ServerData/GameDataExcel.xlsx var python_script res://06_GameData/ServerData/FileProcessingMain.py登录系统登录子管理器extends Node2D 注意传输路径 Godot传出去的参数到Python接收全部会被转化为字符串类型 这里给python传入的脚本格式为: [python主脚本地址, str Excel请求路径, int 请求操作, 账户ID 账户密码] 且传递内容全部统一为 str 类型 ## 登录信息验证(阻塞线程运行的时候主程序会暂停) ## 这里的 input_info 传入的是[ID, Password] func login_info_verify(input_info: Array[String]) - String: var receive_return: Array[String] [] # 接收Python的返回值 var transmit_argv: Array [] # Godot传给Python的参数 # 补全玩家输入的信息 while len(input_info) 2: input_info.append(None) ## 转化传输标准格式 ## ProjectSettings.globalize_path()是将Godot的相对文件路径转化为系统路径 var python_path: String ProjectSettings.globalize_path(LoginSystem.get_python_processing_path()) ## 这里是先将传入的参数放进一个数组 ## [Python程序路径, Excel文件路径, Godot人为规定的给Python指令 账户ID 账户密码] transmit_argv [python_path, LoginSystem.excel_path, str(0), input_info[0], input_info[1]] ## 向python传输基本信息 ## 格式 OS.execute(程序运行编译环境(没有会从环境变量自动找) ## 传入参数(第一个是程序路径给Godot找脚本同时也会被作为参数被传过去), ## 用于接收返回值的数组 ## 决定是否接收没被Python收走的异常报错(try 模型收走报错所以不会被接收) ## 如果程序是命令终端类的可以为True打开一个命令终端运行脚本为False则后台静默运行 OS.execute(python, transmit_argv, receive_return, true, true) ## 由于接收为数组需要使用 join 函数将数组拼起来转化为 string 前面 代表每一个元素之间连接为空字符串 ## 由于Python返回值中包含转义符使用strip_escapes()删除所有转义符 var result_output: String .join(receive_return).strip_escapes() # 返回Python处理结果 return result_output3. Python代码层运行测试给出 Excel 已经存储结构然后我们对Python脚本直接运行#主程序末尾加一行 login_verify([10000, 40])可以看到返回 0(-2是因为主程序传参不足的分支导致的)将测试改为不全信息#主程序末尾加一行 login_verify([10000])运行结果:可以看到符合上文返回值要求(账户信息不全)4. Godot软件层运行测试这里是已经写好的系统直接用来演示1. 登录输入账户信息登录得右上角已经显示ID同时提示登录同时跳转到其他界面在信息输入错误下2. 注册这里注册的时候不能打开Excel编辑手动打开Excel会占用文件导致注册失败这里输入新信息注册成功后也会自动跳转到其他界面这里可以看到注册成功跳转页面同上登录跳转这里看Excel可以发现新增信息(这里格式正常的看起来不正常是因为程序第一次放入的问题)同时有非法字符判定(由python判定)3. 开源以及补充文章详细的实现文章如下1. Python脚本处理Excel Godot(4.X): 外接Python处理Excel数据: Python部分-CSDN博客2. Godot中登录系统AutoLoad以及其登录界面演示 Godot(4.X): 外接Python处理Excel数据: Godot全局登录管理器部分-CSDN博客代码开源地址looooiiui/Excel-login-system-made-with-Python-in-Godot: Excel login system made with Python in Godot