继续开发godot船舶模拟
为几个小问题和gemini搞了好几个来回,终于搞定添加多艘船舶的问题。
好的,作为一名高级Godot游戏开发工程师,我将为你重构这个项目。
本次重构的目标是将原有的单体脚本(main.gs)拆分为更易于管理和扩展的模块化结构,并实现添加、选择、修改和删除多艘船舶的功能。
- 实现思路说明
我们将采用面向对象的思想来重构整个项目。核心改动如下:
创建独立的Ship场景: 我们将为“船舶”创建一个独立的场景(Ship.tscn),它将包含船舶模型、轨迹路径(Path3D)、路径跟随器(PathFollow3D)以及碰撞检测所需的Area3D节点。
编写Ship.gd脚本: 每艘船的行为将由一个附加到其场景根节点的Ship.gd脚本独立控制。这个脚本将负责管理该船只自身的模型、轨迹、航速以及移动逻辑。
改造Main场景和脚本: main.tscn将成为一个“舞台”,负责管理所有Ship实例。main.gd脚本将转变为一个管理器,它的职责包括:
动态实例化(添加)和销毁(删除)Ship场景。
通过鼠标射线检测来处理船舶的选择。
提供一个UI界面,用于显示和修改当前被选中船舶的属性(如模型、轨迹、航速)。
通过这种方式,我们把与单艘船舶相关的逻辑和数据都封装在了Ship场景和脚本中,Main脚本则只负责宏观的管理和交互,使得代码结构清晰,易于维护和扩展。 - 详细Godot操作步骤
请严格按照以下步骤操作,以确保项目结构正确。
步骤一:创建模块化的 Ship 场景
新建场景: 在Godot编辑器中,点击菜单“场景” -> “新建场景”。
设置根节点:
在“场景”面板中,点击“其他节点”。
搜索并选择 PathFollow3D 节点,点击“创建”。
将该根节点重命名为 Ship。
添加子节点:
轨迹路径: 右键点击 Ship 节点,添加子节点 Path3D,并将其重命名为 Trajectory。这是控制船舶移动的路径。
模型容器: 右键点击 Ship 节点,添加子节点 Node3D,并将其重命名为 ModelContainer。我们之后会把glb模型实例化并放在这里。
可选-路径可视化: 右键点击 Trajectory 节点,添加子节点 MeshInstance3D,并命名为 PathVisualizer。用于在场景中画出轨迹线。
选择功能:
右键点击 Ship 节点,添加子节点 Area3D。
右键点击 Area3D,添加子节点 CollisionShape3D。
重要:在场景树中选中Area3D节点,在右侧的“信号”面板中,双击 input_event 信号。在弹出的窗口中,选择 Ship 节点,方法名保持默认的 _on_area_3d_input_event,然后点击“连接”。这用于后续实现鼠标点击选择功能。
保存场景: 将此场景保存为 ship.tscn。
步骤二:创建 Ship.gd 脚本
附加脚本: 在场景树中选中根节点 Ship,然后在右侧的“检查器”面板中,点击“脚本”属性旁的 [空],选择“新建脚本”。
设置脚本: 语言选择GDScript,继承自 PathFollow3D,路径保持默认即可。点击“创建”。
编写代码: 将下面的 ship.gd 代码完整地复制并粘贴到脚本编辑器中。
步骤三:修改 Main 场景
打开主场景: 打开你原来的主场景文件(可能名为 main.tscn)。
清理旧节点: 从场景树中删除以下旧节点,因为它们的功能已经被集成到Ship场景中了:
ShipTrajectory (Path3D)
PathVisualizer (MeshInstance3D)
创建容器: 右键点击主场景的根节点(Node3D),添加一个子节点 Node3D,并将其重命名为 ShipsContainer。未来所有实例化的船舶都将存放在这里。
步骤四:重构 main.gd 脚本
打开主脚本: 选中主场景的根节点,打开其附加的脚本 main.gd。
替换代码: 完全删除旧的 main.gd 脚本中的所有代码,然后将下面提供的新的 main.gd 代码完整地复制并粘贴进去。
步骤五:连接UI信号
你的UI(SelectionDialog)需要被改造以控制船舶的添加和修改。新的 main.gd 脚本已经定义了对应的函数,你只需要:
添加船舶按钮: 在你的主UI中(可以在SelectionDialog之外,或者之内),添加一个新的 Button 节点,将其文本(Text)设置为“添加新船”。
删除船舶按钮: 添加另一个 Button 节点,文本设置为“删除选中船舶”。
连接信号:
将“添加新船”按钮的 pressed() 信号连接到 main.gd 脚本的 _on_add_ship_pressed() 函数上。
将“删除选中船舶”按钮的 pressed() 信号连接到 main.gd 脚本的 _on_delete_ship_pressed() 函数上。
你的 SelectionDialog 中原有的“确认”按钮(ConfirmButton),将其 pressed() 信号连接到 main.gd 脚本的 _on_confirm_changes_pressed() 函数上。
你可以添加一个 HSlider 来控制航速,将其 value_changed(value) 信号连接到 _on_speed_slider_changed(value) 函数上。
完成以上步骤后,你的项目就完成了模块化重构。 - 完整的 GDScript 代码
这里是重构后的两个核心脚本文件。
Upvoted! Thank you for supporting witness @jswit.