前言: 本文是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 22H2

        2. 实际实现流程概述

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", "1","2"。

这里规定: "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] 指参数可以传入 int,str,None类型的  
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_output

        3. 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

更多推荐