【Godot4.4】浅尝Godot中的MVC
概述
基于一个Unity的视频。学习了一下基本的MVC概念,并尝试在Godot中实现了一下。
原始的MVC:
Godot中的MVC:
Model、View和Controller各自应该实现的功能如下:
Model:
- 属性(数据字段)
- 数据存取方法
- 数据更新信号
View:
- 控件节点引用
- UI更新方法
ui_update()
Controller:
- 界面元素信号处理,比如按钮点击等
- 调用View的界面更新方法
在Godot中实现:
Controller //UI界面根节点,空的Control节点
Model //空的Control节点
View //容器或Control节点
其他界面元素
在MainView
中:
- 进行元素的引用
- 编写
ui_update()
方法,参数data
为MainModel
类型
在MainController
中:
- 进行元素的引用
- 放置所有元素的信号处理函数
- 放置
MainModel
的数据更新信号处理函数data_updated()
在MainModel
中:
- 定义所需保存的数据字段
- 定义数据的加载、更新以及保存方法
- 定义
data_updated()
信号
实际测试
通常是一个界面分别对应一个Model、View和Controller。
为了方便管理,建立名为Model、View和Controller的文件夹。
MainView
View
只负责节点引用和实现一个界面更新方法:
# MainView
extends Control
# UI节点引用
@onready var text_edit: TextEdit = %TextEdit
# 界面更新方法
func ui_update(text:String):
text_edit.text = text
MainModel
Model
:
- 设计需要存储的数据字段
- 数据存取方法
- 定义数据更新信号
# MainModel
extends Control
signal data_updated(text:String) # 数据更新信号
# 保存路径
var path:String = ""
# 数据字段
var text:String = ""
# 保存数据
func save_data():
var file = FileAccess.open(path,FileAccess.WRITE)
file.store_string(text)
file.close()
# 加载数据
func load_data():
if FileAccess.file_exists(path):
text = FileAccess.get_file_as_string(path)
emit_signal("data_updated",text) # 触发数据更新信号
MainController
Controller
:
- 将View的所有界面元素信号处理链接到
Controller
- 将Model的数据更新信号处理链接到
Controller
- 其他处理逻辑
# MainController
extends Control
@onready var main_view: Control = %MainView
@onready var main_model: Control = %MainModel
@onready var text_edit: TextEdit = %TextEdit
func _ready() -> void:
main_model.path = "data/mian.txt"
main_model.load_data()
# =============== 所有界面元素的信号处理 ===============
func _on_button_pressed() -> void:
main_model.text = text_edit.text
main_model.save_data()
# MainModel的数据更新信号
func _on_main_model_data_updated(text: String) -> void:
main_view.ui_update(text)
总结
这只是一种粗略的实现和实践。将界面和处理逻辑分开是我之前在实践的事情,可以很好的减少UI场景中的代码。并且让逻辑可以以类的形式存在和复用。
MVC是一种更高层次的设计,将处理逻辑分为逻辑和数据两部分,并巧妙的通过信号和方法调用,完成了“UI交互-逻辑处理-数据存储”和“反向更新UI”的功能。
对MVC的认识和实践有自己的业余性,期望大佬指正错误。