You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从运行时新建的GDScript直接实现继承?

解决运行时动态脚本的继承问题

你的问题核心在于内存中创建的GDScript对象没有磁盘路径,所以resource_path返回空字符串,无法通过路径实现继承。以下是两种可行的解决方案:

方法一:通过全局类名实现继承

给动态创建的脚本添加class_name定义,让它成为全局可访问的类,另一脚本直接通过类名继承即可:

extends Node2D

func _ready():
    # 创建脚本A并定义全局类名
    var script_A = GDScript.new()
    script_A.source_code = "extends Node2D\nclass_name DynamicScriptA"
    script_A.reload()
    
    # 脚本B直接继承全局类名
    var script_B = GDScript.new()
    script_B.source_code = "extends DynamicScriptA"
    script_B.reload()
    
    # 测试使用脚本B
    var new_node = Node2D.new()
    new_node.set_script(script_B)
    add_child(new_node)

这种方法简单直观,只需注意自定义类名不与项目中现有全局类冲突即可。

方法二:手动设置脚本基类对象

如果不想使用全局类,可以直接通过set_base()方法指定脚本B的基类为脚本A,无需在源码中写extends语句:

extends Node2D

func _ready():
    var script_A = GDScript.new()
    script_A.source_code = "extends Node2D"
    script_A.reload()
    
    var script_B = GDScript.new()
    # 脚本B只需写自定义逻辑,基类通过代码设置
    script_B.source_code = "func _process(delta): print('脚本B的逻辑')"
    script_B.set_base(script_A)
    script_B.reload()
    
    var new_node = Node2D.new()
    new_node.set_script(script_B)
    add_child(new_node)

这种方法避免了全局类名冲突,更适合动态生成大量临时脚本的场景。

注意:两种方法都需要确保脚本A先完成reload(),再被脚本B引用或设置为基类。

内容的提问来源于stack exchange,提问作者cak3_lover

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 05:00:05