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

Godot中标识符未在当前作用域声明及金币脚本计分功能失效问题求助

问题定位与解决方法

咱们一步步拆解你遇到的问题,其实两个错误是关联的,根源都在脚本的变量声明和全局数据访问上:

1. 「Identifier isn't declared in the current scope」错误原因

这个错误指向两个未正确处理的标识符:

  • score变量缺失:对比你的敌人脚本,人家明确用export var score: = 100定义了计分变量,但金币脚本里完全没声明score,Godot当然找不到这个变量。
  • PlayerData未全局可访问:PlayerData应该是你用来存全局分数的脚本(比如单例),但它要么没被设置为自动加载,要么金币脚本没正确引用,导致Godot识别不了这个标识符。

2. 敌人脚本能正常工作的核心差异

敌人脚本继承了"res://Code/Both Script.gd",这个父脚本应该已经帮你处理了PlayerData的全局引用,再加上敌人自己定义了score变量,所以不会出问题。但金币脚本直接继承Area2D,既没定义score,也没处理PlayerData的访问,自然报错。

具体解决步骤

步骤1:给金币脚本补上score变量

在金币脚本开头添加export修饰的score变量,还能方便你在编辑器里调整分值:

extends Area2D
export var score: int = 50  # 可自行修改金币的基础分值
onready var anim_player: AnimationPlayer = get_node("AnimationPlayer")
# 后续代码保持不变

步骤2:确保PlayerData能全局访问

如果PlayerData是单例脚本(用来存全局游戏数据),把它设为自动加载即可:

  1. 打开Godot的项目设置(Project Settings)
  2. 切换到自动加载(AutoLoad)标签页
  3. 点击添加,选中你的PlayerData.gd脚本,全局名称保持PlayerData即可
  4. 确认启用后,所有脚本都能直接访问PlayerData的属性

如果PlayerData不是单例,就手动在金币脚本里通过节点路径引用:

# 在金币脚本开头添加引用
var player_data: PlayerData = get_node("/root/PlayerData")  # 替换成你的PlayerData实际节点路径
# 然后把计分代码改成:
player_data.Score += score

步骤3:补全金币的销毁逻辑(可选优化)

你的金币脚本只播放了Fade动画,但没在动画结束后销毁节点,可能会导致重复触发计分。可以给AnimationPlayer加个动画结束信号,播放完就销毁:

extends Area2D
export var score: int = 50
onready var anim_player: AnimationPlayer = get_node("AnimationPlayer")

func _ready() -> void:
    # 连接动画结束信号
    anim_player.connect("animation_finished", self, "_on_animation_finished")

func _on_body_entered(body: PhysicsBody2D) -> void:
    picked()

func picked() -> void:
    PlayerData.Score += score
    anim_player.play("Fade")

func _on_animation_finished(anim_name: String) -> void:
    if anim_name == "Fade":
        queue_free()  # 动画播放完成后销毁金币节点

这样修改后,金币脚本应该就能正常实现计分功能,同时解决标识符未声明的错误了。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 14:52:35