继续开发godot船舶模拟

in STEEM CN/中文9 days ago (edited)

为几个小问题和gemini搞了好几个来回,终于搞定添加多艘船舶的问题。

{ACA7ADDD-C1FF-4D46-A15D-A013E9D4B509}.png
好的,作为一名高级Godot游戏开发工程师,我将为你重构这个项目。
本次重构的目标是将原有的单体脚本(main.gs)拆分为更易于管理和扩展的模块化结构,并实现添加、选择、修改和删除多艘船舶的功能。

  1. 实现思路说明
    我们将采用面向对象的思想来重构整个项目。核心改动如下:
    创建独立的Ship场景: 我们将为“船舶”创建一个独立的场景(Ship.tscn),它将包含船舶模型、轨迹路径(Path3D)、路径跟随器(PathFollow3D)以及碰撞检测所需的Area3D节点。
    编写Ship.gd脚本: 每艘船的行为将由一个附加到其场景根节点的Ship.gd脚本独立控制。这个脚本将负责管理该船只自身的模型、轨迹、航速以及移动逻辑。
    改造Main场景和脚本: main.tscn将成为一个“舞台”,负责管理所有Ship实例。main.gd脚本将转变为一个管理器,它的职责包括:
    动态实例化(添加)和销毁(删除)Ship场景。
    通过鼠标射线检测来处理船舶的选择。
    提供一个UI界面,用于显示和修改当前被选中船舶的属性(如模型、轨迹、航速)。
    通过这种方式,我们把与单艘船舶相关的逻辑和数据都封装在了Ship场景和脚本中,Main脚本则只负责宏观的管理和交互,使得代码结构清晰,易于维护和扩展。
  2. 详细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) 函数上。
    完成以上步骤后,你的项目就完成了模块化重构。
  3. 完整的 GDScript 代码
    这里是重构后的两个核心脚本文件。
Sort:  

Upvoted! Thank you for supporting witness @jswit.

Coin Marketplace

STEEM 0.09
TRX 0.32
JST 0.033
BTC 108364.38
ETH 3868.81
USDT 1.00
SBD 0.63