blender 分析
|
| | | | |
|
|
|
| | | |
|
|
| | | | | | | |
|
| |
| | | | | | | |
| |
拖动有关的代码
文件/类 |
功能 |
editor/plugins/node_3d_editor_plugin.cpp |
3D 编辑器主逻辑,管理 Gizmo |
editor/plugins/node_3d_editor_gizmos.cpp |
Gizmo 渲染和交互逻辑 |
scene/3d/node_3d.cpp |
3D节点的变换操作 |
core/math/transform_3d.h |
变换矩阵计算 |
|
新建场景的时候左边的几个节点
editor/scene_tree_dock.cpp
|
菜单编辑:行 7950
editor/editor_node.cpp
|
|
右上角运行工具栏:行 578
editor/gui/editor_run_bar.cpp
|
3d编辑器的代码 行: 9120
editor\plugins\node_3d_editor_plugin.cpp
|
|
启动运行状态:行 269
editor/debugger/editor_debugger_node.cpp
|
游戏调试工具栏:行 1079
editor\plugins\game_view_plugin.cpp
|
|
计划1:
调试状态,看看是否可以单独提取出来用
|
计划2:
能否使用js脚本,或者litegraph脚本
|
|
Godot 中 .gd 文件的编译流程与 ScriptInstance 对象的创建
在 Godot 引擎中,GDScript (.gd) 文件从源代码到可执行的 ScriptInstance 对象的转换过程涉及多个步骤。以下是详细的流程说明:
1. 编译流程概述
- 词法分析 (Lexing):将源代码分解为标记 (tokens)
- 语法分析 (Parsing):根据语法规则构建抽象语法树 (AST)
- 字节码生成:将 AST 转换为虚拟机字节码
- 运行时实例化:创建 ScriptInstance 对象
2. 详细步骤
2.1 词法分析和语法分析
当 Godot 加载一个 .gd 文件时:
- 首先通过
GDScriptParser 类进行解析
- 生成抽象语法树 (AST) 表示脚本结构
2.2 字节码编译
解析完成后:
GDScriptCompiler 类将 AST 转换为字节码
- 字节码是为 Godot 的虚拟机 (GDScript VM) 设计的中间表示
- 编译过程包括:
2.3 创建 Script 资源
编译完成后:
- 生成
GDScript 资源对象(继承自 Script 类)
- 这个对象包含:
- 字节码
- 符号表(变量、函数、信号等)
- 继承关系信息
- 其他元数据
2.4 实例化为 ScriptInstance
当脚本附加到节点或需要实例化时:
创建脚本实例:
Ref<Script> script = ResourceLoader::load("res://example.gd");
Object *obj = ClassDB::instance("Node"); // 或其他类
obj->set_script(script);
内部实例化过程:
- 引擎调用
Script::instance_create() 方法
GDScript 类重写此方法,创建 GDScriptInstance 对象
GDScriptInstance 继承自 ScriptInstance 类
实例初始化:
- 为实例变量分配内存
- 设置基类(如果脚本继承自另一个脚本)
- 调用
_init() 方法(如果存在)
3. 关键数据结构
- GDScript:表示编译后的脚本资源
- GDScriptInstance:脚本的运行时实例
- 管理实例变量
- 处理方法调用
- 维护与宿主 Object 的关系
4. 执行模型
当调用脚本方法或访问属性时:
GDScriptInstance 接收调用
- 查找方法或属性
- 如果是字节码方法,由 GDScript VM 执行
- 如果是原生方法,直接调用绑定方法
5. 性能考虑
- 首次加载脚本时有编译开销
- 后续实例化速度较快(因为字节码已生成)
- 方法调用比原生 C++ 方法稍慢(由于虚拟机开销)
|
1. Godot 脚本的运行原理
Godot 的脚本系统通过 ScriptServer 管理多种脚本语言(如 GDScript、C#、Python 等),并在游戏运行时动态调用脚本逻辑。核心流程如下:
脚本加载与实例化
- 当场景加载时,Godot 会解析附加到节点的脚本(如
.gd 文件),并将其编译为 ScriptInstance 对象。
- 脚本的
_init() 或 _ready() 方法会在节点初始化时自动调用。
主循环与脚本执行
- Godot 的主循环(
Main::iteration )每秒执行多次,负责更新游戏状态、物理模拟和脚本逻辑。
- 脚本中的
_process(delta) 和 _physics_process(delta) 方法会被引擎在每一帧或物理步长时调用。
脚本与节点绑定
- GDScript 可以直接通过
$NodePath 语法访问场景树中的节点,而 Python 需要通过 GDNative 接口间接操作。
|
|
|
|
|
|
|
|
block_code 绘制背景: 行 254
addons\block_code\ui\blocks\utilities\background\background.gd
| | | | | | | | | |
| | | | | | | | |
| | | | | | | | | | | | |
|
| | |
|
| | | |
|
|
| | | | | |
|
| | |
| | | |
|
|
| | | | | |
AI绘图
|
|
|
| | | | | |
|
|
|
| | | |
| | | |